mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-13 08:42:21 -05:00
151 lines
4.6 KiB
Python
151 lines
4.6 KiB
Python
|
|
import requests
|
||
|
|
from flask import current_app
|
||
|
|
|
||
|
|
|
||
|
|
class ZendeskError(Exception):
|
||
|
|
def __init__(self, response):
|
||
|
|
self.response = response
|
||
|
|
|
||
|
|
|
||
|
|
class ZendeskClient:
|
||
|
|
# the account used to authenticate with. If no requester is provided, the ticket will come from this account.
|
||
|
|
NOTIFY_ZENDESK_EMAIL = "zd-api-notify@digital.cabinet-office.gov.uk"
|
||
|
|
|
||
|
|
ZENDESK_TICKET_URL = "https://govuk.zendesk.com/api/v2/tickets.json"
|
||
|
|
|
||
|
|
def __init__(self):
|
||
|
|
self.api_key = None
|
||
|
|
|
||
|
|
def init_app(self, app, *args, **kwargs):
|
||
|
|
self.api_key = app.config.get("ZENDESK_API_KEY")
|
||
|
|
|
||
|
|
def send_ticket_to_zendesk(self, ticket):
|
||
|
|
response = requests.post(
|
||
|
|
self.ZENDESK_TICKET_URL,
|
||
|
|
json=ticket.request_data,
|
||
|
|
auth=(f"{self.NOTIFY_ZENDESK_EMAIL}/token", self.api_key),
|
||
|
|
)
|
||
|
|
|
||
|
|
if response.status_code != 201:
|
||
|
|
current_app.logger.error(
|
||
|
|
f"Zendesk create ticket request failed with {response.status_code} '{response.json()}'"
|
||
|
|
)
|
||
|
|
raise ZendeskError(response)
|
||
|
|
|
||
|
|
ticket_id = response.json()["ticket"]["id"]
|
||
|
|
|
||
|
|
current_app.logger.info(f"Zendesk create ticket {ticket_id} succeeded")
|
||
|
|
|
||
|
|
|
||
|
|
class NotifySupportTicket:
|
||
|
|
PRIORITY_URGENT = "urgent"
|
||
|
|
PRIORITY_HIGH = "high"
|
||
|
|
PRIORITY_NORMAL = "normal"
|
||
|
|
PRIORITY_LOW = "low"
|
||
|
|
|
||
|
|
TAGS_P2 = "govuk_notify_support"
|
||
|
|
TAGS_P1 = "govuk_notify_emergency"
|
||
|
|
|
||
|
|
TYPE_PROBLEM = "problem"
|
||
|
|
TYPE_INCIDENT = "incident"
|
||
|
|
TYPE_QUESTION = "question"
|
||
|
|
TYPE_TASK = "task"
|
||
|
|
|
||
|
|
# Group: 3rd Line--Notify Support
|
||
|
|
NOTIFY_GROUP_ID = 360000036529
|
||
|
|
# Organization: GDS
|
||
|
|
NOTIFY_ORG_ID = 21891972
|
||
|
|
NOTIFY_TICKET_FORM_ID = 1900000284794
|
||
|
|
|
||
|
|
def __init__(
|
||
|
|
self,
|
||
|
|
subject,
|
||
|
|
message,
|
||
|
|
ticket_type,
|
||
|
|
p1=False,
|
||
|
|
user_name=None,
|
||
|
|
user_email=None,
|
||
|
|
requester_sees_message_content=True,
|
||
|
|
technical_ticket=False,
|
||
|
|
ticket_categories=None,
|
||
|
|
org_id=None,
|
||
|
|
org_type=None,
|
||
|
|
service_id=None,
|
||
|
|
email_ccs=None,
|
||
|
|
):
|
||
|
|
self.subject = subject
|
||
|
|
self.message = message
|
||
|
|
self.ticket_type = ticket_type
|
||
|
|
self.p1 = p1
|
||
|
|
self.user_name = user_name
|
||
|
|
self.user_email = user_email
|
||
|
|
self.requester_sees_message_content = requester_sees_message_content
|
||
|
|
self.technical_ticket = technical_ticket
|
||
|
|
self.ticket_categories = ticket_categories or []
|
||
|
|
self.org_id = org_id
|
||
|
|
self.org_type = org_type
|
||
|
|
self.service_id = service_id
|
||
|
|
self.email_ccs = email_ccs
|
||
|
|
|
||
|
|
@property
|
||
|
|
def request_data(self):
|
||
|
|
data = {
|
||
|
|
"ticket": {
|
||
|
|
"subject": self.subject,
|
||
|
|
"comment": {
|
||
|
|
"body": self.message,
|
||
|
|
"public": self.requester_sees_message_content,
|
||
|
|
},
|
||
|
|
"group_id": self.NOTIFY_GROUP_ID,
|
||
|
|
"organization_id": self.NOTIFY_ORG_ID,
|
||
|
|
"ticket_form_id": self.NOTIFY_TICKET_FORM_ID,
|
||
|
|
"priority": self.PRIORITY_URGENT if self.p1 else self.PRIORITY_NORMAL,
|
||
|
|
"tags": [self.TAGS_P1 if self.p1 else self.TAGS_P2],
|
||
|
|
"type": self.ticket_type,
|
||
|
|
"custom_fields": self._get_custom_fields(),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if self.email_ccs:
|
||
|
|
data["ticket"]["email_ccs"] = [
|
||
|
|
{"user_email": email, "action": "put"} for email in self.email_ccs
|
||
|
|
]
|
||
|
|
|
||
|
|
# if no requester provided, then the call came from within Notify 👻
|
||
|
|
if self.user_email:
|
||
|
|
data["ticket"]["requester"] = {
|
||
|
|
"email": self.user_email,
|
||
|
|
"name": self.user_name or "(no name supplied)",
|
||
|
|
}
|
||
|
|
|
||
|
|
return data
|
||
|
|
|
||
|
|
def _get_custom_fields(self):
|
||
|
|
technical_ticket_tag = (
|
||
|
|
f'notify_ticket_type_{"" if self.technical_ticket else "non_"}technical'
|
||
|
|
)
|
||
|
|
org_type_tag = f"notify_org_type_{self.org_type}" if self.org_type else None
|
||
|
|
|
||
|
|
return [
|
||
|
|
{
|
||
|
|
"id": "1900000744994",
|
||
|
|
"value": technical_ticket_tag,
|
||
|
|
}, # Notify Ticket type field
|
||
|
|
{
|
||
|
|
"id": "360022836500",
|
||
|
|
"value": self.ticket_categories,
|
||
|
|
}, # Notify Ticket category field
|
||
|
|
{
|
||
|
|
"id": "360022943959",
|
||
|
|
"value": self.org_id,
|
||
|
|
}, # Notify Organisation ID field
|
||
|
|
{
|
||
|
|
"id": "360022943979",
|
||
|
|
"value": org_type_tag,
|
||
|
|
}, # Notify Organisation type field
|
||
|
|
{
|
||
|
|
"id": "1900000745014",
|
||
|
|
"value": self.service_id,
|
||
|
|
}, # Notify Service ID field
|
||
|
|
]
|