Files
Dispatch/Dispatch_V0.1.1/ui/details/task_details_actions.py
2026-04-29 08:18:54 +04:00

136 lines
4.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- 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)