Source code for mailing_lists.views

__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"


import csv

from django.contrib import messages
from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.http import HttpResponse
from django.views.generic import UpdateView
from django.views.generic.list import ListView
from django.urls import reverse
from django.shortcuts import redirect, get_object_or_404

from invitations.models import RegistrationInvitation

from .forms import MailchimpUpdateForm
from .models import MailchimpList


[docs]class MailchimpMixin(LoginRequiredMixin, PermissionRequiredMixin): permission_required = 'scipost.can_manage_mailchimp' raise_exception = True
[docs]class MailchimpListView(MailchimpMixin, ListView): """ List all lists of Mailchimp known to the current database. This is part of the editorial actions for SciPost Administrators. It should act as a main page from which the admin can to action to update some general mailchimp settings. """ template_name = 'mailing_lists/overview.html' model = MailchimpList
[docs]@login_required @permission_required('scipost.can_manage_mailchimp', raise_exception=True) def syncronize_lists(request): """ Syncronize the Mailchimp lists in the database with the lists known in the mailchimp account which is related to the API_KEY. """ form = MailchimpUpdateForm() updated = form.sync() messages.success(request, '%i mailing lists have succesfully been updated.' % updated) return redirect(reverse('mailing_lists:overview'))
[docs]@login_required @permission_required('scipost.can_read_all_privacy_sensitive_data', raise_exception=True) def export_non_registered_invitations(request): """ Syncronize the Mailchimp lists in the database with the lists known in the mailchimp account which is related to the API_KEY. """ invitations = RegistrationInvitation.objects.declined_or_without_response() response = HttpResponse(content_type='text/csv') filename = "export_{timestamp}_non_registered_invitations.csv".format(timestamp='') response['Content-Disposition'] = 'attachment; filename={filename}'.format(filename=filename) writer = csv.writer(response) writer.writerow(['Email address', 'First Name', 'Last Name']) for invitation in invitations: writer.writerow([invitation.email, invitation.first_name, invitation.last_name]) return response
[docs]@login_required @permission_required('scipost.can_manage_mailchimp', raise_exception=True) def syncronize_members(request, list_id): """ Syncronize the Mailchimp lists in the database with the lists known in the mailchimp account which is related to the API_KEY. """ _list = get_object_or_404(MailchimpList, mailchimp_list_id=list_id) form = MailchimpUpdateForm() unsubscribed, subscribed, response = form.sync_members(_list) # Let the user know text = '<h3>Syncronize members complete.</h3>' if unsubscribed: text += '<br>%i members have succesfully been unsubscribed.' % unsubscribed if subscribed: text += '<br>%i members have succesfully been subscribed.' % subscribed messages.success(request, text) return redirect(_list.get_absolute_url() + '?bulkid=' + response.get('id'))
[docs]class ListDetailView(MailchimpMixin, UpdateView): """ The detail view of a certain Mailchimp list. This allows the admin to i.e. manage group permissions to the group. """ slug_field = 'mailchimp_list_id' slug_url_kwarg = 'list_id' fields = ('allowed_groups', 'internal_name', 'open_for_subscription') model = MailchimpList
[docs] def form_valid(self, form): messages.success(self.request, 'List succesfully updated') return super().form_valid(form)