show required extensions
[edumed.git] / edumed / contact_forms.py
index 507c6d1..b9c708e 100644 (file)
@@ -1,87 +1,50 @@
 # -*- 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 _
 
-
-class RegistrationForm(ContactForm):
-    form_tag = 'sugestie'
-    form_title = u"Zgłoś sugestię"
-    admin_list = ['podpis', 'contact', 'temat']
-
-    contact = forms.EmailField(label=u'E-mail', max_length=128, required=False)
-    podpis = forms.CharField(label=u'Podpis', max_length=128, required=False)
-    temat = forms.CharField(label=u'Temat zgłoszenia', max_length=255)
-    tresc = forms.CharField(label=u'Treść', widget=forms.Textarea, max_length=1800)
-
-
-class CooperateForm(ContactForm):
-    form_tag = 'wspolpraca'
-    form_title = u"Bądź z nami w kontakcie"
-    admin_list = ['podpis', 'contact']
-
-    podpis = forms.CharField(label=u'Imię i nazwisko', max_length=128)
-    contact = forms.EmailField(label=u'E-mail', max_length=128)
-    instytucja = forms.CharField(label=u'Instytucja (nazwa, adres)', 
-            widget=forms.Textarea, max_length=1000, required=False)
-    uwagi = forms.CharField(label=u'Uwagi', widget=forms.Textarea, max_length=1800, required=False)
-        
-    zajecia_przedszkole = forms.BooleanField(label=u'Prowadzę zajęcia z dziećmi w wieku przedszkolnym', required=False)
-    zajecia_sp13 = forms.BooleanField(label=u'Prowadzę zajęcia z dziećmi z SP kl. 1-3', required=False)
-    zajecia_sp46 = forms.BooleanField(label=u'Prowadzę zajęcia z dziećmi z SP kl. 4-6', required=False)
-    zajecia_gimnazjum = forms.BooleanField(label=u'Prowadzę zajęcia z młodzieżą w wieku gimnazjalnym', required=False)
-    zajecia_ponadgimnazjalne = forms.BooleanField(label=u'Prowadzę zajęcia z młodzieżą ze szkół ponadgimnazjalnych', required=False)
-    zajecia_wyzsze = forms.BooleanField(label=u'Prowadzę zajęcia w szkole wyższej', required=False)
-    zajecia_dorosli = forms.BooleanField(label=u'Prowadzę zajęcia dla dorosłych', required=False)
-    zajecia_seniorzy = forms.BooleanField(label=u'Prowadzę zajęcia dla seniorów', required=False)
-
-
-class ContestForm(ContactForm):
-    form_tag = 'konkurs'
-    form_title = u"Zgłoś się do konkursu"
-    admin_list = ['nazwisko', 'instytucja', 'tytul']
-
-    nazwisko = forms.CharField(label=u'Imię i nazwisko', max_length=128)
-    contact = forms.EmailField(label=u'Adres e-mail', max_length=128)
-    instytucja = forms.CharField(label=u'Instytucja (nazwa, adres)', 
-            widget=forms.Textarea, max_length=1000)
-    tytul = forms.CharField(label=u'Tytuł przeprowadzonej lekcji',
-            help_text=u'proszę wymienić wszystkie, jeśli zostały przeprowadzone więcej niż jedne zajęcia', 
-            widget=forms.Textarea, max_length=1000)
-    uczestnicy = forms.CharField(label=u'Liczba uczestników', max_length=64)
-    trudnosci = forms.CharField(label=u'Czy w trakcie zajęć pojawiły się jakieś trudności? Jeśli tak, to jakie?', 
-            widget=forms.Textarea, max_length=2000)
-    pomocne = forms.CharField(label=u'Co w materiałach okazało się najbardziej pomocne w przygotowaniu i prowadzeniu lekcji?', 
-            widget=forms.Textarea, max_length=2000)
-    nieprzydatne = forms.CharField(label=u'Co w materiałach okazało się nieprzydatne w przygotowaniu i prowadzeniu lekcji?', 
-            widget=forms.Textarea, max_length=2000)
-    poprawic = forms.CharField(label=u'Jak możemy poprawić serwis edukacjamedialna.edu.pl?', 
-            widget=forms.Textarea, max_length=2000,
-            required=False)
-    inne = forms.CharField(label=u'Inne uwagi i komentarze', 
-            widget=forms.Textarea, max_length=2000,
-            required=False)
-    zgoda_regulamin = forms.BooleanField(
-        label=u'Znam i akceptuję regulamin konkursu Medialog.',
-        help_text=u'Zobacz <a href="/media/chunks/attachment/Regulamin_konkursu_MediaLog_1.pdf">regulamin konkursu MediaLog</a>.'
-    )
-    zgoda_informacje = forms.BooleanField(
-        label=u'Wyrażam zgodę na otrzymywanie informacji od Fundacji Nowoczesna Polska związanych z edukacją medialną.',
-        required=False
-    )
-
-
-class UdzialForm(ContactForm):
-    form_tag = 'udzial'
-    form_title = u"Udział"
-    admin_list = ['nazwisko', 'miejscowosc', 'instytucja']
-
-    nazwisko = forms.CharField(label=u'Imię i nazwisko', max_length=128)
-    miejscowosc = forms.CharField(label=u'Miejscowość', max_length=128)
-    instytucja = forms.CharField(label=u'Nazwa organizacji/instytucji', max_length=128)
+from wtem.models import TeacherConfirmation, Confirmation
+
+WOJEWODZTWA = (
+    u'dolnośląskie',
+    u'kujawsko-pomorskie',
+    u'lubelskie',
+    u'lubuskie',
+    u'łódzkie',
+    u'małopolskie',
+    u'mazowieckie',
+    u'opolskie',
+    u'podkarpackie',
+    u'podlaskie',
+    u'pomorskie',
+    u'śląskie',
+    u'świętokrzyskie',
+    u'warmińsko-mazurskie',
+    u'wielkopolskie',
+    u'zachodniopomorskie',
+)
+
+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)
-    telefon = forms.CharField(label=u'Telefon', max_length=32)
-    uczestnicy = forms.IntegerField(label=u'Przewidywana liczba uczestników zajęć')
+    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):
@@ -90,7 +53,19 @@ class WTEMStudentForm(forms.Form):
     email = forms.EmailField(label=u'Adres e-mail', max_length=128)
     form_tag = "student"
 
