85 lines
3.6 KiB
Python
85 lines
3.6 KiB
Python
# combo - content management system
|
|
# Copyright (C) 2015 Entr'ouvert
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify it
|
|
# under the terms of the GNU Affero General Public License as published
|
|
# by the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Affero General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
import logging
|
|
|
|
from django import forms
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
|
|
class NewslettersManageForm(forms.Form):
|
|
def __init__(self, *args, **kwargs):
|
|
logger = logging.getLogger(__name__)
|
|
self.request = kwargs.pop('request')
|
|
self.user = self.request.user
|
|
self.instance = kwargs.pop('instance')
|
|
self.themes = set()
|
|
super(NewslettersManageForm, self).__init__(*args, **kwargs)
|
|
|
|
# initialize cleane data in order to be able to add errors
|
|
self.cleaned_data = {}
|
|
try:
|
|
newsletters = self.instance.get_newsletters()
|
|
except Exception as e:
|
|
self.add_error(None, _('An error occured while getting newsletters. Please try later.'))
|
|
logger.error('Error occured while getting newsletters: %r', e)
|
|
return
|
|
self.params = {}
|
|
user_name_id = self.user.get_name_id()
|
|
if user_name_id:
|
|
self.params['uuid'] = user_name_id
|
|
|
|
# get mobile number from mellon session as it is not user attribute
|
|
if self.request.session.get('mellon_session'):
|
|
self.params['mobile'] = self.request.session['mellon_session'].get('mobile', '')
|
|
try:
|
|
subscriptions = self.instance.get_subscriptions(self.user, **self.params)
|
|
except Exception as e:
|
|
self.add_error(None, _('An error occured while getting subscriptions. Please try later.'))
|
|
logger.error('Error occured while getting subscriptions: %r', e)
|
|
return
|
|
|
|
for newsletter in newsletters:
|
|
if not self.instance.check_resource(newsletter['text']):
|
|
continue
|
|
choices = []
|
|
initial = []
|
|
for transport in newsletter['transports']:
|
|
if not self.instance.check_transport(transport['id']):
|
|
continue
|
|
self.themes.add((transport['id'], transport['text']))
|
|
choices.append((transport['id'], ''))
|
|
if transport in newsletter['transports']:
|
|
for subscription in subscriptions:
|
|
if subscription['id'] == newsletter['id']:
|
|
initial = [t['id'] for t in subscription['transports']]
|
|
self.fields[newsletter['id']] = \
|
|
forms.MultipleChoiceField(label=newsletter['text'],
|
|
help_text=transport['id'],
|
|
choices=choices, initial=initial,
|
|
widget=forms.CheckboxSelectMultiple(),
|
|
required=False)
|
|
|
|
def save(self):
|
|
self.full_clean()
|
|
subscriptions = []
|
|
for key, value in self.cleaned_data.items():
|
|
subscriptions.append({
|
|
'id': key,
|
|
'transports': value
|
|
})
|
|
self.instance.set_subscriptions(subscriptions, self.user, **self.params)
|