feat: add trusted ticket intake backend

This commit is contained in:
hailin
2026-07-16 19:37:32 +08:00
parent b592dc219d
commit bcd6de4609
28 changed files with 1966 additions and 42 deletions

View File

@@ -24,7 +24,13 @@ from apps.tickets.schemas import (
TicketStatusIn,
TicketUpdateIn,
)
from apps.tickets.services import TicketStatusError, transition_requires_remark, transition_ticket
from apps.tickets.services import (
TicketDataError,
TicketStatusError,
create_ticket_from_fields,
transition_requires_remark,
transition_ticket,
)
router = Router(tags=["tickets"])
@@ -101,37 +107,10 @@ def serialize_ticket_event(event: TicketEvent) -> dict:
@router.post("", response=TicketOut)
def create_ticket(request, payload: TicketIn):
require_permission(request, "ticket.create")
assignee = None
if payload.assignee_id:
assignee = get_user_model().objects.filter(id=payload.assignee_id).first()
category = None
if payload.category_code:
category = TicketCategory.objects.filter(code=payload.category_code, enabled=True).first()
if category is None:
raise HttpError(400, "Unknown ticket category")
ticket = Ticket.objects.create(
ticket_no=next_ticket_no(),
title=payload.title,
description=payload.description,
category=category,
priority=payload.priority,
problem_performance=payload.problem_performance,
problem_object=payload.problem_object,
submitter_name=payload.submitter_name,
submitter_org=payload.submitter_org,
impact_scope=payload.impact_scope,
environment=payload.environment,
related_system=payload.related_system,
assignee=assignee,
requester=request.user if request.user.is_authenticated else None,
created_by=request.user if request.user.is_authenticated else None,
)
TicketEvent.objects.create(
ticket=ticket,
event_type="created",
to_value={"status": ticket.status, "category_code": payload.category_code},
operator=request.user if request.user.is_authenticated else None,
)
try:
ticket = create_ticket_from_fields(payload.dict(), request.user)
except TicketDataError as error:
raise HttpError(400, str(error)) from error
return serialize_ticket(ticket)