Coverage for website/newsletters/views.py: 80.36%

50 statements  

« prev     ^ index     » next       coverage.py v7.6.7, created at 2025-08-14 10:31 +0000

1"""Views provided by the newsletters package.""" 

2 

3from django.contrib.admin import helpers 

4from django.contrib.admin.views.decorators import staff_member_required 

5from django.contrib.auth.decorators import permission_required 

6from django.http.request import HttpRequest as HttpRequest 

7from django.http.response import HttpResponse as HttpResponse 

8from django.shortcuts import get_object_or_404, redirect, render 

9from django.urls import reverse 

10from django.utils.translation import gettext_lazy as _ 

11from django.views.generic import FormView 

12 

13from newsletters import services 

14from newsletters.forms import NewsletterImportEventForm 

15from newsletters.models import Newsletter 

16from partners.models import Partner 

17from utils.media.services import get_media_url 

18 

19 

20def preview(request, pk, lang=None): 

21 """View that renders the newsletter as HTML. 

22 

23 :param request: the request object 

24 :param pk: the newsletter's primary key 

25 :return: HttpResponse 200 containing the newsletter HTML 

26 """ 

27 newsletter = get_object_or_404(Newsletter, pk=pk) 

28 

29 if newsletter.rendered_file: 29 ↛ 30line 29 didn't jump to line 30 because the condition on line 29 was never true

30 return redirect(get_media_url(newsletter.rendered_file)) 

31 

32 events = services.get_agenda(newsletter.date) if newsletter.date else None 

33 local_partners = services.split_local_partners() 

34 

35 return render( 

36 request, 

37 "newsletters/email.html", 

38 { 

39 "newsletter": newsletter, 

40 "agenda_events": events, 

41 "main_partner": Partner.objects.filter(is_main_partner=True).first(), 

42 "local_partners": local_partners, 

43 }, 

44 ) 

45 

46 

47@staff_member_required 

48@permission_required("newsletters.send_newsletter") 

49def admin_send(request, pk): 

50 """If this is a GET request this view will render a confirmation page for the administrator. 

51 

52 If it is a POST request the newsletter will be sent to all recipients. 

53 

54 :param request: the request object 

55 :param pk: the newsletter's primary key 

56 :return: 302 RedirectResponse if POST else 200 with the 

57 confirmation page HTML 

58 """ 

59 newsletter = get_object_or_404(Newsletter, pk=pk) 

60 

61 if newsletter.sent: 

62 return redirect(newsletter) 

63 

64 if request.POST: 

65 services.send_newsletter(newsletter) 

66 

67 return redirect("admin:newsletters_newsletter_changelist") 

68 

69 return render( 

70 request, "newsletters/admin/send_confirm.html", {"newsletter": newsletter} 

71 ) 

72 

73 

74class ImportEventView(FormView): 

75 form_class = NewsletterImportEventForm 

76 template_name = "newsletters/admin/import_events.html" 

77 admin = None 

78 newsletter = None 

79 

80 @property 

81 def success_url(self): 

82 return reverse( 

83 "admin:newsletters_newsletter_change", args=(self.newsletter.pk,) 

84 ) 

85 

86 def get_context_data(self, **kwargs): 

87 context = super().get_context_data(**kwargs) 

88 media = self.admin.media + context["form"].media 

89 context.update( 

90 { 

91 **self.admin.admin_site.each_context(self.request), 

92 "app_label": "newsletters", 

93 "opts": self.newsletter._meta, 

94 "newsletter": self.newsletter, 

95 "title": _("Import events"), 

96 "media": media, 

97 "subtitle": f"{self.newsletter.title} ({self.newsletter.date})", 

98 "adminform": helpers.AdminForm( 

99 context["form"], 

100 ((None, {"fields": context["form"].fields.keys()}),), 

101 {}, 

102 ), 

103 } 

104 ) 

105 return context 

106 

107 def form_valid(self, form): 

108 form.import_events(self.newsletter) 

109 return super().form_valid(form) 

110 

111 def dispatch(self, request, *args, **kwargs): 

112 self.newsletter = get_object_or_404(Newsletter, pk=self.kwargs["pk"]) 

113 return super().dispatch(request, *args, **kwargs)