Source code for newsletters.views
"""Views provided by the newsletters package"""
import os
from django.conf import settings
from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.auth.decorators import permission_required
from django.shortcuts import get_object_or_404, redirect, render
from django.utils.translation import activate, get_language_info
from django_sendfile import sendfile
from newsletters import services
from newsletters.models import Newsletter
from partners.models import Partner
[docs]def preview(request, pk, lang=None):
"""
View that renders the newsletter as HTML
:param request: the request object
:param pk: the newsletter's primary key
:param lang: the language of the render
:return: HttpResponse 200 containing the newsletter HTML
"""
lang_code = request.LANGUAGE_CODE
if lang is not None:
try:
get_language_info(lang)
activate(lang)
lang_code = lang
except KeyError:
# Language code not recognised by get_language_info
pass
# Send cached file, if it exists
file_path = os.path.join(
settings.MEDIA_ROOT, "newsletters", f"{pk}_{lang_code}.html"
)
if os.path.isfile(file_path):
return sendfile(request, file_path)
newsletter = get_object_or_404(Newsletter, pk=pk)
events = services.get_agenda(newsletter.date) if newsletter.date else None
return render(
request,
"newsletters/email.html",
{
"newsletter": newsletter,
"agenda_events": events,
"main_partner": Partner.objects.filter(is_main_partner=True).first(),
"local_partner": Partner.objects.filter(is_local_partner=True).first(),
"lang_code": lang_code,
},
)
[docs]@staff_member_required
@permission_required("newsletters.send_newsletter")
def admin_send(request, pk):
"""
If this is a GET request this view will render a confirmation
page for the administrator. If it is a POST request the newsletter
will be sent to all recipients
:param request: the request object
:param pk: the newsletter's primary key
:return: 302 RedirectResponse if POST else 200 with the
confirmation page HTML
"""
newsletter = get_object_or_404(Newsletter, pk=pk)
if newsletter.sent:
return redirect(newsletter)
if request.POST:
services.send_newsletter(newsletter)
return redirect("admin:newsletters_newsletter_changelist")
else:
return render(
request, "newsletters/admin/send_confirm.html", {"newsletter": newsletter}
)