1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- # -*- coding: utf-8 -*-
- from __future__ import unicode_literals
- from django.contrib import messages
- from django.contrib.auth.decorators import login_required
- from django import forms
- from django.forms import formset_factory
- from django.shortcuts import render, redirect
- from .models import MaillingList, MaillingListSubscription, SyncCommandError
- from coin.members.models import Member
- class SubscriptionForm(forms.Form):
- subscribed = forms.BooleanField(widget=forms.Select(choices=(
- (True, 'Abonné·e'),
- (False, 'Non abonné·e'),
- )), required=False)
- maillinglist = forms.ModelChoiceField(
- queryset=MaillingList.objects.all(),
- widget=forms.HiddenInput,
- )
- class Meta:
- widgets = {
- 'subscribed': forms.Select
- }
- SubscriptionFormSet = formset_factory(SubscriptionForm, extra=0)
- class MemberSubscriptionsForm(forms.ModelForm):
- class Meta:
- model = Member
- fields = []
- @login_required
- def lists_list(request):
- if request.method == 'POST':
- formset = SubscriptionFormSet(request.POST, request.FILES)
- if formset.is_valid():
- # we do proper add/remove instead of clearing and setting to take
- # care of acurate signal sending (cf signal receivers in models.py).
- new_subscriptions = set(
- i['maillinglist']
- for i in formset.cleaned_data
- if i['subscribed']
- )
- old_subscriptions = set(request.user.subscribed_maillinglists.all())
- try:
- # add
- for mail_list in new_subscriptions - old_subscriptions:
- MaillingListSubscription.objects.create(member=request.user, maillinglist=mail_list)
- # remove
- to_remove = old_subscriptions - new_subscriptions
- MaillingListSubscription.objects.filter(member=request.user, maillinglist__in=to_remove).delete()
- except SyncCommandError as e:
- messages.error(
- request,
- "Impossible de sauvegarder tes abonnements. "
- "Contacte les administrateur·ice·s système pour "
- "qu'iels voient ce qui se passe… \n"
- "Tes abonnements n'ont **pas** été mis à jour.")
- else:
- if old_subscriptions != new_subscriptions:
- messages.success(
- request,
- 'Tes (dés)abonnements aux listes mail ont été '
- 'pris en compte.')
- else:
- messages.warning(
- request,
- "Vous n'avez modifié aucun abonnement.")
- return redirect('maillists:lists-list')
- else:
- user_subscriptions = request.user.subscribed_maillinglists.all()
- formset = SubscriptionFormSet(initial=[
- {'subscribed': l in user_subscriptions, 'maillinglist': l}
- for l in MaillingList.objects.all()
- ])
- return render(request, 'maillists/maillinglist_list.html', {
- 'formset': formset,
- 'all_lists': MaillingList.objects.all(),
- 'my_lists': request.user.subscribed_maillinglists.all(),
- })
|