-class NoEmptyFormsAllowedBaseFormSet(forms.formsets.BaseFormSet):
+    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 WTEMStudentUpdateForm(WTEMStudentForm):
+    def clean_email(self):
+        return self.cleaned_data['email']
+
+
+class NonEmptyBaseFormSet(BaseFormSet):
     """
     Won't allow formset_factory to be submitted with no forms
     """
@@ -98,72 +73,164 @@ class NoEmptyFormsAllowedBaseFormSet(forms.formsets.BaseFormSet):
         for form in self.forms:
             if form.cleaned_data:
                 return
-        raise forms.ValidationError(u"Proszę podać dane przynajmniej jednego ucznia.")
+        forms.ValidationError(u"Proszę podać dane przynajmniej jednej osoby.")
 
-class WTEMForm(ContactForm):
-    form_tag = "wtem"
-    form_title = u"WTEM - rejestracja uczestników"
-    submit_label = u"Wyślij zgłoszenie"
-    form_formsets = (forms.formsets.formset_factory(WTEMStudentForm, formset=NoEmptyFormsAllowedBaseFormSet),)
-
-    contact = forms.EmailField(label=u'Adres e-mail opiekuna/opiekunki', max_length=128)
-    imie = forms.CharField(label=u'Imię', max_length=128)
-    nazwisko = forms.CharField(label=u'Nazwisko', max_length=128)
-    function = forms.CharField(label=u'Pełniona funkcja', max_length=255)
-    institution = forms.CharField(label=u'Nazwa instytucji', max_length=255)
-    institution_address = forms.CharField(label=u'Adres instytucji', widget=forms.Textarea, max_length=1000)
-    institution_email = forms.EmailField(label=u'Adres e-mail instytucji', max_length=128)
-    institution_phone = forms.CharField(label=u'Telefon do instytucji', max_length=32)
-    institution_www = forms.URLField(label=u'Strona WWW instytucji', max_length=255, required=False)
 
