Mercurial > sat_legacy_website
view sat_website/forms.py @ 41:1a0f24401866
send adhesion form results via email to the admins and the new member
author | souliane <souliane@mailoo.org> |
---|---|
date | Tue, 03 Feb 2015 15:15:59 +0100 |
parents | dfe7139dae0a |
children | d721c8ffa22a |
line wrap: on
line source
#!/usr/bin/python # -*- coding: utf-8 -*- """ SàT website: Salut à Toi's presentation website Copyright (C) 2012 Jérôme Poisson (goffi@goffi.org) This file is part of SàT website. SàT website 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. Foobar 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 Foobar. If not, see <http://www.gnu.org/licenses/>. """ from django.utils.translation import ugettext_lazy as _, string_concat, get_language from django.utils.html import format_html from django.core.mail import send_mail from django import forms from django.conf import settings from collections import OrderedDict from email import email import utils ## Fields ## class Section(forms.Field): def __init__(self, *args, **kwargs): kwargs['required'] = False super(Section, self).__init__(*args, **kwargs) class BooleanField(forms.BooleanField): def __init__(self, *args, **kwargs): super(BooleanField, self).__init__(*args, **kwargs) class CharField(forms.CharField): def __init__(self, label=None, *args, **kwargs): try: placeholder = kwargs.pop('placeholder') except KeyError: placeholder = label super(CharField, self).__init__(*args, **kwargs) self.widget.attrs.update({'class': "form-control", 'placeholder': placeholder}) class EmailField(forms.EmailField): def __init__(self, *args, **kwargs): super(EmailField, self).__init__(*args, **kwargs) self.widget.attrs.update({'class': "form-control", 'placeholder': self.label}) class ChoiceField(forms.ChoiceField): def __init__(self, *args, **kwargs): super(ChoiceField, self).__init__(*args, **kwargs) self.widget.attrs.update({'class': "form-control"}) def choice_label(self, value): """Return the label corresponding to the given value. @param value (unicode): a choice value @return: unicode """ for current_value, label in self.choices: if unicode(current_value) == unicode(value): return unicode(label) return u'' ## Forms ## class RegistrationForm(forms.Form): section_1 = Section(label=_(u'Identity')) name = CharField(label=_(u'Name')) surname = CharField(label=_(u'Surname')) address = CharField(label=_(u'Address, postal code, municipality')) section_2 = Section(label=_(u'Contacts')) email = EmailField(label=_(u'Email address')) email_confirmation = EmailField(label=_(u'Email address confirmation')) jid = EmailField(required=False, label=_(u'Jabber ID (for example your SàT login)')) section_3 = Section(label=_(u'Subscription')) subscription_amount = ChoiceField(choices=[(amount, u"%s €" % amount) for amount in utils.get_asso_subscr_amounts()]) section_3b = Section(label="") payment_method = ChoiceField(choices=[(u"card", _(u"Credit or debit card")), (u"transfer", _(u"Bank transfer"))], help_text=_(u'Choose "Credit or debit card" to pay via CB, Visa or Mastercard using a secure banking service. Choose "Bank transfer" to proceed manually with the association\'s IBAN/BIC numbers. For both methods, we will first send you an email containing all the details.'), widget=forms.RadioSelect) section_5 = Section(label=_(u'Reference')) ref = CharField(required=False, label=_(u"Reference"), placeholder=_(u"Adherent number in case of a renewal")) section_6 = Section(label=_(u'Comment')) comment = CharField(required=False, label=_(u"Comment"), placeholder="", widget=forms.Textarea(attrs={'rows': 3})) def html_link(url, label): return string_concat('<a target="#" href="', url, '">', label, '</a>') agreement_label = [_(u"I read the "), html_link(settings.ASSO_URL_STATUTES, _(u"Statutes")), _(u" and "), html_link(settings.ASSO_URL_RULES, _(u"Rules")), _(u" of the association, and agree to both of them."), ] agreement_confirmation = BooleanField(label=string_concat(*agreement_label)) def sections(self): """Get the fields grouped in sections. @return: OrderedDict binding section name to a list of fields """ sections = OrderedDict() current_section = None for field in self: if isinstance(field.field, Section): current_section = sections.setdefault(field.label, []) else: current_section.append(field) return sections def results(self, user_readable=True): """Get the results submitted by the user as a list of couple. Keep the pertinent fields and filter out the inappropriate ones. @param user_readable: set to True to prefer the field labels to their names @return: list of couple (name, value) or (label, value) """ if not self.is_valid(): return '' results = [] for field in self: if isinstance(field.field, Section): continue if field.name in ('email_confirmation', 'agreement_confirmation') or not field.value(): continue if field.name == "payment_method" and self['subscription_amount'].value() == "0": continue value = field.value() if user_readable: if isinstance(field.field, ChoiceField): value = field.field.choice_label(value) results.append((field.label, value)) else: results.append((field.name, value)) if user_readable: results.append((_(u'Language'), utils.get_language_name_local(get_language()))) else: results.append(('lang', get_language())) return results def result_as_string(self, user_readable=True): """Get the result as a string to be sent for example via email. @param user_readable: set to True to prefer the field labels to their names @return: list of couple (name, value) or (label, value) """ return '\n'.join([name + ': ' + value for name, value in self.results(user_readable)]) def process_submitted_data(self): if not self.is_valid(): return # send email to user send_mail(_(u'Inscription à Salut à Toi'), self.result_as_string(True), settings.EMAIL_BACKEND, [self['email'].value()], fail_silently=False) # send email to admins send_mail(_(u'Inscription à Salut à Toi'), self.result_as_string(False), settings.EMAIL_BACKEND, [email for name, email in settings.ADMINS], fail_silently=False)