update registration form
[edumed.git] / edumed / contact_forms.py
index 022b02d..764c433 100644 (file)
@@ -1,10 +1,13 @@
 # -*- coding: utf-8 -*-
 from django import forms
 from django.forms.formsets import BaseFormSet
+from django.utils.safestring import mark_safe
 
 from contact.forms import ContactForm
 from django.utils.translation import ugettext_lazy as _
 
+from wtem.models import TeacherConfirmation, Confirmation
+
 WOJEWODZTWA = (
     u'dolnośląskie',
     u'kujawsko-pomorskie',
@@ -27,12 +30,35 @@ WOJEWODZTWA = (
 WOJEWODZTWO_CHOICES = [(u'', u'(wybierz)')] + [(w, w) for w in WOJEWODZTWA]
 
 
+def make_data_processing(middle_text):
+    return mark_safe(u'''\
+Administratorem danych osobowych jest Fundacja Nowoczesna Polska (ul. Marszałkowska 84/92 lok. 125, 00-514 Warszawa). \
+Podanie danych osobowych jest dobrowolne. %s Osobom, których dane są zbierane, przysługuje prawo dostępu do treści \
+swoich danych oraz ich poprawiania. Więcej informacji w <a href="https://nowoczesnapolska.org.pl/prywatnosc/">\
+polityce prywatności</a>.''' % middle_text)
+
+
+class ReminderForm(ContactForm):
+    form_tag = 'nie-przegap-2018'
+    form_title = u'Rejestracja. Nie przegap terminu!'
+    contact = forms.EmailField(label=u'Adres e-mail', max_length=128)
+    data_processing = make_data_processing(
+        u'Dane są przetwarzane w zakresie niezbędnym do wysłania powiadomienia odbiorcom.')
+    submit_label = u'Wyślij'
+
+
 class WTEMStudentForm(forms.Form):
     first_name = forms.CharField(label=u'Imię', max_length=128)
     last_name = forms.CharField(label=u'Nazwisko', max_length=128)
     email = forms.EmailField(label=u'Adres e-mail', max_length=128)
     form_tag = "student"
 
+    def clean_email(self):
+        email = self.cleaned_data['email']
+        if Confirmation.objects.filter(email=email):
+            raise forms.ValidationError(u'Uczeń z tym adresem już został zgłoszony.')
+        return email
+
 
 class NonEmptyBaseFormSet(BaseFormSet):
     """
@@ -45,13 +71,31 @@ class NonEmptyBaseFormSet(BaseFormSet):
         forms.ValidationError(u"Proszę podać dane przynajmniej jednej osoby.")
 
 
+class StudentFormset(forms.formsets.formset_factory(WTEMStudentForm, formset=NonEmptyBaseFormSet)):
+    def clean(self):
+        from django.forms.util import ErrorList
+        super(StudentFormset, self).clean()
+
+        emails = set()
+        for form in self.forms:
+            if not form.is_valid():
+                continue
+            if form.cleaned_data:
+                email = form.cleaned_data['email']
+                if email in emails:
+                    errors = form._errors.setdefault('email', ErrorList())
+                    errors.append(u'Każdy zgłoszony uczeń powinien mieć własny adres email')
+                else:
+                    emails.add(email)
+
+
 class CommissionForm(forms.Form):
     name = forms.CharField(label=u'Imię i nazwisko Członka Komisji', max_length=128)
     form_tag = "commission"
 
 
 class OlimpiadaForm(ContactForm):
-    ends_on = (2017, 11, 17, 0, 5)
+    ends_on = (2018, 11, 14, 0, 5)
     disabled_template = 'wtem/disabled_contact_form.html'
     form_tag = "olimpiada"
     old_form_tags = ["olimpiada-2016"]
@@ -59,13 +103,16 @@ class OlimpiadaForm(ContactForm):
     submit_label = u"Wyślij zgłoszenie"
     admin_list = ['nazwisko', 'school']
     form_formsets = {
-        'student': forms.formsets.formset_factory(WTEMStudentForm, formset=NonEmptyBaseFormSet),
+        'student': StudentFormset,
         'commission': forms.formsets.formset_factory(CommissionForm),
     }
     mailing_field = 'zgoda_newsletter'
 
     contact = forms.EmailField(label=u'Adres e-mail Przewodniczącego/Przewodniczącej', max_length=128)
     przewodniczacy = forms.CharField(label=u'Imię i nazwisko Przewodniczącego/Przewodniczącej', max_length=128)
+    przewodniczacy_phone = forms.CharField(
+        label=u'Numer telefonu Przewodniczącego/Przewodniczącej', max_length=128, required=False,
+        help_text=u'Zadzwonimy tylko w przypadku problemów ze zgłoszeniem.')
     school = forms.CharField(label=u'Nazwa szkoły', max_length=255)
     school_address = forms.CharField(label=u'Adres szkoły', widget=forms.Textarea, max_length=1000)
     school_wojewodztwo = forms.ChoiceField(label=u'Województwo', choices=WOJEWODZTWO_CHOICES)
@@ -120,6 +167,16 @@ class OlimpiadaForm(ContactForm):
                 current = {}
         return toret
 
+    def get_dictionary(self, contact):
+        dictionary = super(OlimpiadaForm, self).get_dictionary(contact)
+        conf = TeacherConfirmation.objects.filter(contact=contact)
+        if conf:
+            confirmation = conf.get()
+        else:
+            confirmation = TeacherConfirmation.create(contact=contact)
+        dictionary['confirmation'] = confirmation
+        return dictionary
+
     def save(self, request, formsets=None):
         from wtem.models import Confirmation
         contact = super(OlimpiadaForm, self).save(request, formsets)