fc / apps /contracts /services /contract /admin /contract_admin_query_service.py
jun2024's picture
Upload 2241 files
b4f2238 verified
Raw History Blame Contribute Delete
2.46 kB
"""Business logic services."""
from __future__ import annotations
from typing import Any, ClassVar
from django.utils.translation import gettext_lazy as _
from apps.contracts.models import Contract
from apps.core.exceptions import NotFoundError
from apps.core.models.enums import CaseType
from ..wiring import get_case_service
class ContractAdminQueryService:
CASE_ALLOWED_TYPES: ClassVar = {
CaseType.CIVIL,
CaseType.CRIMINAL,
CaseType.ADMINISTRATIVE,
CaseType.LABOR,
CaseType.INTL,
}
def can_create_case(self, contract_id: int) -> bool:
contract = Contract.objects.filter(pk=contract_id).only("id", "case_type").first()
if not contract:
return False
return contract.case_type in self.CASE_ALLOWED_TYPES
def get_contract_detail(self, contract_id: int) -> Any:
try:
return (
Contract.objects.select_related("folder_binding")
.prefetch_related(
"contract_parties__client",
"assignments__lawyer",
"payments",
"reminders",
"supplementary_agreements__parties__client",
"finalized_materials",
)
.get(pk=contract_id)
)
except Contract.DoesNotExist as exc:
raise NotFoundError(_("合同 %(id)s 不存在") % {"id": contract_id}) from exc
def get_related_cases(self, contract_id: int) -> list[dict[str, Any]]:
case_service = get_case_service()
cases_dto = case_service.get_cases_by_contract(contract_id)
if not cases_dto:
return []
case_ids = [case.id for case in cases_dto]
case_primary_lawyer_map = case_service.get_primary_lawyer_names_by_case_ids_internal(case_ids)
from apps.core.models.enums import CaseStatus
status_map = dict(CaseStatus.choices)
return [
{
"id": case.id,
"name": case.name,
"status": case.status,
"status_display": status_map.get(case.status, case.status),
"cause_of_action": case.cause_of_action or _("未设置"),
"primary_lawyer": case_primary_lawyer_map.get(case.id) or _("未指派"),
"detail_url": f"/admin/cases/case/{case.id}/detail/",
}
for case in cases_dto
]