fc / apps /documents /services /folder_template /query_service.py
jun2024's picture
Upload 2241 files
b4f2238 verified
Raw History Blame Contribute Delete
2.81 kB
"""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