Skip to content

Commit

Permalink
Control author mail forwarding via unbound form field
Browse files Browse the repository at this point in the history
  • Loading branch information
FinemechanicPub committed Dec 6, 2023
1 parent a00cb5d commit 22d3370
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 13 deletions.
2 changes: 1 addition & 1 deletion apps/filer/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@


class ShortImageAdminForm(ImageAdminForm):
class Media(ImageAdminForm.Media):
class Media:
css = {"all": ("custom_filer.css",)}


Expand Down
50 changes: 46 additions & 4 deletions apps/library/admin/author.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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",
Expand All @@ -127,7 +165,6 @@ class AuthorAdmin(admin.ModelAdmin):
"plays_count",
)
inlines = (
MailInline,
PlayInline,
OtherPlayInline,
SocialNetworkLinkInline,
Expand All @@ -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(
Expand Down
7 changes: 0 additions & 7 deletions apps/library/static/admin/author_admin.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
});
4 changes: 3 additions & 1 deletion apps/postfix/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down

0 comments on commit 22d3370

Please sign in to comment.