Coverage for website/newsletters/admin.py: 95.35%
39 statements
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1"""Registers admin interfaces for the newsletters module."""
3from django.contrib import admin
4from django.contrib.admin import ModelAdmin
5from django.shortcuts import redirect
6from django.urls import path
8from newsletters.models import Newsletter, NewsletterEvent, NewsletterItem
9from newsletters.views import ImportEventView, admin_send
11from .forms import NewsletterEventForm
14class NewsletterItemInline(admin.StackedInline):
15 """The inline for the text items in the newsletter."""
17 model = NewsletterItem
18 extra = 0
19 fields = (
20 "order",
21 "title",
22 "url",
23 "description",
24 )
27class NewsletterEventInline(admin.StackedInline):
28 """The inline for the event items in the newsletter."""
30 form = NewsletterEventForm
31 model = NewsletterEvent
32 extra = 0
35@admin.register(Newsletter)
36class NewsletterAdmin(ModelAdmin):
37 """Manage the newsletters."""
39 #: available fields in the admin overview list
40 list_display = (
41 "title",
42 "date",
43 "send_date",
44 "sent",
45 )
46 #: available inlines in the admin change form
47 inlines = (
48 NewsletterItemInline,
49 NewsletterEventInline,
50 )
51 #: available fieldsets in the admin change form
52 fieldsets = ((None, {"fields": ("title", "date", "send_date", "description")}),)
53 #: available fields for searching
54 search_fields = ("title", "description")
55 #: field to use for date filtering
56 date_hierarchy = "date"
58 def change_view(self, request, object_id, form_url=""):
59 """Render the change view.
61 Disallow change access if a newsletter is marked as sent
62 """
63 obj = Newsletter.objects.filter(id=object_id)[0]
64 if obj is not None and obj.sent is True:
65 return redirect(obj)
66 return super().change_view(request, object_id, form_url, {"newsletter": obj})
68 def has_delete_permission(self, request, obj=None):
69 """Check if delete permission is granted.
71 Disallow deletion if a newsletter is marked as sent
72 """
73 if obj is not None and obj.sent is True: 73 ↛ 74line 73 didn't jump to line 74 because the condition on line 73 was never true
74 return False
75 return super().has_delete_permission(request, obj=obj)
77 def get_actions(self, request):
78 """Remove the deletion action from the admin."""
79 actions = super().get_actions(request)
80 del actions["delete_selected"]
81 return actions
83 def get_urls(self):
84 urls = super().get_urls()
85 custom_urls = [
86 path("<int:pk>/send", admin_send, name="newsletters_newsletter_send"),
87 path(
88 "<int:pk>/import/",
89 self.admin_site.admin_view(ImportEventView.as_view(admin=self)),
90 name="newsletters_newsletter_import_events",
91 ),
92 ]
93 return custom_urls + urls