From 22d3370d7c1d4f21da8967b88c793dda1b7771b3 Mon Sep 17 00:00:00 2001 From: FinemechanicPub <93194456+FinemechanicPub@users.noreply.github.com> Date: Wed, 6 Dec 2023 15:42:56 +0300 Subject: [PATCH] Control author mail forwarding via unbound form field --- apps/filer/admin.py | 2 +- apps/library/admin/author.py | 50 +++++++++++++++++++++-- apps/library/static/admin/author_admin.js | 7 ---- apps/postfix/admin.py | 4 +- 4 files changed, 50 insertions(+), 13 deletions(-) diff --git a/apps/filer/admin.py b/apps/filer/admin.py index f6d1ab172..f5be0a056 100644 --- a/apps/filer/admin.py +++ b/apps/filer/admin.py @@ -4,7 +4,7 @@ class ShortImageAdminForm(ImageAdminForm): - class Media(ImageAdminForm.Media): + class Media: css = {"all": ("custom_filer.css",)} diff --git a/apps/library/admin/author.py b/apps/library/admin/author.py index 87525c4f6..0d1155c8d 100644 --- a/apps/library/admin/author.py +++ b/apps/library/admin/author.py @@ -1,8 +1,12 @@ +from typing import Any + from adminsortable2.admin import SortableInlineAdminMixin +from django import forms from django.contrib import admin from django.contrib.postgres.aggregates import StringAgg from django.db.models import Count from django.forms import ModelForm, ValidationError +from django.forms.fields import Field from apps.library.forms import OtherLinkForm from apps.library.models import Author, AuthorPlay, OtherLink, SocialNetworkLink @@ -112,13 +116,47 @@ class OtherLinkInline(SortableInlineAdminMixin, admin.TabularInline): classes = ("collapsible",) -class MailInline(admin.TabularInline): - model = Virtual - extra = 0 +class AuthorAdminForm(forms.ModelForm): + enable_email = forms.BooleanField(required=False, initial=False, label="Включить переадресацию почты") + + def get_initial_for_field(self, field: Field, field_name: str) -> Any: + if self.instance.pk and field is self.fields["enable_email"]: + if hasattr(self.instance, "virtual_email"): + return self.instance.virtual_email.enabled + return False + return super().get_initial_for_field(field, field_name) + + def save(self, commit: bool = True) -> Any: + author = self.instance + + if hasattr(author, "virtual_email"): + author.virtual_email.email = self.cleaned_data.get("slug") + author.virtual_email.enabled = self.cleaned_data.get("enable_email", False) + + if self.cleaned_data.get("enable_email", False) and not hasattr(author, "virtual_email"): + virtual = Virtual(author=author, email=self.cleaned_data.get("slug")) + author.virtual_email = virtual + + return super().save(commit=commit) + + def clean(self): + cleaned_data = super().clean() + enable_email = cleaned_data.get("enable_email") + person = cleaned_data.get("person") + if enable_email and person: + if not person.email: + raise ValidationError( + "Нельзя включить перенаправление электронной почты так как у персоны не указан адрес" + ) + + class Meta: + model = Author + fields = "__all__" @admin.register(Author) class AuthorAdmin(admin.ModelAdmin): + # form = AuthorAdminForm list_display = ( "person", "quote", @@ -127,7 +165,6 @@ class AuthorAdmin(admin.ModelAdmin): "plays_count", ) inlines = ( - MailInline, PlayInline, OtherPlayInline, SocialNetworkLinkInline, @@ -151,6 +188,11 @@ class AuthorAdmin(admin.ModelAdmin): autocomplete_fields = ("person",) empty_value_display = "-пусто-" + def get_form(self, request, obj=None, change=False, **kwargs) -> Any: + if request.user.has_perm("postfix.add_virtual") and request.user.has_perm("postfix.change_virtual"): + return AuthorAdminForm + return super().get_form(request, obj, change, **kwargs) + def get_queryset(self, request): queryset = super().get_queryset(request).select_related("person") queryset = queryset.annotate( diff --git a/apps/library/static/admin/author_admin.js b/apps/library/static/admin/author_admin.js index 12f6b2001..de2259687 100644 --- a/apps/library/static/admin/author_admin.js +++ b/apps/library/static/admin/author_admin.js @@ -42,10 +42,3 @@ jQuery(document).ready(function ($) { }); }); }); - -jQuery(document).on('formset:added', function(event, $row, formsetName) { - if (formsetName == "virtual_email") { - let slug = jQuery("#id_slug").val(); - jQuery("#id_virtual_email-0-email").val(slug); - } -}); diff --git a/apps/postfix/admin.py b/apps/postfix/admin.py index 6b4b36b94..70e7dac23 100644 --- a/apps/postfix/admin.py +++ b/apps/postfix/admin.py @@ -9,16 +9,18 @@ class RecipientsInline(admin.TabularInline): model = Recipient + extra = 1 @admin.register(Virtual) class VirtualAdmin(admin.ModelAdmin): - list_display = ("enabled", "author", "email", "list_recipients") + list_display = ("enabled", "email", "author", "list_recipients") list_display_links = ("email",) list_editable = ("enabled",) inlines = (RecipientsInline,) search_fields = ("author__person__first_name", "author__person__last_name", "email", "recipients__email") + readonly_fields = ("author",) @admin.display(description="получатели") def list_recipients(self, obj: Virtual):