mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			106 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Webhooks for external integrations.
 | 
						|
from typing import Any, Dict, Optional
 | 
						|
 | 
						|
from django.http import HttpRequest, HttpResponse
 | 
						|
from django.utils.translation import ugettext as _
 | 
						|
 | 
						|
import logging
 | 
						|
 | 
						|
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, \
 | 
						|
    validate_extract_webhook_http_header
 | 
						|
from zerver.models import UserProfile
 | 
						|
 | 
						|
def ticket_started_body(payload: Dict[str, Any]) -> str:
 | 
						|
    body = u'New ticket from {customer_name}'
 | 
						|
    body += u"\n```quote\n**[Ticket #{number}: {title}]({app_url})**\n{summary}\n```"
 | 
						|
    return body.format(**payload)
 | 
						|
 | 
						|
def ticket_assigned_body(payload: Dict[str, Any]) -> Optional[str]:
 | 
						|
    # Take the state, assignee, and assigned group from the payload.
 | 
						|
    state = payload['state']
 | 
						|
    assignee = payload['assignee']
 | 
						|
    assigned_group = payload['assigned_group']
 | 
						|
 | 
						|
    # There are three states on a ticket: opened,
 | 
						|
    # pending, and closed. This creates the message
 | 
						|
    # based on the state of the ticket.
 | 
						|
    if state == "opened":
 | 
						|
        body = u"An open ticket has been assigned to"
 | 
						|
    else:
 | 
						|
        body = u"A {state} ticket has been assigned to"
 | 
						|
 | 
						|
    # If there is a person and/or a group assigned,
 | 
						|
    # make a notification message. Otherwise, ignore it.
 | 
						|
    if assignee or assigned_group:
 | 
						|
        if assignee and assigned_group:
 | 
						|
            body += u" {assignee} from {assigned_group}"
 | 
						|
        elif assignee:
 | 
						|
            body += u" {assignee}"
 | 
						|
        elif assigned_group:
 | 
						|
            body += u" {assigned_group}"
 | 
						|
        body += u"\n```quote\n**[Ticket #{number}: {title}]({app_url})**\n```"
 | 
						|
        return body.format(**payload)
 | 
						|
    else:
 | 
						|
        return None
 | 
						|
 | 
						|
def agent_replied_body(payload: Dict[str, Any]) -> str:
 | 
						|
    # Take the agent's email and the ticket number from the payload.
 | 
						|
    agent = payload['links']['author']['href'].split("http://api.groovehq.com/v1/agents/")[1]
 | 
						|
    number = payload['links']['ticket']['href'].split("http://api.groovehq.com/v1/tickets/")[1]
 | 
						|
 | 
						|
    # Create the notification message.
 | 
						|
    body = u"%s has just replied to a ticket\n```quote\n**[Ticket #%s]" % (agent, number)
 | 
						|
    body += u"({app_ticket_url})**\n{plain_text_body}\n```"
 | 
						|
    return body.format(**payload)
 | 
						|
 | 
						|
def customer_replied_body(payload: Dict[str, Any]) -> str:
 | 
						|
    # Take the customer's email and the ticket number from the payload.
 | 
						|
    customer = payload['links']['author']['href'].split("http://api.groovehq.com/v1/customers/")[1]
 | 
						|
    number = payload['links']['ticket']['href'].split("http://api.groovehq.com/v1/tickets/")[1]
 | 
						|
 | 
						|
    # Create the notification message.
 | 
						|
    body = u"%s has just replied to a ticket\n```quote\n**[Ticket #%s]" % (customer, number)
 | 
						|
    body += u"({app_ticket_url})**\n{plain_text_body}\n```"
 | 
						|
    return body.format(**payload)
 | 
						|
 | 
						|
def note_added_body(payload: Dict[str, Any]) -> str:
 | 
						|
    # Take the agent's email and the ticket number from the payload.
 | 
						|
    agent = payload['links']['author']['href'].split("http://api.groovehq.com/v1/agents/")[1]
 | 
						|
    number = payload['links']['ticket']['href'].split("http://api.groovehq.com/v1/tickets/")[1]
 | 
						|
 | 
						|
    # Create the notification message.
 | 
						|
    body = u"%s has left a note\n```quote\n**[Ticket #%s]" % (agent, number)
 | 
						|
    body += u"({app_ticket_url})**\n{plain_text_body}\n```"
 | 
						|
    return body.format(**payload)
 | 
						|
 | 
						|
@api_key_only_webhook_view('Groove')
 | 
						|
@has_request_variables
 | 
						|
def api_groove_webhook(request: HttpRequest, user_profile: UserProfile,
 | 
						|
                       payload: Dict[str, Any]=REQ(argument_type='body')) -> HttpResponse:
 | 
						|
    event = validate_extract_webhook_http_header(request, 'X_GROOVE_EVENT', 'Groove')
 | 
						|
 | 
						|
    # We listen to several events that are used for notifications.
 | 
						|
    # Other events are ignored.
 | 
						|
    if event in EVENTS_FUNCTION_MAPPER:
 | 
						|
        try:
 | 
						|
            body = EVENTS_FUNCTION_MAPPER[event](payload)
 | 
						|
        except KeyError as e:
 | 
						|
            logging.error('Required key not found : ' + e.args[0])
 | 
						|
            return json_error(_('Missing required data'))
 | 
						|
        if body is not None:
 | 
						|
            topic = 'notifications'
 | 
						|
            check_send_webhook_message(request, user_profile, topic, body)
 | 
						|
 | 
						|
    return json_success()
 | 
						|
 | 
						|
EVENTS_FUNCTION_MAPPER = {
 | 
						|
    'ticket_started': ticket_started_body,
 | 
						|
    'ticket_assigned': ticket_assigned_body,
 | 
						|
    'agent_replied': agent_replied_body,
 | 
						|
    'customer_replied': customer_replied_body,
 | 
						|
    'note_added': note_added_body
 | 
						|
}
 |