mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	After discovering a couple of bugs, I decided to thoroughly test and rewrite this integration from scratch. The older code wasn't generating coherent messages. This also commit gets this integration up to 100% test coverage.
		
			
				
	
	
		
			64 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from typing import Any, Dict, List
 | 
						|
 | 
						|
from django.http import HttpRequest, HttpResponse
 | 
						|
from django.utils.translation import ugettext as _
 | 
						|
 | 
						|
from zerver.decorator import api_key_only_webhook_view
 | 
						|
from zerver.lib.request import REQ, has_request_variables
 | 
						|
from zerver.lib.response import json_error, json_success
 | 
						|
from zerver.lib.webhooks.common import check_send_webhook_message
 | 
						|
from zerver.models import UserProfile
 | 
						|
 | 
						|
 | 
						|
IS_AWAITING_SIGNATURE = "is awaiting the signature of {awaiting_recipients}"
 | 
						|
WAS_JUST_SIGNED_BY = "was just signed by {signed_recipients}"
 | 
						|
BODY = "The `{contract_title}` document {actions}."
 | 
						|
 | 
						|
def get_message_body(payload: Dict[str, Dict[str, Any]]) -> str:
 | 
						|
    contract_title = payload['signature_request']['title']
 | 
						|
    recipients = {}  # type: Dict[str, List[str]]
 | 
						|
    signatures = payload['signature_request']['signatures']
 | 
						|
 | 
						|
    for signature in signatures:
 | 
						|
        recipients.setdefault(signature['status_code'], [])
 | 
						|
        recipients[signature['status_code']].append(signature['signer_name'])
 | 
						|
 | 
						|
    recipients_text = ""
 | 
						|
    if recipients.get('awaiting_signature'):
 | 
						|
        recipients_text += IS_AWAITING_SIGNATURE.format(
 | 
						|
            awaiting_recipients=get_recipients_text(recipients['awaiting_signature'])
 | 
						|
        )
 | 
						|
 | 
						|
    if recipients.get('signed'):
 | 
						|
        text = WAS_JUST_SIGNED_BY.format(
 | 
						|
            signed_recipients=get_recipients_text(recipients['signed'])
 | 
						|
        )
 | 
						|
 | 
						|
        if recipients_text:
 | 
						|
            recipients_text = "{}, and {}".format(recipients_text, text)
 | 
						|
        else:
 | 
						|
            recipients_text = text
 | 
						|
 | 
						|
    return BODY.format(contract_title=contract_title,
 | 
						|
                       actions=recipients_text).strip()
 | 
						|
 | 
						|
def get_recipients_text(recipients: List[str]) -> str:
 | 
						|
    recipients_text = ""
 | 
						|
    if len(recipients) == 1:
 | 
						|
        recipients_text = "{}".format(*recipients)
 | 
						|
    else:
 | 
						|
        for recipient in recipients[:-1]:
 | 
						|
            recipients_text += "{}, ".format(recipient)
 | 
						|
        recipients_text += "and {}".format(recipients[-1])
 | 
						|
 | 
						|
    return recipients_text
 | 
						|
 | 
						|
@api_key_only_webhook_view('HelloSign')
 | 
						|
@has_request_variables
 | 
						|
def api_hellosign_webhook(request: HttpRequest, user_profile: UserProfile,
 | 
						|
                          payload: Dict[str, Dict[str, Any]]=REQ(argument_type='body')) -> HttpResponse:
 | 
						|
    body = get_message_body(payload)
 | 
						|
    topic = payload['signature_request']['title']
 | 
						|
    check_send_webhook_message(request, user_profile, topic, body)
 | 
						|
    return json_success()
 |