File size: 2,812 Bytes
b4f2238 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | """Business logic services."""
from __future__ import annotations
from dataclasses import dataclass
from typing import Any
from django.utils.translation import gettext_lazy as _
from apps.core.exceptions import NotFoundError
from apps.documents.models import FolderTemplate
from .id_service import FolderTemplateIdService
from .repo import FolderTemplateRepo
@dataclass(frozen=True)
class FolderTemplateQueryService:
repo: FolderTemplateRepo
id_service: FolderTemplateIdService
def get_duplicate_id_report(self) -> dict[str, Any]:
return self.id_service.get_duplicate_id_report()
def get_template_for_case(self, *, case_type: str, case_stage: str) -> Any:
from apps.documents.models import FolderTemplateType
templates = (
self.repo.filter(is_active=True, template_type=FolderTemplateType.CASE).order_by("-updated_at").all() # type: ignore[return-value]
)
for template in templates:
case_types = template.case_types or []
case_stages = template.case_stages or []
case_type_match = not case_types or case_type in case_types or "all" in case_types
case_stage_match = not case_stages or case_stage in case_stages or "all" in case_stages
if case_type_match and case_stage_match:
return template
return None
def get_template_by_id(self, *, template_id: int) -> FolderTemplate:
try:
return self.repo.get_by_id(template_id)
except FolderTemplate.DoesNotExist:
raise NotFoundError(
message=_("文件夹模板不存在"),
code="FOLDER_TEMPLATE_NOT_FOUND",
errors={"template_id": f"ID 为 {template_id} 的模板不存在"},
) from None
def list_templates(
self, *, case_type: str | None = None, case_stage: str | None = None, is_active: bool | None = None
) -> Any:
from apps.documents.models import FolderTemplateType
queryset = self.repo.filter(template_type=FolderTemplateType.CASE).order_by("-updated_at").all() # type: ignore[return-value]
results: list[FolderTemplate] = []
for template in queryset:
if is_active is not None and template.is_active != is_active:
continue
if case_type is not None:
case_types = template.case_types or []
if case_types and case_type not in case_types and ("all" not in case_types):
continue
if case_stage is not None:
case_stages = template.case_stages or []
if case_stages and case_stage not in case_stages and ("all" not in case_stages):
continue
results.append(template)
return results
|