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
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1"""Views provided by the newsletters package."""
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
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
20def preview(request, pk, lang=None):
21 """View that renders the newsletter as HTML.
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)
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))
32 events = services.get_agenda(newsletter.date) if newsletter.date else None
33 local_partners = services.split_local_partners()
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 )
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.
52 If it is a POST request the newsletter will be sent to all recipients.
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)
61 if newsletter.sent:
62 return redirect(newsletter)
64 if request.POST:
65 services.send_newsletter(newsletter)
67 return redirect("admin:newsletters_newsletter_changelist")
69 return render(
70 request, "newsletters/admin/send_confirm.html", {"newsletter": newsletter}
71 )
74class ImportEventView(FormView):
75 form_class = NewsletterImportEventForm
76 template_name = "newsletters/admin/import_events.html"
77 admin = None
78 newsletter = None
80 @property
81 def success_url(self):
82 return reverse(
83 "admin:newsletters_newsletter_change", args=(self.newsletter.pk,)
84 )
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
107 def form_valid(self, form):
108 form.import_events(self.newsletter)
109 return super().form_valid(form)
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)