136 lines
4.6 KiB
Python
136 lines
4.6 KiB
Python
# -*- coding: utf-8 -*-
|
||
# hub/ticket/ui/details/task_details_actions.py
|
||
|
||
"""Отдельный модуль действий экрана деталей Ticket."""
|
||
|
||
from __future__ import annotations
|
||
|
||
from application.ticket_application_api import TicketApplicationApi
|
||
from domain import TicketDocumentSnapshot, TicketTaskSnapshot
|
||
from ui.dialogs import (
|
||
AcceptanceDialog,
|
||
DiagnosticReportDialog,
|
||
RepairReportDialog,
|
||
SpecialistDialog,
|
||
TaskRefusalDialog,
|
||
)
|
||
from ui.ticket_message_dialog import TicketMessageDialog
|
||
|
||
|
||
class TaskDetailsActions:
|
||
"""Обёртка над application-командами для details-экрана."""
|
||
|
||
def __init__(self, application: TicketApplicationApi):
|
||
self._application = application
|
||
|
||
def assign_specialist(
|
||
self,
|
||
task: TicketTaskSnapshot,
|
||
parent=None,
|
||
) -> TicketTaskSnapshot | None:
|
||
dialog = SpecialistDialog(
|
||
specialists=self._application.list_specialists(),
|
||
parent=parent,
|
||
)
|
||
if dialog.exec() != dialog.DialogCode.Accepted:
|
||
return None
|
||
specialist_name = dialog.selected_specialist.strip()
|
||
if not specialist_name:
|
||
self._show_warning(parent, "Имя специалиста не указано.")
|
||
return None
|
||
snapshot = self._application.assign_specialist(task.task_id, specialist_name)
|
||
if snapshot is None:
|
||
self._show_warning(parent, "Не удалось назначить специалиста.")
|
||
return snapshot
|
||
|
||
def sign_diagnostic(
|
||
self,
|
||
task: TicketTaskSnapshot,
|
||
parent=None,
|
||
) -> TicketDocumentSnapshot | None:
|
||
dialog = DiagnosticReportDialog(task, parent=parent)
|
||
if dialog.exec() != dialog.DialogCode.Accepted:
|
||
return None
|
||
try:
|
||
return self._application.create_diagnostic_report(
|
||
task.task_id,
|
||
**dialog.build_payload(),
|
||
)
|
||
except ValueError as exc:
|
||
self._show_warning(parent, str(exc))
|
||
return None
|
||
|
||
def sign_repair(
|
||
self,
|
||
task: TicketTaskSnapshot,
|
||
parent=None,
|
||
) -> TicketDocumentSnapshot | None:
|
||
dialog = RepairReportDialog(task, parent=parent)
|
||
if dialog.exec() != dialog.DialogCode.Accepted:
|
||
return None
|
||
try:
|
||
return self._application.create_repair_report(
|
||
task.task_id,
|
||
**dialog.build_payload(),
|
||
)
|
||
except ValueError as exc:
|
||
self._show_warning(parent, str(exc))
|
||
return None
|
||
|
||
def sign_acceptance(
|
||
self,
|
||
task: TicketTaskSnapshot,
|
||
parent=None,
|
||
) -> TicketDocumentSnapshot | None:
|
||
dialog = AcceptanceDialog(task, parent=parent)
|
||
if dialog.exec() != dialog.DialogCode.Accepted:
|
||
return None
|
||
try:
|
||
return self._application.create_acceptance_report(
|
||
task.task_id,
|
||
**dialog.build_payload(),
|
||
)
|
||
except ValueError as exc:
|
||
self._show_warning(parent, str(exc))
|
||
return None
|
||
|
||
def archive_task(
|
||
self,
|
||
task: TicketTaskSnapshot,
|
||
parent=None,
|
||
) -> TicketTaskSnapshot | None:
|
||
answer = TicketMessageDialog.ask_confirmation(
|
||
parent=parent,
|
||
title="Архивация задачи",
|
||
message=f"Переместить задачу #{task.sequence_number or task.task_id} в архив?",
|
||
accept_text="В архив",
|
||
reject_text="Отмена",
|
||
)
|
||
if not answer:
|
||
return None
|
||
snapshot = self._application.archive_task(task.task_id)
|
||
if snapshot is None:
|
||
self._show_warning(parent, "Не удалось переместить задачу в архив.")
|
||
return snapshot
|
||
|
||
def refuse_task(
|
||
self,
|
||
task: TicketTaskSnapshot,
|
||
parent=None,
|
||
) -> TicketTaskSnapshot | None:
|
||
dialog = TaskRefusalDialog(task, parent=parent)
|
||
if dialog.exec() != dialog.DialogCode.Accepted:
|
||
return None
|
||
refusal_reason = dialog.refusal_reason
|
||
if not refusal_reason:
|
||
self._show_warning(parent, "Причина отказа не указана.")
|
||
return None
|
||
snapshot = self._application.refuse_task(task.task_id, refusal_reason)
|
||
if snapshot is None:
|
||
self._show_warning(parent, "Не удалось перевести задачу в отказ.")
|
||
return snapshot
|
||
|
||
@staticmethod
|
||
def _show_warning(parent, text: str) -> None:
|
||
TicketMessageDialog.show_warning(parent, "Ticket", text)
|