Rig up ticket webhooks
This commit is contained in:
parent
ae2797dd8d
commit
2368339664
|
@ -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"
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue