diff 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 diff
--- a/sat_website/forms.py	Tue Feb 03 15:14:42 2015 +0100
+++ b/sat_website/forms.py	Tue Feb 03 15:15:59 2015 +0100
@@ -21,8 +21,9 @@
 along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 """
 
-from django.utils.translation import ugettext_lazy as _, string_concat
+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
@@ -64,7 +65,18 @@
         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 ##
 
 
@@ -81,10 +93,10 @@
     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, "%s €" % amount) for amount in utils.get_asso_subscr_amounts()])
+    subscription_amount = ChoiceField(choices=[(amount, u"%s €" % amount) for amount in utils.get_asso_subscr_amounts()])
 
     section_3b = Section(label="")
-    payment_method = ChoiceField(choices=[("card", _(u"Credit or debit card")), ("transfer", _(u"Bank transfer"))],
+    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'))
@@ -105,6 +117,10 @@
     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:
@@ -113,3 +129,50 @@
             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)