File size: 5,009 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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
"""Django admin configuration."""

from __future__ import annotations

import logging
from typing import Any

from django import forms
from django.contrib import admin, messages
from django.http import HttpResponseRedirect
from django.urls import path, reverse
from django.utils.translation import gettext_lazy as _

from apps.core.models.enums import LegalStatus, SimpleCaseType
from apps.documents.models import ProxyMatterRule
from apps.documents.services.proxy_matter_rule_init_service import ProxyMatterRuleInitService

logger = logging.getLogger(__name__)


def _get_proxy_matter_rule_init_service() -> ProxyMatterRuleInitService:
    return ProxyMatterRuleInitService()


class ProxyMatterRuleAdminForm(forms.ModelForm[ProxyMatterRule]):
    case_types_field = forms.MultipleChoiceField(
        label="案件类型",
        choices=SimpleCaseType.choices,
        required=False,
        widget=forms.CheckboxSelectMultiple,
        help_text="可单选或多选;不选表示匹配任意案件类型",
    )
    legal_statuses = forms.MultipleChoiceField(
        label="我方诉讼地位",
        choices=LegalStatus.choices,
        required=False,
        widget=forms.CheckboxSelectMultiple,
        help_text="可单选或多选;不选表示匹配任意诉讼地位",
    )

    class Meta:
        model = ProxyMatterRule
        fields: str = "__all__"

    def __init__(self, *args: Any, **kwargs: Any) -> None:
        super().__init__(*args, **kwargs)
        if self.instance and self.instance.pk:
            selected = list(self.instance.case_types or [])
            if not selected and self.instance.case_type:
                selected = [self.instance.case_type]
            self.fields["case_types_field"].initial = selected

    def save(self, commit: bool = True) -> ProxyMatterRule:
        instance = super().save(commit=False)
        selected = [str(x) for x in self.cleaned_data.get("case_types_field", []) if x]
        instance.case_types = selected
        # 兼容历史逻辑: 同步一个主值到旧字段
        instance.case_type = selected[0] if selected else None
        if commit:
            instance.save()
        return instance


@admin.register(ProxyMatterRule)
class ProxyMatterRuleAdmin(admin.ModelAdmin[ProxyMatterRule]):
    form = ProxyMatterRuleAdminForm
    change_list_template = "admin/documents/proxymatterrule/change_list.html"

    list_display = (
        "id",
        "case_types_display",
        "case_stage",
        "legal_statuses_display",
        "legal_status_match_mode",
        "priority",
        "is_active",
        "updated_at",
    )
    list_filter = (
        "is_active",
        "case_stage",
        "legal_status_match_mode",
    )
    fields = (
        "case_types_field",
        "case_stage",
        "legal_statuses",
        "legal_status_match_mode",
        "items_text",
        "priority",
        "is_active",
    )
    search_fields = ("items_text",)
    ordering = ("-is_active", "priority", "id")

    def get_urls(self) -> list[Any]:
        urls = super().get_urls()
        custom_urls = [
            path(
                "initialize-defaults/",
                self.admin_site.admin_view(self.initialize_defaults_view),
                name="documents_proxymatterrule_initialize",
            )
        ]
        return custom_urls + urls

    def initialize_defaults_view(self, request: Any) -> HttpResponseRedirect:
        try:
            result = _get_proxy_matter_rule_init_service().initialize_defaults()
        except Exception as exc:
            logger.exception("初始化代理事项规则失败")
            messages.error(request, _("初始化失败:%(error)s") % {"error": str(exc)})
            return HttpResponseRedirect(reverse("admin:documents_proxymatterrule_changelist"))

        created = int(result.get("created", 0))
        updated = int(result.get("updated", 0))

        if created > 0 or updated > 0:
            messages.success(
                request,
                _("初始化完成:新增 %(created)d 条,更新 %(updated)d 条") % {"created": created, "updated": updated},
            )
        else:
            messages.info(request, _("初始化完成:所有初始化数据已存在,无需变更"))

        return HttpResponseRedirect(reverse("admin:documents_proxymatterrule_changelist"))

    def changelist_view(self, request: Any, extra_context: Any = None) -> Any:
        extra_context = extra_context or {}
        extra_context["initialize_url"] = reverse("admin:documents_proxymatterrule_initialize")
        return super().changelist_view(request, extra_context=extra_context)

    @admin.display(description=_("案件类型"))
    def case_types_display(self, obj: ProxyMatterRule) -> str:
        return obj.get_case_types_display() or "任意"

    @admin.display(description=_("我方诉讼地位"))
    def legal_statuses_display(self, obj: ProxyMatterRule) -> str:
        return obj.get_legal_statuses_display() or "任意"