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