-    zgoda_regulamin = forms.BooleanField(
-        label=u'Znam i akceptuję regulamin Wielkiego Turnieju Edukacji Medialnej.',
-        help_text=u'Zobacz <a href="/media/chunks/attachment/WTEM_regulamin_1.pdf">regulamin Wielkiego Turnieju Edukacji Medialnej</a>.'
-    )
-    potw_uczniowie = forms.BooleanField(
-        label=u'Potwierdzam, że zgłoszeni Uczestnicy/Uczestniczki w chwili rejestracji są uczniami/uczennicami szkoły ponadgimnazjalnej.',
-    )
-    zgoda_informacje = forms.BooleanField(
-        label=u'Wyrażam zgodę na otrzymywanie informacji od Fundacji Nowoczesna Polska związanych z edukacją medialną.',
-        required=False
-    )
+class StudentBaseFormSet(NonEmptyBaseFormSet):
+    def check_unique_emails(self):
+        from django.forms.util import ErrorList
 
-class MILForm(ContactForm):
-    form_tag = 'mil'
-    form_title = _('Share your thoughts on the "Media and information literacy competencies catalogue"')
-    submit_label = _('Submit')
-    base_template = 'base_mil.html'
-    site_name = site_domain = 'katalog.nowoczesnapolska.org.pl'
+        emails = set()
+        for form in self.forms:
+            if not form.is_valid():
+                continue
+            if form.cleaned_data:
+                email = form.cleaned_data['email']
+                instance = getattr(self, 'instance', None)
+                if email in emails:
+                    errors = form._errors.setdefault('email', ErrorList())
+                    errors.append(u'Każdy zgłoszony uczeń powinien mieć własny adres email')
+                elif instance and Confirmation.objects.exclude(contact=instance).filter(email=email).exists():
+                    errors = form._errors.setdefault('email', ErrorList())
+                    errors.append(u'Uczeń z tym adresem już został zgłoszony w innym formularzu.')
+                else:
+                    emails.add(email)
 
-    name = forms.CharField(label = _('Name and Surname'), max_length = 255)
-    contact = forms.EmailField(label = _('E-mail'), max_length = 255)
+    def clean(self):
+        super(StudentBaseFormSet, self).clean()
+        self.check_unique_emails()
 
-    institution = forms.CharField(label =_('Institution'), widget = forms.Textarea, max_length = 8192)
 
-    question_stages = forms.CharField(
-        label = _('What do you think about the proposed educational stages classification?'),
-        widget = forms.Textarea,
-        max_length = 255,
-        required = False
-    )
+class StudentUpdateFormSet(StudentBaseFormSet):
+    takes_instance = True
 
-    question_fields = forms.CharField(
-        label = _('What do you think about the proposed thematic fields?'),
-        widget = forms.Textarea,
-        max_length = 255,
-        required = False
-    )
+    def __init__(self, *args, **kwargs):
+        instance = kwargs.pop('instance', None)
+        super(StudentUpdateFormSet, self).__init__(*args, **kwargs)
+        self.instance = instance
+
+    def clean(self):
+        super(StudentUpdateFormSet, self).clean()
+        self.check_unique_emails()
+
+
+class CommissionForm(forms.Form):
+    name = forms.CharField(label=u'Imię i nazwisko Członka Komisji', max_length=128)
+    form_tag = "commission"
 
-    question_left_out = forms.CharField(
-        label = _('What important areas of media and information literacy have been left out?'),
-        widget = forms.Textarea,
-        max_length = 255,
-        required = False
-    )
 
