cleanup contact forms
[edumed.git] / edumed / contact_forms.py
1 # -*- coding: utf-8 -*-
2 from django import forms
3 from django.forms.formsets import BaseFormSet
4
5 from contact.forms import ContactForm
6 from django.utils.translation import ugettext_lazy as _
7
8 WOJEWODZTWA = (
9     u'dolnośląskie',
10     u'kujawsko-pomorskie',
11     u'lubelskie',
12     u'lubuskie',
13     u'łódzkie',
14     u'małopolskie',
15     u'mazowieckie',
16     u'opolskie',
17     u'podkarpackie',
18     u'podlaskie',
19     u'pomorskie',
20     u'śląskie',
21     u'świętokrzyskie',
22     u'warmińsko-mazurskie',
23     u'wielkopolskie',
24     u'zachodniopomorskie',
25 )
26
27 WOJEWODZTWO_CHOICES = [(u'', u'(wybierz)')] + [(w, w) for w in WOJEWODZTWA]
28
29
30 class WTEMStudentForm(forms.Form):
31     first_name = forms.CharField(label=u'Imię', max_length=128)
32     last_name = forms.CharField(label=u'Nazwisko', max_length=128)
33     email = forms.EmailField(label=u'Adres e-mail', max_length=128)
34     form_tag = "student"
35
36
37 class NonEmptyBaseFormSet(BaseFormSet):
38     """
39     Won't allow formset_factory to be submitted with no forms
40     """
41     def clean(self):
42         for form in self.forms:
43             if form.cleaned_data:
44                 return
45         forms.ValidationError(u"Proszę podać dane przynajmniej jednej osoby.")
46
47
48 class CommissionForm(forms.Form):
49     name = forms.CharField(label=u'Imię i nazwisko Członka Komisji', max_length=128)
50     form_tag = "commission"
51
52
53 class OlimpiadaForm(ContactForm):
54     disabled = False
55     disabled_template = 'wtem/disabled_contact_form.html'
56     form_tag = "olimpiada"
57     form_title = u"Olimpiada Cyfrowa - Elektroniczny System Zgłoszeń"
58     submit_label = u"Wyślij zgłoszenie"
59     admin_list = ['nazwisko', 'school']
60     form_formsets = {
61         'student': forms.formsets.formset_factory(WTEMStudentForm, formset=NonEmptyBaseFormSet),
62         'commission': forms.formsets.formset_factory(CommissionForm),
63     }
64
65     contact = forms.EmailField(label=u'Adres e-mail Przewodniczącego/Przewodniczącej', max_length=128)
66     przewodniczacy = forms.CharField(label=u'Imię i nazwisko Przewodniczącego/Przewodniczącej', max_length=128)
67     school = forms.CharField(label=u'Nazwa szkoły', max_length=255)
68     school_address = forms.CharField(label=u'Adres szkoły', widget=forms.Textarea, max_length=1000)
69     school_wojewodztwo = forms.ChoiceField(label=u'Województwo', choices=WOJEWODZTWO_CHOICES)
70     school_email = forms.EmailField(label=u'Adres e-mail szkoły', max_length=128)
71     school_phone = forms.CharField(label=u'Numer telefonu szkoły', max_length=32)
72     school_www = forms.URLField(label=u'Strona WWW szkoły', max_length=255, required=False)
73
74     zgoda_regulamin = forms.BooleanField(
75         label=u'Znam i akceptuję Regulamin Olimpiady Cyfrowej.',
76         help_text=u'Zobacz <a href="https://olimpiadacyfrowa.pl/regulamin/" target="_blank">'
77                   u'regulamin Olimpiady Cyfrowej</a>.'
78     )
79     zgoda_dane = forms.BooleanField(
80         label=u'Oświadczam, że wyrażam zgodę na przetwarzanie danych osobowych zawartych w niniejszym formularzu '
81               u'zgłoszeniowym przez Fundację Nowoczesna Polska (administratora danych) z siedzibą w Warszawie (00-514) '
82               u'przy ul. Marszałkowskiej 84/92 lok. 125 na potrzeby organizacji Olimpiady Cyfrowej. Jednocześnie '
83               u'oświadczam, że zostałam/em poinformowana/y o tym, że mam prawo wglądu w treść swoich danych '
84               u'i możliwość ich poprawiania oraz że ich podanie jest dobrowolne, ale niezbędne do dokonania '
85               u'zgłoszenia.')
86     zgoda_newsletter = forms.BooleanField(
87         label=u'Chcę otrzymywać newsletter: Edukacja medialna', required=False)
88
89     extract_types = (dict(slug='extended', label=_('extended')),)
90
91     @staticmethod
92     def get_extract_fields(contact, extract_type_slug):
93         fields = contact.body.keys()
94         if 'student' in fields:
95             fields.remove('student')
96         fields.extend(['contact', 'student_first_name', 'student_last_name', 'student_email'])
97         return fields
98
99     @staticmethod
100     def get_extract_records(keys, contact, extract_type_slug):
101         toret = [{}]
102         for field_name in keys:
103             if field_name.startswith('student_'):
104                 continue
105             if field_name == 'contact':
106                 val = contact.contact
107             else:
108                 val = contact.body[field_name]
109             toret[0][field_name] = val
110
111         current = toret[0]
112         if 'student' in contact.body:
113             for student in contact.body['student']:
114                 for attr in ('first_name', 'last_name', 'email'):
115                     current['student_' + attr] = student[attr]
116                 if current not in toret:
117                     toret.append(current)
118                 current = {}
119         return toret
120
121     def save(self, request, formsets=None):
122         from wtem.models import Confirmation
123         contact = super(OlimpiadaForm, self).save(request, formsets)
124
125         for formset in formsets or []:
126             if formset.prefix == 'student':
127                 for f in formset.forms:
128                     email = f.cleaned_data.get('email', None)
129                     if email:
130                         try:
131                             Confirmation.objects.get(email=email)
132                         except Confirmation.DoesNotExist:
133                             first_name = f.cleaned_data.get('first_name', None)
134                             last_name = f.cleaned_data.get('last_name', None)
135                             if first_name and last_name:
136                                 confirmation = Confirmation.create(
137                                     first_name=first_name, last_name=last_name, email=email, contact=contact)
138                                 confirmation.send_mail()
139         return contact