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

1"""Registers admin interfaces for the newsletters module.""" 

2 

3from django.contrib import admin 

4from django.contrib.admin import ModelAdmin 

5from django.shortcuts import redirect 

6from django.urls import path 

7 

8from newsletters.models import Newsletter, NewsletterEvent, NewsletterItem 

9from newsletters.views import ImportEventView, admin_send 

10 

11from .forms import NewsletterEventForm 

12 

13 

14class NewsletterItemInline(admin.StackedInline): 

15 """The inline for the text items in the newsletter.""" 

16 

17 model = NewsletterItem 

18 extra = 0 

19 fields = ( 

20 "order", 

21 "title", 

22 "url", 

23 "description", 

24 ) 

25 

26 

27class NewsletterEventInline(admin.StackedInline): 

28 """The inline for the event items in the newsletter.""" 

29 

30 form = NewsletterEventForm 

31 model = NewsletterEvent 

32 extra = 0 

33 

34 

35@admin.register(Newsletter) 

36class NewsletterAdmin(ModelAdmin): 

37 """Manage the newsletters.""" 

38 

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" 

57 

58 def change_view(self, request, object_id, form_url=""): 

59 """Render the change view. 

60 

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}) 

67 

68 def has_delete_permission(self, request, obj=None): 

69 """Check if delete permission is granted. 

70 

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) 

76 

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 

82 

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