Source code for feder.letters.admin

from django.contrib import admin
from django.db.models import Q
from django.utils import timezone
from django.utils.translation import gettext_lazy as _

from .models import Attachment, Letter, LetterEmailDomain, ReputableLetterEmailTLD


class LetterDirectionListFilter(admin.SimpleListFilter):
    title = _("Letter Direction")  # Displayed in the admin sidebar
    parameter_name = "letter_direction_filter"  # The URL parameter name

    def lookups(self, request, model_admin):
        # Return the filter options as a list of tuples
        return (
            ("outgoing", _("Outgoing")),
            ("incoming", _("Incoming")),
        )

    def queryset(self, request, queryset):
        # Apply the filter to the queryset based on the selected option
        if self.value() == "outgoing":
            return queryset.is_outgoing()
        elif self.value() == "incoming":
            return queryset.is_incoming()


class LetterLlmEvaluationListFilter(admin.SimpleListFilter):
    title = _("Letter LLM Evaluation")  # Displayed in the admin sidebar
    parameter_name = "letter_llm_evaluation_filter"  # The URL parameter name

    def lookups(self, request, model_admin):
        # Return the filter options as a list of tuples
        return (
            (
                "A) email jest odpowiedzią",
                "A) email jest odpowiedzią z ... i zawiera odpowiedzi...",
            ),
            (
                ",B) email jest odpowiedzią z",
                "B) email jest odpowiedzią z ... i zawiera odmowę odpowiedzi...",
            ),
            (
                "C) email jest odpowiedzią z",
                (
                    "C) email jest odpowiedzią z ... i zawiera informację o "
                    + "przedłużeniu terminu..."
                ),
            ),
            (
                "D) email jest potwierdzeniem dostarczenia lub otwarcia",
                "D) email jest potwierdzeniem dostarczenia lub otwarcia maila z ...",
            ),
            (
                "E) email jest odpowiedzią z innej",
                "E) email jest odpowiedzią z innej instytucji lub na inny wniosek.",
            ),
            (
                "F) email nie jest odpowiedzią z",
                "F) email nie jest odpowiedzią z ... i jest spamem.",
            ),
            (
                "G) nie można ustalić kategorii",
                "G) nie można ustalić kategorii odpowiedzi.",
            ),
        )

    def queryset(self, request, queryset):
        # Apply the filter to the queryset based on the selected option
        if self.value():
            return queryset.filter(ai_evaluation__startswith=self.value())
        return queryset


[docs] class AttachmentInline(admin.StackedInline): """ Stacked Inline View for Attachment """ model = Attachment
[docs] @admin.register(Letter) class LetterAdmin(admin.ModelAdmin): """ Admin View for Letter """ date_hierarchy = "created" list_display = ( "id", "get_record_id", "title", "get_case", "get_monitoring", "author", "created", # "modified", "is_draft", # "is_incoming", "get_outgoing", "get_delivery_status", "is_spam", "ai_evaluation", "email_from", "email_to", "eml", "message_id_header", ) list_filter = ( "is_spam", LetterLlmEvaluationListFilter, LetterDirectionListFilter, # "created", "record__case__monitoring", # "modified", # "is_outgoing", ) inlines = [AttachmentInline] search_fields = ( "id", "title", # "body", "record__case__name", "eml", "message_id_header", "email_from", "email_to", ) raw_id_fields = ("author_user", "author_institution", "record") # list_editable = ("is_spam",) ordering = ("-id",) actions = [ "delete_selected", "mark_spam", "mark_probable_spam", "mark_spam_unknown", "mark_non_spam", ] @admin.display( description=_("Record id"), ordering="record__id", ) def get_record_id(self, obj): if obj.record is None: return None return obj.record.id @admin.display( description=_("Is outgoing"), boolean=True, ) def get_outgoing(self, obj): return obj.is_outgoing @admin.display( description=_("Delivery Status"), ) def get_delivery_status(self, obj): return obj.emaillog.status_verbose @admin.display( description=_("Case name"), ordering="record__case", ) def get_case(self, obj): return obj.record.case @admin.display( description=_("Monitoring name"), ordering="record__case__monitoring", ) def get_monitoring(self, obj): if obj.record.case is not None: return obj.record.case.monitoring return None @admin.action(description=_("Mark selected letters as Spam")) def mark_spam(modeladmin, request, queryset): queryset.update( is_spam=Letter.SPAM.spam, mark_spam_by=request.user, mark_spam_at=timezone.now(), ) @admin.action(description=_("Mark selected letters as Non Spam")) def mark_non_spam(modeladmin, request, queryset): queryset.update(is_spam=Letter.SPAM.non_spam) @admin.action(description=_("Mark selected letters as Spam Unknown")) def mark_spam_unknown(modeladmin, request, queryset): queryset.update(is_spam=Letter.SPAM.unknown) @admin.action(description=_("Mark selected letters as Probable Spam")) def mark_probable_spam(modeladmin, request, queryset): queryset.update(is_spam=Letter.SPAM.probable_spam)
# def get_queryset(self, *args, **kwargs): # qs = super().get_queryset(*args, **kwargs) # return qs.with_author() class ReputableTLDListFilter(admin.SimpleListFilter): title = "TLD" parameter_name = "tld" def lookups(self, request, model_admin): return [ ("reputable", _("Reputable TLDs")), ("non_reputable", _("Non-reputable TLDs")), ] def queryset(self, request, queryset): tlds = ReputableLetterEmailTLD.objects.values_list("name", flat=True) q_object = Q() for tld in tlds: q_object |= Q(domain_name__iendswith=tld) if self.value() == "reputable": return queryset.filter(q_object) elif self.value() == "non_reputable": return queryset.exclude(q_object)
[docs] @admin.register(LetterEmailDomain) class LetterEmailDomainAdmin(admin.ModelAdmin): """ Admin View for LetterEmailDomain """ list_display = ( "domain_name", "is_trusted_domain", "is_monitoring_email_to_domain", "is_non_spammer_domain", "is_spammer_domain", "email_to_count", "email_from_count", ) list_filter = ( "is_trusted_domain", "is_monitoring_email_to_domain", "is_non_spammer_domain", "is_spammer_domain", ReputableTLDListFilter, ) search_fields = ("domain_name",) ordering = ("-email_from_count",) list_editable = ("is_spammer_domain", "is_non_spammer_domain")
[docs] @admin.register(ReputableLetterEmailTLD) class ReputableLetterEmailTLDAdmin(admin.ModelAdmin): """ Admin View for ReputableLetterEmailTLD """ list_display = ("id", "name") search_fields = ("name",) ordering = ("name",)