Rig up ticket webhooks

This commit is contained in:
Drew DeVault 2019-06-10 15:46:32 -04:00
parent ae2797dd8d
commit 2368339664
3 changed files with 64 additions and 3 deletions

View File

@ -11,6 +11,7 @@ from grp import getgrnam
from todosrht.access import get_tracker, get_ticket
from todosrht.types import TicketAccess, TicketResolution, Tracker, Ticket, User
from todosrht.tickets import submit_ticket, add_comment
from todosrht.webhooks import UserWebhook, TrackerWebhook, TicketWebhook
from srht.validation import Validation
import asyncio
import email
@ -104,6 +105,12 @@ class MailHandler:
return "550 " + ", ".join([e["reason"] for e in valid.errors])
ticket = submit_ticket(tracker, sender, title, desc)
UserWebhook.deliver(UserWebhook.Events.ticket_create,
ticket.to_dict(),
UserWebhook.Subscription.user_id == sender.id)
TrackerWebhook.deliver(TrackerWebhook.Events.ticket_create,
ticket.to_dict(),
TrackerWebhook.Subscription.tracker_id == tracker.id)
print(f"Created ticket {ticket.ref()}")
return "250 Message accepted for delivery"
@ -136,6 +143,9 @@ class MailHandler:
event = add_comment(sender, ticket, text=body,
resolution=resolution, resolve=resolve, reopen=reopen)
TicketWebhook.deliver(TicketWebhook.Events.event_create,
event.to_dict(),
TicketWebhook.Subscription.ticket_id == ticket.id)
print(f"Added comment to {ticket.ref()}")
return "250 Message accepted for delivery"

View File

@ -8,6 +8,7 @@ from todosrht.tickets import submit_ticket, add_comment
from todosrht.blueprints.api import get_user
from todosrht.types import Ticket, TicketAccess, TicketStatus, TicketResolution
from todosrht.types import Event, EventType, Label, TicketLabel
from todosrht.webhooks import TrackerWebhook, TicketWebhook
tickets = Blueprint("api.tickets", __name__)
@ -72,6 +73,31 @@ def tracker_ticket_by_id_GET(username, tracker_name, ticket_id):
abort(401)
return ticket.to_dict()
def _webhook_filters(query, username, tracker_name, ticket_id):
user = get_user(username)
tracker, _ = get_tracker(user, tracker_name, user=current_token.user)
if not tracker:
abort(404)
ticket, access = get_ticket(tracker, ticket_id, user=current_token.user)
if not TicketAccess.browse in access:
abort(401)
return query.filter(TicketWebhook.Subscription.ticket_id == ticket.id)
def _webhook_create(sub, valid, username, tracker_name, ticket_id):
user = get_user(username)
tracker, _ = get_tracker(user, tracker_name, user=current_token.user)
if not tracker:
abort(404)
ticket, access = get_ticket(tracker, ticket_id, user=current_token.user)
if not TicketAccess.browse in access:
abort(401)
sub.ticket_id = ticket.id
return sub
TicketWebhook.api_routes(tickets,
"/api/user/<username>/trackers/<tracker_name>/tickets/<ticket_id>",
filters=_webhook_filters, create=_webhook_create)
@tickets.route("/api/user/<username>/trackers/<tracker_name>/tickets/<ticket_id>",
methods=["PUT"])
@tickets.route("/api/trackers/<tracker_name>/tickets/<ticket_id>",
@ -130,6 +156,10 @@ def tracker_ticket_by_id_PUT(username, tracker_name, ticket_id):
event.ticket_id = ticket.id
event.label_id = label.id
db.session.add(event)
db.session.flush()
TicketWebhook.deliver(TicketWebhook.Events.event_create,
event.to_dict(),
TicketWebhook.Subscription.ticket_id == ticket.id)
events.append(event)
for name in to_add:
label = (Label.query
@ -147,6 +177,10 @@ def tracker_ticket_by_id_PUT(username, tracker_name, ticket_id):
event.ticket_id = ticket.id
event.label_id = label.id
db.session.add(event)
db.session.flush()
TicketWebhook.deliver(TicketWebhook.Events.event_create,
event.to_dict(),
TicketWebhook.Subscription.ticket_id == ticket.id)
events.append(event)
if not valid.ok:
return valid.response
@ -158,8 +192,14 @@ def tracker_ticket_by_id_PUT(username, tracker_name, ticket_id):
abort(401)
if comment or resolve or resolution or reopen:
events.append(add_comment(
user, ticket, comment, resolve, resolution, reopen))
event = add_comment(
user, ticket, comment, resolve, resolution, reopen)
db.session.add(event)
db.session.flush()
events.append(events)
TicketWebhook.deliver(TicketWebhook.Events.event_create,
event.to_dict(),
TicketWebhook.Subscription.ticket_id == ticket.id)
db.session.commit()

View File

@ -13,10 +13,10 @@ from todosrht.types import Label, Ticket, TicketLabel
from todosrht.types import TicketAccess, TicketResolution
from todosrht.types import TicketSubscription, User
from todosrht.urls import ticket_url
from todosrht.webhooks import TicketWebhook
ticket = Blueprint("ticket", __name__)
def get_ticket_context(ticket, tracker, access):
"""Returns the context required to render ticket.html"""
tracker_sub = None
@ -153,6 +153,9 @@ def ticket_comment_POST(owner, name, ticket_id):
event = add_comment(current_user, ticket,
text=text, resolve=resolve, resolution=resolution, reopen=reopen)
TicketWebhook.deliver(TicketWebhook.Events.event_create,
event.to_dict(),
TicketWebhook.Subscription.ticket_id == ticket.id)
return redirect(ticket_url(ticket, event.comment))
@ticket.route("/<owner>/<name>/<int:ticket_id>/edit")
@ -253,6 +256,10 @@ def ticket_add_label(owner, name, ticket_id):
db.session.add(event)
db.session.commit()
TicketWebhook.deliver(TicketWebhook.Events.event_create,
event.to_dict(),
TicketWebhook.Subscription.ticket_id == ticket.id)
return redirect(ticket_url(ticket))
@ticket.route("/<owner>/<name>/<int:ticket_id>/remove_label/<int:label_id>",
@ -286,6 +293,10 @@ def ticket_remove_label(owner, name, ticket_id, label_id):
db.session.delete(ticket_label)
db.session.commit()
TicketWebhook.deliver(TicketWebhook.Events.event_create,
event.to_dict(),
TicketWebhook.Subscription.ticket_id == ticket.id)
return redirect(ticket_url(ticket))
def _assignment_get_ticket(owner, name, ticket_id):