1
0
mirror of https://github.com/peeringdb/peeringdb.git synced 2024-05-11 05:55:09 +00:00
Files
peeringdb-peeringdb/peeringdb_server/deskpro.py

196 lines
5.1 KiB
Python
Raw Normal View History

2018-11-08 19:45:21 +00:00
"""
DeskPro API Client
"""
import re
import requests
from django.template import loader
from django.conf import settings
from peeringdb_server.models import DeskProTicket
from peeringdb_server.inet import RdapNotFoundError
def ticket_queue(subject, body, user):
""" queue a deskpro ticket for creation """
2019-12-05 16:57:52 +00:00
ticket = DeskProTicket.objects.create(
subject=u"{}{}".format(settings.EMAIL_SUBJECT_PREFIX, subject),
body=body,
user=user,
)
2018-11-08 19:45:21 +00:00
class APIError(IOError):
def __init__(self, msg, data):
super(APIError, self).__init__(msg)
self.data = data
def ticket_queue_asnauto_skipvq(user, org, net, rir_data):
"""
queue deskro ticket creation for asn automation action: skip vq
"""
if isinstance(net, dict):
net_name = net.get("name")
else:
net_name = net.name
if isinstance(org, dict):
org_name = org.get("name")
else:
org_name = org.name
2019-12-05 16:57:52 +00:00
ticket_queue(
"[ASNAUTO] Network '%s' approved for existing Org '%s'" % (net_name, org_name),
loader.get_template("email/notify-pdb-admin-asnauto-skipvq.txt").render(
{"user": user, "org": org, "net": net, "rir_data": rir_data}
),
user,
)
2018-11-08 19:45:21 +00:00
def ticket_queue_asnauto_affil(user, org, net, rir_data):
"""
queue deskro ticket creation for asn automation action: affil
"""
ticket_queue(
2019-12-05 16:57:52 +00:00
"[ASNAUTO] Ownership claim granted to Org '%s' for user '%s'"
% (org.name, user.username),
loader.get_template("email/notify-pdb-admin-asnauto-affil.txt").render(
{"user": user, "org": org, "net": net, "rir_data": rir_data}
),
user,
)
def ticket_queue_asnauto_create(
user, org, net, rir_data, asn, org_created=False, net_created=False
):
2018-11-08 19:45:21 +00:00
"""
queue deskro ticket creation for asn automation action: create
"""
subject = []
if org_created:
subject.append("Organization '%s'" % org.name)
if net_created:
subject.append("Network '%s'" % net.name)
if not subject:
return
subject = ", ".join(subject)
ticket_queue(
"[ASNAUTO] %s created" % subject,
loader.get_template(
2019-12-05 16:57:52 +00:00
"email/notify-pdb-admin-asnauto-entity-creation.txt"
).render(
{
2018-11-08 19:45:21 +00:00
"user": user,
"org": org,
"net": net,
"asn": asn,
"org_created": org_created,
"net_created": net_created,
2019-12-05 16:57:52 +00:00
"rir_data": rir_data,
}
),
user,
)
2018-11-08 19:45:21 +00:00
def ticket_queue_rdap_error(user, asn, error):
if isinstance(error, RdapNotFoundError):
return
error_message = "{}".format(error)
if re.match("(.+) returned 400", error_message):
return
subject = "[RDAP_ERR] {} - AS{}".format(user.username, asn)
ticket_queue(
subject,
2019-12-05 16:57:52 +00:00
loader.get_template("email/notify-pdb-admin-rdap-error.txt").render(
{"user": user, "asn": asn, "error_details": error_message}
),
user,
)
2018-11-08 19:45:21 +00:00
class APIClient(object):
def __init__(self, url, key):
self.key = key
self.url = url
@property
def auth_headers(self):
return {"Authorization": "key {}".format(self.key)}
def parse_response(self, response, many=False):
r_json = response.json()
if "status" in r_json:
if r_json["status"] >= 400:
raise APIError(r_json["message"], r_json)
else:
response.raise_for_status()
data = r_json["data"]
if isinstance(data, list):
if many:
return r_json["data"]
elif data:
return data[0]
else:
return data
def get(self, endpoint, param):
2019-12-05 16:57:52 +00:00
response = requests.get(
"{}/{}".format(self.url, endpoint), params=param, headers=self.auth_headers
)
2018-11-08 19:45:21 +00:00
return self.parse_response(response)
def create(self, endpoint, param):
2019-12-05 16:57:52 +00:00
response = requests.post(
"{}/{}".format(self.url, endpoint), json=param, headers=self.auth_headers
)
2018-11-08 19:45:21 +00:00
return self.parse_response(response)
def require_person(self, user):
person = self.get("people", {"primary_email": user.email})
if not person:
person = self.create(
2019-12-05 16:57:52 +00:00
"people",
{
2018-11-08 19:45:21 +00:00
"primary_email": user.email,
"first_name": user.first_name,
"last_name": user.last_name,
2019-12-05 16:57:52 +00:00
"name": user.full_name,
},
)
2018-11-08 19:45:21 +00:00
return person
def create_ticket(self, ticket):
person = self.require_person(ticket.user)
ticket_response = self.create(
2019-12-05 16:57:52 +00:00
"tickets",
{
2018-11-08 19:45:21 +00:00
"subject": ticket.subject,
2019-12-05 16:57:52 +00:00
"person": {"id": person["id"]},
"status": "awaiting_agent",
},
)
2018-11-08 19:45:21 +00:00
self.create(
2019-12-05 16:57:52 +00:00
"tickets/{}/messages".format(ticket_response["id"]),
{
2018-11-08 19:45:21 +00:00
"message": ticket.body.replace("\n", "<br />\n"),
"person": person["id"],
2019-12-05 16:57:52 +00:00
"format": "html",
},
)