File size: 3,064 Bytes
8604302
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from django.contrib import admin
from .models import (
    Procedure,
    Fine,
    Office,
    Advisory,
    Synonym,
    LegalDocument,
    LegalSection,
    LegalDocumentImage,
    IngestionJob,
)

@admin.register(Procedure)
class ProcedureAdmin(admin.ModelAdmin):
    list_display = ("id", "title", "domain", "level", "updated_at")
    search_fields = ("title", "conditions", "dossier")
    list_filter = ("domain", "level")

@admin.register(Fine)
class FineAdmin(admin.ModelAdmin):
    list_display = ("id", "code", "name", "decree")
    search_fields = ("code", "name", "article")

@admin.register(Office)
class OfficeAdmin(admin.ModelAdmin):
    list_display = ("id", "unit_name", "district", "phone")
    search_fields = ("unit_name", "address", "district")
    list_filter = ("district",)

@admin.register(Advisory)
class AdvisoryAdmin(admin.ModelAdmin):
    list_display = ("id", "title", "published_at")
    search_fields = ("title", "summary")

@admin.register(Synonym)
class SynonymAdmin(admin.ModelAdmin):
    list_display = ("id", "keyword", "alias")
    search_fields = ("keyword", "alias")


@admin.register(LegalDocument)
class LegalDocumentAdmin(admin.ModelAdmin):
    list_display = ("id", "code", "title", "doc_type", "issued_at")
    search_fields = ("code", "title", "summary", "issued_by")
    list_filter = ("doc_type", "issued_by")


@admin.register(LegalSection)
class LegalSectionAdmin(admin.ModelAdmin):
    list_display = ("id", "document", "section_code", "level", "order")
    list_filter = ("level",)
    search_fields = ("section_code", "section_title", "content")
    autocomplete_fields = ("document",)


@admin.register(LegalDocumentImage)
class LegalDocumentImageAdmin(admin.ModelAdmin):
    list_display = ("id", "document", "page_number", "width", "height")
    search_fields = ("document__code", "description")
    list_filter = ("page_number",)


# Optional import - celery may not be available in all environments
# Catch all exceptions to handle circular import issues
try:
    from .tasks import process_ingestion_job
except (ImportError, AttributeError, Exception):
    process_ingestion_job = None


@admin.register(IngestionJob)
class IngestionJobAdmin(admin.ModelAdmin):
    list_display = ("id", "code", "status", "filename", "created_at", "finished_at")
    search_fields = ("code", "filename", "error_message")
    list_filter = ("status", "created_at")
    autocomplete_fields = ("document",)
    readonly_fields = ("storage_path", "error_message", "stats")
    actions = ["retry_jobs"]

    @admin.action(description="Retry selected ingestion jobs")
    def retry_jobs(self, request, queryset):
        for job in queryset:
            job.status = job.STATUS_PENDING
            job.progress = 0
            job.error_message = ""
            job.save(update_fields=["status", "progress", "error_message", "updated_at"])
            if process_ingestion_job is not None:
                process_ingestion_job.delay(str(job.id))
        self.message_user(request, f"Đã requeue {queryset.count()} tác vụ")