-    other = forms.CharField(
-        label = _('Other suggestions and comments'),
-        widget = forms.Textarea,
-        max_length = 255,
-        required = False
+class OlimpiadaForm(ContactForm):
+    ends_on = (2018, 11, 10, 0, 5)
+    disabled_template = 'wtem/disabled_contact_form.html'
+    form_tag = "olimpiada"
+    old_form_tags = ["olimpiada-2016", "olimpiada-2017"]
+    form_title = u"Olimpiada Cyfrowa - Elektroniczny System Zgłoszeń"
+    submit_label = u"Wyślij zgłoszenie"
+    admin_list = ['nazwisko', 'school']
+    form_formsets = {
+        'student': forms.formsets.formset_factory(WTEMStudentForm, formset=StudentBaseFormSet),
+        'commission': forms.formsets.formset_factory(CommissionForm),
+    }
+    mailing_field = 'zgoda_newsletter'
+    confirmation_class = TeacherConfirmation
+
+    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,
+        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)
+    school_email = forms.EmailField(label=u'Adres e-mail szkoły', max_length=128)
+    school_phone = forms.CharField(label=u'Numer telefonu szkoły', max_length=32)
+    school_www = forms.URLField(label=u'Strona WWW szkoły', max_length=255, required=False)
+
+    zgoda_regulamin = forms.BooleanField(
+        label=u'Znam i akceptuję Regulamin Olimpiady Cyfrowej.',
+        help_text=u'Zobacz <a href="https://olimpiadacyfrowa.pl/regulamin/" target="_blank">'
+                  u'regulamin Olimpiady Cyfrowej</a>.'
     )
+    zgoda_dane = forms.BooleanField(
+        label=u'Oświadczam, że wyrażam zgodę na przetwarzanie danych osobowych zawartych w niniejszym formularzu '
+              u'zgłoszeniowym przez Fundację Nowoczesna Polska (administratora danych) z siedzibą w Warszawie (00-514) '
+              u'przy ul. Marszałkowskiej 84/92 lok. 125 na potrzeby organizacji Olimpiady Cyfrowej. Jednocześnie '
+              u'oświadczam, że zostałam/em poinformowana/y o tym, że mam prawo wglądu w treść swoich danych '
+              u'i możliwość ich poprawiania oraz że ich podanie jest dobrowolne, ale niezbędne do dokonania '
+              u'zgłoszenia.')
+    zgoda_newsletter = forms.BooleanField(
+        label=u'Chcę otrzymywać newsletter: Edukacja medialna', required=False)
+
+    extract_types = (dict(slug='extended', label=_('extended')),)
+
+    @staticmethod
+    def get_extract_fields(contact, extract_type_slug):
+        fields = contact.body.keys()
+        if 'student' in fields:
+            fields.remove('student')
+        fields.extend(['contact', 'student_first_name', 'student_last_name', 'student_email'])
+        return fields
+
+    @staticmethod
+    def get_extract_records(keys, contact, extract_type_slug):
+        toret = [{}]
+        for field_name in keys:
+            if field_name.startswith('student_'):
+                continue
+            if field_name == 'contact':
+                val = contact.contact
+            else:
+                val = contact.body[field_name]
+            toret[0][field_name] = val
+
+        current = toret[0]
+        if 'student' in contact.body:
+            for student in contact.body['student']:
+                for attr in ('first_name', 'last_name', 'email'):
+                    current['student_' + attr] = student[attr]
+                if current not in toret:
+                    toret.append(current)
+                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)
+
+        for formset in formsets or []:
+            if formset.prefix == 'student':
+                for f in formset.forms:
+                    email = f.cleaned_data.get('email', None)
+                    if email:
+                        try:
+                            confirmation = Confirmation.objects.get(email=email)
+                        except Confirmation.DoesNotExist:
+                            first_name = f.cleaned_data.get('first_name', None)
+                            last_name = f.cleaned_data.get('last_name', None)
+                            if first_name and last_name:
+                                confirmation = Confirmation.create(
+                                    first_name=first_name, last_name=last_name, email=email, contact=contact)
+                                confirmation.send_mail()
+                        else:
+                            confirmation.first_name = f.cleaned_data.get('first_name', None)
+                            confirmation.last_name = f.cleaned_data.get('last_name', None)
+                            confirmation.save()
+        return contact
+
+
+class OlimpiadaUpdateForm(OlimpiadaForm):
+    form_type = 'update'
+    form_formsets = {
+        'student': forms.formsets.formset_factory(WTEMStudentUpdateForm, formset=StudentUpdateFormSet),
+        'commission': forms.formsets.formset_factory(CommissionForm),
+    }