29f25b4c60857c93aad65e96d53dda72f2806693
[edumed.git] / edumed / contact_forms.py
1 # -*- coding: utf-8 -*-
2 from django import forms
3 from django.forms.formsets import BaseFormSet
4 from django.utils.safestring import mark_safe
5
6 from contact.forms import ContactForm
7 from django.core.mail import send_mail
8 from django.core.exceptions import ValidationError
9 from django.core.validators import validate_email
10 from django.template.loader import render_to_string
11 from django.utils.translation import ugettext_lazy as _
12
13
14 WOJEWODZTWA = (
15     u'dolnośląskie',
16     u'kujawsko-pomorskie',
17     u'lubelskie',
18     u'lubuskie',
19     u'łódzkie',
20     u'małopolskie',
21     u'mazowieckie',
22     u'opolskie',
23     u'podkarpackie',
24     u'podlaskie',
25     u'pomorskie',
26     u'śląskie',
27     u'świętokrzyskie',
28     u'warmińsko-mazurskie',
29     u'wielkopolskie',
30     u'zachodniopomorskie',
31 )
32
33 WOJEWODZTWO_CHOICES = [(u'', u'(wybierz)')] + [(w, w) for w in WOJEWODZTWA]
34
35
36 class RegistrationForm(ContactForm):
37     form_tag = 'sugestie'
38     form_title = u"Zgłoś sugestię"
39     admin_list = ['podpis', 'contact', 'temat']
40
41     contact = forms.EmailField(label=u'E-mail', max_length=128, required=False)
42     podpis = forms.CharField(label=u'Podpis', max_length=128, required=False)
43     temat = forms.CharField(label=u'Temat zgłoszenia', max_length=255)
44     tresc = forms.CharField(label=u'Treść', widget=forms.Textarea, max_length=1800)
45
46
47 class CooperateForm(ContactForm):
48     form_tag = 'wspolpraca'
49     form_title = u"Bądź z nami w kontakcie"
50     admin_list = ['podpis', 'contact']
51
52     podpis = forms.CharField(label=u'Imię i nazwisko', max_length=128)
53     contact = forms.EmailField(label=u'E-mail', max_length=128)
54     instytucja = forms.CharField(
55         label=u'Instytucja (nazwa, adres)', widget=forms.Textarea, max_length=1000, required=False)
56     uwagi = forms.CharField(label=u'Uwagi', widget=forms.Textarea, max_length=1800, required=False)
57         
58     zajecia_przedszkole = forms.BooleanField(label=u'Prowadzę zajęcia z dziećmi w wieku przedszkolnym', required=False)
59     zajecia_sp13 = forms.BooleanField(label=u'Prowadzę zajęcia z dziećmi z SP kl. 1-3', required=False)
60     zajecia_sp46 = forms.BooleanField(label=u'Prowadzę zajęcia z dziećmi z SP kl. 4-6', required=False)
61     zajecia_gimnazjum = forms.BooleanField(label=u'Prowadzę zajęcia z młodzieżą w wieku gimnazjalnym', required=False)
62     zajecia_ponadgimnazjalne = forms.BooleanField(
63         label=u'Prowadzę zajęcia z młodzieżą ze szkół ponadgimnazjalnych', required=False)
64     zajecia_wyzsze = forms.BooleanField(label=u'Prowadzę zajęcia w szkole wyższej', required=False)
65     zajecia_dorosli = forms.BooleanField(label=u'Prowadzę zajęcia dla dorosłych', required=False)
66     zajecia_seniorzy = forms.BooleanField(label=u'Prowadzę zajęcia dla seniorów', required=False)
67     zgoda_dane = forms.BooleanField(
68         label=u'Oświadczam, że wyrażam zgodę na przetwarzanie moich danych osobowych zawartych '
69               u'w niniejszym formularzu zgłoszeniowym przez Fundację Nowoczesna Polska '
70               u'(administratora danych) z siedzibą w Warszawie (00-514) przy ul. Marszałkowskiej 84/92 '
71               u'lok. 125 w celu otrzymywania newslettera Edukacja medialna. Jednocześnie oświadczam, '
72               u'że zostałam/em poinformowana/y o tym, że mam prawo wglądu w treść swoich danych '
73               u'i możliwość ich poprawiania oraz że ich podanie jest dobrowolne, ale niezbędne '
74               u'do dokonania zgłoszenia.')
75
76
77 class ContestForm(ContactForm):
78     form_tag = 'konkurs'
79     form_title = u"Zgłoś się do konkursu"
80     admin_list = ['nazwisko', 'instytucja', 'tytul']
81
82     nazwisko = forms.CharField(label=u'Imię i nazwisko', max_length=128)
83     contact = forms.EmailField(label=u'Adres e-mail', max_length=128)
84     instytucja = forms.CharField(label=u'Instytucja (nazwa, adres)', widget=forms.Textarea, max_length=1000)
85     tytul = forms.CharField(
86         label=u'Tytuł przeprowadzonej lekcji',
87         help_text=u'proszę wymienić wszystkie, jeśli zostały przeprowadzone więcej niż jedne zajęcia',
88         widget=forms.Textarea, max_length=1000)
89     uczestnicy = forms.CharField(label=u'Liczba uczestników', max_length=64)
90     trudnosci = forms.CharField(
91         label=u'Czy w trakcie zajęć pojawiły się jakieś trudności? Jeśli tak, to jakie?',
92         widget=forms.Textarea, max_length=2000)
93     pomocne = forms.CharField(
94         label=u'Co w materiałach okazało się najbardziej pomocne w przygotowaniu i prowadzeniu lekcji?',
95         widget=forms.Textarea, max_length=2000)
96     nieprzydatne = forms.CharField(
97         label=u'Co w materiałach okazało się nieprzydatne w przygotowaniu i prowadzeniu lekcji?',
98         widget=forms.Textarea, max_length=2000)
99     poprawic = forms.CharField(
100         label=u'Jak możemy poprawić serwis edukacjamedialna.edu.pl?',
101         widget=forms.Textarea, max_length=2000, required=False)
102     inne = forms.CharField(label=u'Inne uwagi i komentarze', widget=forms.Textarea, max_length=2000, required=False)
103     zgoda_regulamin = forms.BooleanField(
104         label=u'Znam i akceptuję regulamin konkursu Medialog.',
105         help_text=u'Zobacz <a href="/media/chunks/attachment/Regulamin_konkursu_MediaLog_1.pdf">'
106                   u'regulamin konkursu MediaLog</a>.')
107     zgoda_informacje = forms.BooleanField(
108         label=u'Wyrażam zgodę na otrzymywanie informacji od Fundacji Nowoczesna Polska związanych z edukacją medialną.',
109         required=False
110     )
111
112
113 class UdzialForm(ContactForm):
114     form_tag = 'udzial'
115     form_title = u"Udział"
116     admin_list = ['nazwisko', 'miejscowosc', 'instytucja']
117
118     nazwisko = forms.CharField(label=u'Imię i nazwisko', max_length=128)
119     miejscowosc = forms.CharField(label=u'Miejscowość', max_length=128)
120     instytucja = forms.CharField(label=u'Nazwa organizacji/instytucji', max_length=128)
121     contact = forms.EmailField(label=u'Adres e-mail', max_length=128)
122     telefon = forms.CharField(label=u'Telefon', max_length=32)
123     uczestnicy = forms.IntegerField(label=u'Przewidywana liczba uczestników zajęć')
124
125
126 class WTEMStudentForm(forms.Form):
127     first_name = forms.CharField(label=u'Imię', max_length=128)
128     last_name = forms.CharField(label=u'Nazwisko', max_length=128)
129     email = forms.EmailField(label=u'Adres e-mail', max_length=128)
130     form_tag = "student"
131
132
133 class NonEmptyBaseFormSet(BaseFormSet):
134     """
135     Won't allow formset_factory to be submitted with no forms
136     """
137     def clean(self):
138         for form in self.forms:
139             if form.cleaned_data:
140                 return
141         forms.ValidationError(u"Proszę podać dane przynajmniej jednej osoby.")
142
143
144 class WTEMForm(ContactForm):
145     disabled = True
146     disabled_template = 'wtem/disabled_contact_form.html'
147     form_tag = "wtem"
148     form_title = u"WTEM - rejestracja uczestników"
149     submit_label = u"Wyślij zgłoszenie"
150     admin_list = ['imie', 'nazwisko', 'institution']
151     form_formsets = {
152         'student': forms.formsets.formset_factory(
153             WTEMStudentForm, formset=NonEmptyBaseFormSet, max_num=5, validate_max=True, extra=5),
154     }
155
156     contact = forms.EmailField(label=u'Adres e-mail opiekuna/opiekunki', max_length=128)
157     imie = forms.CharField(label=u'Imię', max_length=128)
158     nazwisko = forms.CharField(label=u'Nazwisko', max_length=128)
159     function = forms.CharField(label=u'Pełniona funkcja', max_length=255)
160     institution = forms.CharField(label=u'Nazwa instytucji', max_length=255)
161     institution_address = forms.CharField(label=u'Adres instytucji', widget=forms.Textarea, max_length=1000)
162     institution_email = forms.EmailField(label=u'Adres e-mail instytucji', max_length=128)
163     institution_phone = forms.CharField(label=u'Telefon do instytucji', max_length=32)
164     institution_www = forms.URLField(label=u'Strona WWW instytucji', max_length=255, required=False)
165
166     zgoda_regulamin = forms.BooleanField(
167         label=u'Znam i akceptuję regulamin Wielkiego Turnieju Edukacji Medialnej.',
168         help_text=u'Zobacz <a href="/media/chunks/attachment/regulamin_III_edycja.pdf">'
169                   u'regulamin Wielkiego Turnieju Edukacji Medialnej</a>.'
170     )
171     zgoda_dane = forms.BooleanField(
172         label=u'Wyrażam zgodę na przetwarzanie moich danych osobowych oraz danych osobowych moich podopiecznych.',
173         # help_text=u'Zobacz <a href="/media/chunks/attachment/Oswiadczenie_o_danych_osobowych.pdf">'
174         # 'pełną treść oświadczenia</a>.'
175     )
176
177     potw_uczniowie = forms.BooleanField(
178         label=u'Potwierdzam, że zgłoszeni Uczestnicy/Uczestniczki w chwili rejestracji są '
179               u'uczniami/uczennicami szkoły ponadgimnazjalnej.',
180     )
181     zgoda_informacje = forms.BooleanField(
182         label=u'Wyrażam zgodę na otrzymywanie informacji od Fundacji Nowoczesna Polska '
183               u'związanych z edukacją medialną.',
184         required=False
185     )
186
187     extract_types = (dict(slug='extended', label=_('extended')),)
188
189     @staticmethod
190     def get_extract_fields(contact, extract_type_slug):
191         fields = contact.body.keys()
192         fields.pop(fields.index('student'))
193         fields.extend(['contact', 'student_first_name', 'student_last_name', 'student_email'])
194         return fields
195
196     @staticmethod
197     def get_extract_records(keys, contact, extract_type_slug):
198         toret = [dict()]
199         for field_name in keys:
200             if field_name.startswith('student_'):
201                 continue
202             if field_name == 'contact':
203                 val = contact.contact
204             else:
205                 val = contact.body[field_name]
206             toret[0][field_name] = val
207         
208         current = toret[0]
209         for student in contact.body['student']:
210             for attr in ('first_name', 'last_name', 'email'):
211                 current['student_' + attr] = student[attr]
212             if current not in toret:
213                 toret.append(current)
214             current = dict()
215         return toret
216
217     def save(self, request, formsets=None):
218         contact = super(WTEMForm, self).save(request, formsets)
219
220         mail_subject = render_to_string('contact/wtem/student_mail_subject.html').strip()
221         mail_body = render_to_string('contact/wtem/student_mail_body.html')
222         for formset in formsets or []:
223             for f in formset.forms:
224                 email = f.cleaned_data.get('email', None)
225                 try:
226                     validate_email(email)
227                 except ValidationError:
228                     pass
229                 else:
230                     send_mail(mail_subject, mail_body, 'edukacjamedialna@nowoczesnapolska.org.pl', [email],
231                               fail_silently=True)
232
233         return contact
234
235
236 class CommissionForm(forms.Form):
237     name = forms.CharField(label=u'Imię i nazwisko Członka Komisji', max_length=128)
238     form_tag = "commission"
239
240
241 class OlimpiadaForm(ContactForm):
242     disabled = True
243     disabled_template = 'wtem/disabled_contact_form.html'
244     form_tag = "olimpiada"
245     form_title = u"Olimpiada Cyfrowa - Elektroniczny System Zgłoszeń"
246     submit_label = u"Wyślij zgłoszenie"
247     admin_list = ['nazwisko', 'school']
248     form_formsets = {
249         'student': forms.formsets.formset_factory(WTEMStudentForm, formset=NonEmptyBaseFormSet),
250         'commission': forms.formsets.formset_factory(CommissionForm, formset=BaseFormSet),
251     }
252
253     contact = forms.EmailField(label=u'Adres e-mail Przewodniczącego/Przewodniczącej', max_length=128)
254     przewodniczacy = forms.CharField(label=u'Imię i nazwisko Przewodniczącego/Przewodniczącej', max_length=128)
255     school = forms.CharField(label=u'Nazwa szkoły', max_length=255)
256     school_address = forms.CharField(label=u'Adres szkoły', widget=forms.Textarea, max_length=1000)
257     school_email = forms.EmailField(label=u'Adres e-mail szkoły', max_length=128)
258     school_phone = forms.CharField(label=u'Numer telefonu szkoły', max_length=32)
259     school_www = forms.URLField(label=u'Strona WWW szkoły', max_length=255, required=False)
260
261     zgoda_regulamin = forms.BooleanField(
262         label=u'Znam i akceptuję Regulamin Olimpiady Cyfrowej.',
263         help_text=u'Zobacz <a href="https://olimpiadacyfrowa.pl/regulamin/" target="_blank">'
264                   u'regulamin Olimpiady Cyfrowej</a>.'
265     )
266     zgoda_dane = forms.BooleanField(
267         label=u'Oświadczam, że wyrażam zgodę na przetwarzanie danych osobowych zawartych w niniejszym formularzu '
268               u'zgłoszeniowym przez Fundację Nowoczesna Polska (administratora danych) z siedzibą w Warszawie (00-514) '
269               u'przy ul. Marszałkowskiej 84/92 lok. 125 na potrzeby organizacji Olimpiady Cyfrowej. Jednocześnie '
270               u'oświadczam, że zostałam/em poinformowana/y o tym, że mam prawo wglądu w treść swoich danych '
271               u'i możliwość ich poprawiania oraz że ich podanie jest dobrowolne, ale niezbędne do dokonania '
272               u'zgłoszenia.')
273
274     extract_types = (dict(slug='extended', label=_('extended')),)
275
276     @staticmethod
277     def get_extract_fields(contact, extract_type_slug):
278         fields = contact.body.keys()
279         if 'student' in fields:
280             fields.remove('student')
281         fields.extend(['contact', 'student_first_name', 'student_last_name', 'student_email'])
282         return fields
283
284     @staticmethod
285     def get_extract_records(keys, contact, extract_type_slug):
286         toret = [{}]
287         for field_name in keys:
288             if field_name.startswith('student_'):
289                 continue
290             if field_name == 'contact':
291                 val = contact.contact
292             else:
293                 val = contact.body[field_name]
294             toret[0][field_name] = val
295
296         current = toret[0]
297         if 'student' in contact.body:
298             for student in contact.body['student']:
299                 for attr in ('first_name', 'last_name', 'email'):
300                     current['student_' + attr] = student[attr]
301                 if current not in toret:
302                     toret.append(current)
303                 current = {}
304         return toret
305
306     def save(self, request, formsets=None):
307         contact = super(OlimpiadaForm, self).save(request, formsets)
308
309         mail_subject = render_to_string('contact/olimpiada/student_mail_subject.html').strip()
310         mail_body = render_to_string('contact/olimpiada/student_mail_body.html')
311         for formset in formsets or []:
312             if formset.prefix == 'student':
313                 for f in formset.forms:
314                     email = f.cleaned_data.get('email', None)
315                     try:
316                         validate_email(email)
317                     except ValidationError:
318                         pass
319                     else:
320                         send_mail(mail_subject, mail_body, 'edukacjamedialna@nowoczesnapolska.org.pl', [email],
321                                   fail_silently=True)
322
323         return contact
324
325
326 class MILForm(ContactForm):
327     form_tag = 'mil'
328     form_title = _('Share your thoughts on the "Media and information literacy competencies catalogue"')
329     submit_label = _('Submit')
330     base_template = 'base_mil.html'
331     site_name = site_domain = 'katalog.nowoczesnapolska.org.pl'
332
333     name = forms.CharField(label=_('Name and Surname'), max_length=255)
334     contact = forms.EmailField(label=_('E-mail'), max_length=255)
335
336     institution = forms.CharField(label=_('Institution'), widget=forms.Textarea, max_length=8192)
337
338     question_stages = forms.CharField(
339         label=_('What do you think about the proposed educational stages classification?'),
340         widget=forms.Textarea,
341         max_length=255,
342         required=False)
343
344     question_fields = forms.CharField(
345         label=_('What do you think about the proposed thematic fields?'),
346         widget=forms.Textarea,
347         max_length=255,
348         required=False)
349
350     question_left_out = forms.CharField(
351         label=_('What important areas of media and information literacy have been left out?'),
352         widget=forms.Textarea,
353         max_length=255,
354         required=False)
355
356     other = forms.CharField(
357         label=_('Other suggestions and comments'),
358         widget=forms.Textarea,
359         max_length=255,
360         required=False)
361
362
363 class TEMForm(ContactForm):
364     form_tag = 'tem'
365     form_title = u"TEM - szkolenie dla trenerów edukacji medialnej"
366     admin_list = ['imie', 'nazwisko', 'instytucja', 'contact']
367
368     imie = forms.CharField(label=u'Imię', max_length=128)
369     nazwisko = forms.CharField(label=u'Nazwisko', max_length=128)
370     contact = forms.EmailField(label=u'E-mail', max_length=128)
371     telefon = forms.CharField(label=u'Tel. kontaktowy', max_length=128)
372     instytucja = forms.CharField(label=u'Instytucja', max_length=256)
373     adres = forms.CharField(label=u'Adres', widget=forms.Textarea, max_length=1000)
374     stanowisko = forms.CharField(label=u'Stanowisko', max_length=256)
375     doswiadczenie = forms.CharField(
376         label=u'Jakie jest Pani/Pana doświadczenie w zakresie edukacji medialnej?',
377         widget=forms.Textarea, max_length=500, help_text=u'(max 500 znaków)')
378     dlaczego = forms.CharField(
379         label=u'Dlaczego chce Pani/Pan wziąć udział w szkoleniu?',
380         widget=forms.Textarea, max_length=500, help_text=u'(max 500 znaków)')
381     jak_wykorzystac = forms.CharField(
382         label=u'Jak zamierza Pan/Pani wykorzystać wiedzę zdobytą w czasie szkolenia?',
383         widget=forms.Textarea, max_length=500, help_text=u'(max 500 znaków)')
384
385     zajecia = forms.BooleanField(
386         label=u'W okresie wrzesień-październik 2015 r. przeprowadzę min. 2 godziny zajęć edukacji medialnej '
387               u'z wybraną grupą dzieci lub młodzieży.', required=True)
388     zgoda_informacje = forms.BooleanField(
389         label=u'Wyrażam zgodę na otrzymywanie informacji od Fundacji Nowoczesna Polska '
390               u'związanych z edukacją medialną.', required=False)
391
392
393 class SuperwizjaForm(ContactForm):
394     form_tag = 'superwizja'
395     form_title = u"Informacje o zajęciach"
396     admin_list = ['nazwisko', 'contact', 'skype', 'temat']
397     submit_label = u'Wyślij'
398
399     nazwisko = forms.CharField(label=u'Imię i nazwisko', max_length=1024)
400     contact = forms.CharField(label=u'E-mail kontaktowy', required=False)
401     skype = forms.CharField(label=u'Nazwa użytkownika Skype', max_length=255)
402     temat = forms.CharField(label=u'Temat zajęć', max_length=1024)
403     termin = forms.CharField(label=u'Termin zajęć', max_length=1024)
404     czas_trwania = forms.CharField(label=u'Czas trwania zajęć', max_length=1024)
405     miejsce = forms.CharField(label=u'Miejsce prowadzenia zajęć', max_length=1024)
406     rodzaj = forms.ChoiceField(
407         label=u'Rodzaj zajęć', widget=forms.RadioSelect,
408         choices=[('jednorazowe', 'jednorazowe'), ('w ramach cyklu', 'w ramach cyklu')])
409     cykl = forms.CharField(label=u'Jeśli w ramach cyklu, to podaj jego temat i czas trwania', required=False)
410     sposob = forms.ChoiceField(
411         label=u'Sposób prowadzenia zajęć', widget=forms.RadioSelect,
412         choices=[('samodzielnie', 'samodzielnie'), (u'z drugą osobą', 'z drugą osobą')])
413     wrazenia = forms.CharField(
414         label=u'Opisz Twoje ogólne wrażenia po warsztacie.', widget=forms.Textarea, max_length=4096)
415     opiekun = forms.CharField(
416         label=u'Czy opiekun grupy był obecny podczas zajęć? Jeśli tak, opisz krótko jego rolę.',
417         widget=forms.Textarea, max_length=4096)
418     grupa = forms.CharField(
419         label=u'Opisz krótko grupę uczestników zajęć (wiek, liczba osób, czy to pierwszy kontakt z grupą).',
420         widget=forms.Textarea, max_length=4096)
421     cel = forms.CharField(
422         label=u'Jaki był założony cel zajęć? Dlaczego wybrałaś/eś taki cel?', widget=forms.Textarea, max_length=4096)
423     ewaluacja = forms.CharField(
424         label=u'W jaki sposób sprawdziłeś/aś, czy cel zajęć został zrealizowany? Opisz krótko efekty zajęć.',
425         widget=forms.Textarea, max_length=4096)
426     # header
427     przygotowania = forms.CharField(
428         label=u'Opisz w punktach proces przygotowania się do zajęć.', widget=forms.Textarea, max_length=4096)
429     przygotowania_trudnosci = forms.CharField(
430         label=u'Co na etapie przygotowań sprawiło Ci największą trudność?', widget=forms.Textarea, max_length=4096)
431     przygotowania_pomoc = forms.CharField(
432         label=u'Co było pomocne w przygotowaniu zajęć? '
433               u'(Czy korzystałaś/eś z materiałów z serwisu edukacjamedialna.edu.pl? Jeśli tak, to jakich?)',
434         widget=forms.Textarea, max_length=4096)
435     narzedzia = forms.CharField(
436         label=u'Jakie narzędzie/a planowałaś/eś wykorzystać, a jakie wykorzystałaś/eś?',
437         widget=forms.Textarea, max_length=4096)
438     struktura = forms.CharField(
439         label=u'Opisz w punktach strukturę zajęć. '
440               u'Zaznacz ile czasu planowałaś/eś na każdą część, a ile czasu faktycznie Ci to zajęło.',
441         widget=forms.Textarea, max_length=4096)
442     prowadzenie_trudnosci = forms.CharField(
443         label=u'Co sprawiało Ci trudność w prowadzeniu zajęć?', widget=forms.Textarea, max_length=4096)
444     prowadzenie_pomoc = forms.CharField(
445         label=u'Co było pomocne w prowadzeniu zajęć?', widget=forms.Textarea, max_length=4096)
446     kontrakt = forms.CharField(
447         label=u'W jakiej formie został zawarty kontrakt z uczestnikami? Jakie zasady zostały przyjęte? '
448               u'Czy w trakcie zajęć Ty bądź uczestnicy odwoływaliście się do kontraktu?',
449         widget=forms.Textarea, max_length=4096)
450     trudne_sytuacje = forms.CharField(
451         label=u'Czy podczas zajęć miały miejsce tzw. „trudne sytuacje”. '
452               u'Jak na nie zareagowałaś/eś? Czy potrzebowałabyś/łbyś czegoś w związku z nimi?',
453         widget=forms.Textarea, max_length=4096)
454     informacje_zwrotne = forms.CharField(
455         label=u'Czy zbierałaś/eś informacje zwrotne od uczestników? Jeśli tak, na co zwrócili uwagę? '
456               u'W jaki sposób zbierałaś/eś informacje zwrotne?', widget=forms.Textarea, max_length=4096)
457
458     mocne_strony = forms.CharField(
459         label=u'Opisz w punktach mocne strony przeprowadzonych zajęć.', widget=forms.Textarea, max_length=4096)
460     zmiany = forms.CharField(
461         label=u'Opisz w punktach, co byś zmienił(a) na przyszłość.', widget=forms.Textarea, max_length=4096)
462     potrzeby = forms.CharField(
463         label=u'Czy potrzebowałbyś/łbyś czegoś przed następnymi zajęciami?', widget=forms.Textarea, max_length=4096)
464     uwagi = forms.CharField(label=u'Inne uwagi', widget=forms.Textarea, max_length=4096, required=False)
465
466
467 def textarea_field(label, max_length=500):
468     return forms.CharField(
469         label=label, widget=forms.Textarea, max_length=max_length, help_text=u'(do %s znaków)' % max_length)
470
471
472 class CybernauciForm(ContactForm):
473     disabled = True
474     disabled_template = 'contact/disabled_contact_form.html'
475     form_tag = 'trenerzy-cybernauci2017'
476     form_title = u"Cybernauci – szkolenie dla trenerów"
477     admin_list = ['nazwisko', 'instytucja', 'contact']
478     submit_label = u'Wyślij'
479
480     nazwisko = forms.CharField(label=u'Imię i nazwisko', max_length=1024)
481     adres = forms.CharField(label=u'Adres zamieszkania')
482     wojewodztwo = forms.ChoiceField(label=u'Województwo', choices=WOJEWODZTWO_CHOICES)
483     contact = forms.CharField(label=u'Adres e-mail')
484     telefon = forms.CharField(label=u'Telefon kontaktowy', max_length=32)
485     dlaczego = textarea_field(
486         label=u'Proszę opisać, dlaczego chce Pan/Pani zostać Emisariuszem Bezpiecznego Internetu.')
487     grupy = forms.MultipleChoiceField(
488         label=u'Proszę wskazać, dla których grup realizował Pan/realizowała Pani zajęcia warsztatowe',
489         widget=forms.CheckboxSelectMultiple,
490         choices=[
491             ('Uczniowie klas 1-3', 'Uczniowie klas 1-3'),
492             ('Uczniowie klas 4-6', 'Uczniowie klas 4-6'),
493             ('Uczniowie szkół gimnazjalnych', 'Uczniowie szkół gimnazjalnych'),
494             ('Uczniowie szkół ponadgimnazjalnych', 'Uczniowie szkół ponadgimnazjalnych'),
495             ('Nauczyciele', 'Nauczyciele'),
496             ('Rodzice', 'Rodzice'),
497         ])
498     doswiadczenie_grupy = textarea_field(
499         label=u'Proszę opisać swoje doświadczenie w pracy warsztatowej z grupami docelowymi Projektu '
500               u'(dziećmi, młodzieżą, osobami dorosłymi: nauczycielami, rodzicami).',
501         max_length=750)
502     doswiadczenie_edumed = textarea_field(
503         label=u'Jakie jest Pana/Pani doświadczenie w zakresie edukacji medialnej, '
504               u'zwłaszcza w zakresie bezpieczeństwa w Internecie i korzystania z TIK? '
505               u'Skąd czerpie Pan/Pani wiedzę w tym zakresie? W jakich projektach brał '
506               u'Pan/brała Pani udział dotychczas?',
507         max_length=750)
508     szkolenia = textarea_field(
509         label=u'Proszę wymienić studia, szkolenia albo kursy (maks. 5 najważniejszych) '
510               u'powiązane z tematyką Projektu, w których Pan/Pani uczestniczył/ła, '
511               u'w tym dane na temat instytucji czy osoby prowadzącej (z JEDNOZDANIOWYM '
512               u'omówieniem i terminami, w których się odbyły).')
513     realizacje = textarea_field(
514         label=u'Proszę opisać swoje doświadczenie w zakresie realizacji działań w lokalnym środowisku '
515               u'szkolnym (np. na terenie gminy/powiatu/województwa).')
516     cel = textarea_field(
517         label=u'Proszę opisać, jaką wiedzę i umiejętności chce Pan/Pani zdobyć '
518               u'lub doskonalić poprzez uczestnictwo w Szkoleniu trenerskim.')
519     skad = forms.CharField(label=u'Skąd dowiedział/dowiedziała się Pan/Pani o projekcie „Cybernauci”?')
520     zgoda_regulamin = forms.BooleanField(
521         label=u'Oświadczam, że zapoznałem/zapoznałam się z Regulaminem Rekrutacji '
522               u'i Uczestnictwa w Projekcie „Cybernauci – kompleksowy projekt '
523               u'kształtowania bezpiecznych zachowań w sieci” i akceptuję jego warunki.',
524         help_text=u'Zobacz <a href="https://cybernauci.edu.pl/wp-content/uploads/2017/04/'
525                   u'regulamin_Cybernauci_szkolenie_trenerskie_2017.pdf">regulamin</a>.')
526     zgoda_dane = forms.BooleanField(
527         label=u'Wyrażam zgodę na przetwarzanie moich danych osobowych zawartych '
528               u'w niniejszym dokumencie dla potrzeb niezbędnych do realizacji Projektu '
529               u'„Cybernauci – kompleksowy projekt kształtowania bezpiecznych zachowań '
530               u'w sieci”  zgodnie z ustawą z dnia 29.08.1997 roku o Ochronie Danych '
531               u'Osobowych (Dz. U. z 2002 r. Nr 101, poz. 926 z późniejszymi zmianami).')
532     zgoda_niekaralnosc = forms.BooleanField(
533         label=u'W przypadku zakwalifikowania się na kurs zobowiązuję się '
534               u'do dostarczenia świadectwa o niekaralności – najpóźniej w dniu rozpoczęcia Szkolenia.')
535     zgoda_newsletter = forms.BooleanField(
536         required=False,
537         label=u'Chcę otrzymywać newsletter Edukacja Medialna.')
538     cv = forms.FileField(
539         label=u'Wgraj plik CV.',
540         help_text=u'Prosimy o nazwanie pliku swoim imieniem i nazwiskiem. Preferowany format: PDF.')
541
542
543 class WLEMForm(ContactForm):
544     disabled = True
545     form_tag = 'wlem'
546     form_title = u"WLEM - szkolenie dla warszawskich liderów edukacji medialnej"
547     admin_list = ['nazwisko', 'instytucja', 'contact']
548     submit_label = u'Wyślij'
549
550     nazwisko = forms.CharField(label=u'Imię i nazwisko', max_length=128)
551     contact = forms.CharField(label=u'Adres e-mail')
552     telefon = forms.CharField(label=u'Tel. kontaktowy', max_length=32)
553     instytucja = forms.CharField(label=u'Instytucja', max_length=128)
554     instytucja_adres = forms.CharField(label=u'Adres (instytucji)', max_length=1024)
555     stanowisko = forms.CharField(label=u'Stanowisko', max_length=256)
556     doswiadczenie = forms.CharField(
557         label=u'Jakie jest Pani/Pana doświadczenie w zakresie edukacji medialnej?',
558         widget=forms.Textarea, max_length=4096)
559     dlaczego = forms.CharField(
560         label=u'Dlaczego chce Pani/Pan wziąć udział w szkoleniu?',
561         widget=forms.Textarea, max_length=4096)
562     cel = forms.CharField(
563         label=u'Jaką wiedzę i umiejętności chce Pan/Pani zdobyć lub doskonalić poprzez uczestnictwo w szkoleniu?',
564         widget=forms.Textarea, max_length=4096)
565     jak_wykorzystac = forms.CharField(
566         label=u'Jak zamierza Pan/Pani wykorzystać wiedzę i umiejętności zdobyte w czasie szkolenia?',
567         widget=forms.Textarea, max_length=4096)
568     zgoda_zajecia = forms.BooleanField(
569         label=u'W okresie lipiec-październik 2016 r. przeprowadzę min. 2 godziny zajęć '
570               u'edukacji medialnej z grupą warszawiaków.')
571     zgoda_dane = forms.BooleanField(
572         label=u'Wyrażam zgodę na przetwarzanie moich danych osobowych zawartych '
573               u'w niniejszym dokumencie dla potrzeb niezbędnych do realizacji Projektu '
574               u'„Warszawscy Liderzy Edukacji Medialnej” zgodnie z ustawą z dnia 29.08.1997 '
575               u'roku o Ochronie Danych Osobowych (Dz. U. z 2002 r. Nr 101, poz. 926 '
576               u'z późniejszymi zmianami).')
577     zgoda_newsletter = forms.BooleanField(
578         required=False,
579         label=u'Wyrażam zgodę na otrzymywanie informacji od Fundacji Nowoczesna Polska '
580               u'związanych z edukacją medialną.')
581
582
583 def ordered_textarea_field(start, pre_label=u'', label=u'', max_length=500):
584     return textarea_field(
585         mark_safe(u'%s<ol type="a" start="%s"><li>%s</li></ol>' % (pre_label, start, label)),
586         max_length=max_length)
587
588
589 def simple_choices(*choices):
590     return tuple((choice, choice) for choice in choices)
591
592
593 class CybernauciAnkietaForm(ContactForm):
594     def __init__(self, *args, **kwargs):
595         super(CybernauciAnkietaForm, self).__init__(*args, **kwargs)
596         self.label_suffix = ''
597
598     form_tag = 'cybernauci-ankieta-trenera'
599     form_title = u"Cybernauci – ankieta trenerska"
600     nazwisko = forms.CharField(label=u'Imię i nazwisko', max_length=128)
601     contact = forms.CharField(label=u'Adres e-mail')
602     pyt1a = ordered_textarea_field(
603         1, pre_label=u'1. W kontekście planowanego szkolenia jakie są Twoje oczekiwania w zakresie:',
604         label=u'przekazywanej wiedzy')
605     pyt1b = ordered_textarea_field(2, label=u'tematyki szkoleń z bezpieczeństwa w sieci')
606     pyt1c = ordered_textarea_field(3, label=u'materiałów dydaktycznych')
607     pyt1d = ordered_textarea_field(4, label=u'organizacji  i prowadzenia szkoleń w projekcie')
608     pyt1e = ordered_textarea_field(5, label=u'umiejętności trenerskich')
609     pyt1f = ordered_textarea_field(6, label=u'inne, jakie?')
610     pyt2 = textarea_field(u'2. W których tematach z obszaru bezpieczeństwa w sieci czujesz się najpewniej? '
611                           u'Dlaczego?')
612     pyt3 = textarea_field(u'3. Które z tematów znasz słabej lub których nie znasz zupełnie?')
613     pyt4 = textarea_field(u'4. Jakie są Twoje mocne strony jako osoby prowadzącej warsztaty?')
614     pyt5 = textarea_field(u'5. Nad jakimi elementami pracy trenerskiej chciałbyś/chciałabyś popracować?')
615     pyt6 = textarea_field(u'6. Co jest dla Ciebie najważniejsze w pracy z grupą? '
616                           u'Na co zwracasz uwagę w tym obszarze jako osoba prowadząca warsztaty?')
617     pyt7 = textarea_field(u'7. Opisz najtrudniejszą Twoim zdaniem sytuację, której doświadczyłeś/doświadczyłaś '
618                           u'podczas prowadzenia zajęć w grupie z młodzieżą, rodzicami lub nauczycielami?')
619     pyt8 = forms.MultipleChoiceField(
620         label=u'8. W jaki sposób poradzisz sobie z niespodziewaną sytuacją skrócenia czasu zajęć? '
621               u'Na które z poniższych punktów przeznaczysz w takiej sytuacji najmniej czasu?',
622         widget=forms.CheckboxSelectMultiple,
623         choices=simple_choices(
624             u'Przedstawienie się prowadzących i uczestników',
625             u'Poznanie oczekiwań i dostosowanie do nich programu zajęć',
626             u'Integracja',
627             u'Poprowadzenie kolejnych elementów zajęć (teoria-ćwiczenia)',
628             u'Podsumowanie - sprawdzenie efektów warsztatu',
629             u'Zaplanowanie dalszych prac',
630             u'Ewaluacja'))
631     pyt8a = textarea_field(label=u'Dlaczego?', max_length=1000)
632     pyt9 = textarea_field(
633         label=u'9. Jeden z uczestników przeszkadza podczas warsztatów: '
634               u'głośno żartuje, nie wykonuje zleconych zadań. Co robisz?')
635     pyt10 = textarea_field(
636         u'10. Z całej grupy tylko trzy osoby odpowiadają na każde zadane przez Ciebie pytanie. '
637         u'Co robisz?')
638     pyt11 = textarea_field(
639         u'11. Jakie są Twoje największe obawy wobec realizacji szkoleń w placówkach oświatowych?')
640     pyt12a = ordered_textarea_field(
641         1, pre_label=u'12. Opisz szczegółowo doświadczenie z różnymi grupami:', label=u'rodzice')
642     pyt12b = ordered_textarea_field(2, label=u'nauczyciele')
643     pyt12c = ordered_textarea_field(3, label=u'młodzież ponadgimnazjalna')
644     pyt12d = ordered_textarea_field(4, label=u'młodzież gimnazjalna')
645     pyt12e = ordered_textarea_field(5, label=u'dzieci i młodzież szkół podstawowych')
646     pyt13 = textarea_field(
647         u'13. Z jakimi grupami wiekowymi najlepiej Ci się współpracuje? '
648         u'Umiejętności w zakresie pracy z którą grupą najbardziej chciałabyś/chciałbyś zdobyć/doskonalić?')
649     pyt14 = textarea_field(
650         u'14. W jaki sposób na co dzień dbasz o swój rozwój jako trenera/trenerki, '
651         u'osoby prowadzącej warsztaty czy inne formy szkoleniowe?')
652
653
654 def quiz_question(label, choices):
655     return forms.TypedChoiceField(label=label, choices=choices, coerce=int, widget=forms.RadioSelect)
656
657
658 def make_link(text, url):
659     return u'<a href="%s">%s</a>' % (url, text)
660
661
662 class SciezkiKopernikaTestForm(ContactForm):
663     def __init__(self, *args, **kwargs):
664         super(SciezkiKopernikaTestForm, self).__init__(*args, **kwargs)
665         self.label_suffix = ''
666
667     result_page = True
668     form_tag = 'sciezki-kopernika-test'
669     form_title = u'Test'
670     submit_label = u'Wyślij'
671
672     contact = forms.EmailField(label=u'Adres e-mail, na który przyślemy informację o wynikach')
673     pyt1 = quiz_question(
674         label=u'1) Na stronie portalu internetowego opublikowano wpis o treści '
675               u'„Nie wszyscy muzułmanie to terroryści, ale wszyscy terroryści to muzułmanie”. '
676               u'Komentarz podlega moderacji i powinien:',
677         choices=[
678             (1, u'zostać zachowany, ponieważ jest prywatną opinią korzystającą z wolności słowa,'),
679             (0, u'zostać zachowany, ponieważ informuje o fakcie,'),
680             (2, u'zostać usunięty, ponieważ jest wprowadzającą w błąd interpretacją faktów.'),
681         ])
682     pyt2 = quiz_question(
683         label=u'2) Aby przygotować podcast, należy posiadać przynajmniej:',
684         choices=[
685             (0, u'półprofesjonalny mikrofon radiowy, z wbudowanym interfejsem dźwiękowym, '
686                 u'komercyjne oprogramowanie typu DAW, średnio-zaawansowane umiejętności cyfrowej obróbki dźwięku,'),
687             (1, u'urządzenie do nagrywania dźwięku, laptop, oprogramowanie dedykowane do tworzenia podcastów,'),
688             (2, u'urządzenie do nagrywania dźwięku, podstawowe oprogramowanie do edycji dźwięku, '
689                 u'podstawowe umiejętności cyfrowej obróbki dźwięku.')])
690     pyt3 = quiz_question(
691         label=u'3) Muzeum cyfrowe chce udostępnić skan XIV-wiecznego kodeksu. '
692               u'Zgodnym z ideą domeny publicznej sposobem jego udostępnienia będzie:',
693         choices=[
694             (0, u'udostępnienie go na licencji Creative Commons,'),
695             (2, u'udostępnienie go bez licencji z czytelnym wskazaniem praw do dowolnego wykorzystania,'),
696             (1, u'udostępnienie go w pliku jakości produkcyjnej.')])
697     pyt4 = quiz_question(
698         label=u'4) Aby uniknąć możliwości podejrzenia przez niepowołane osoby, jakie strony internetowe '
699               u'odwiedzałeś ostatnio, powinieneś/powinnaś:',
700         choices=[
701             (0, u'ustawić opcję otwierania nowej sesji przeglądarki bez wyświetlania ostatnio używanych kart '
702                 u'oraz regularnie czyścić historię wyszukiwania,'),
703             (2, u'wylogowywać się lub blokować ekran za każdym razem, kiedy odchodzisz od komputera, tabletu '
704                 u'lub odkładasz gdzieś telefon, regularnie czyścić dane zgromadzone przez przeglądarkę internetową,'),
705             (1, u'wylogowywać się lub blokować ekran za każdym razem, kiedy odchodzisz od komputera, tabletu '
706                 u'lub odkładasz gdzieś telefon, regularnie czyścić historię przeglądanych stron.')])
707     pyt5 = quiz_question(
708         label=u'5) Komentarz opublikowany w internecie ma taką samą wartość bez względu na to, '
709               u'czy jest anonimowy czy podpisany imieniem i nazwiskiem:',
710         choices=[
711             (0, u'tak, ze względu na zasadę wolności słowa,'),
712             (2, u'to zależy od jego treści i kontekstu, w którym go opublikowano,'),
713             (1, u'tak, z punktu widzenia odpowiedzialności prawnej. [poprawna]')])
714     pyt6 = quiz_question(
715         label=u'6) Wraz z grupą osób zamierzasz przygotować cyfrową opowieść (narrację) na temat współczesnych '
716               u'nastolatków i ich stosunku do szkoły. Żeby praca była efektywna, a jej rezultat efektowny, warto '
717               u'zorganizować wspólną pracę w następujących krokach:',
718         choices=[
719             (2, u'przeprowadzić wspólną dyskusję odnośnie tematu opowieści, wybrać jeden, ustalić, co należy zrobić, '
720                 u'podzielić zadania w grupie i przygotować scenariusz narracji (opisać poszczególne sceny, co się '
721                 u'w nich znajdzie, co będzie potrzebne do ich przygotowania),'),
722             (0, u'zgromadzić jak najwięcej materiałów wideo i zdjęć, wybrać oprogramowanie do obróbki wideo i wspólnie '
723                 u'decydować o kolejności scen i zawartości opowieści,'),
724             (1, u'wybrać temat opowieści, zgromadzić jak najwięcej filmików i zdjęć, podzielić się zadaniami w grupie, '
725                 u'zmontować narrację z części przygotowanych przez uczestników zespołu.')])
726     pyt7 = quiz_question(
727         label=u'7) Firma telekomunikacyjna wykorzystuje boty do automatycznego odpowiadania na pytania klientów '
728               u'zadawane przez Facebooka. Boty zwracają się do wszystkich po imieniu. Kiedy użytkownik, który nie '
729               u'życzy sobie tego nie życzy, wyraża swoje niezadowolenie z takiej formy rozmowy, firma:',
730         choices=[
731             (2, u'przeprosić użytkownika, szanując preferowane przez niego reguły komunikacji,'),
732             (0, u'zignorować użytkownika odwołując się do zasad netykiety,'),
733             (1, u'zareagować zgodnie z wypracowanymi wewnętrznie zasadami komunikacji.')])
734     pyt8 = quiz_question(
735         label=u'8) Jesteś członkiem/członkinią grupy, która przygotowuje aplikację, mającą ułatwić osobom '
736               u'niepełnosprawnym poruszanie się po Twojej miejscowości. Oprogramowanie będzie m.in. informować, '
737               u'czy przy określonej instytucji, firmie, sklepie, znajdują się miejsca parkingowe '
738               u'dla niepełnosprawnych i ile ich jest. Aby aplikacja działała prawidłowo, powinieneś/powinnaś:',
739         choices=[
740             (1, u'przygotować listę najważniejszych obiektów w Twoim mieście i skontaktować się z ich administracją, '
741                 u'pytając o liczbę miejsc parkingowych,'),
742             (0, u'poszukać informacji o dostępnych miejscach parkingowych na stronach instytucji, firm i sklepów,'),
743             (2, u'skontaktować się z administracją obiektów, o których będzie informować aplikacja, udać się również '
744                 u'do tych obiektów, aby potwierdzić ilość dostępnych miejsc, spróbować zgromadzić informacje o tym, '
745                 u'jak często miejsca parkingowe są zajmowane przez ludzi pełnosprawnych.')])
746     pyt9 = quiz_question(
747         label=u'9) Pojęcie „niewidzialnej pracy” może dotyczyć:',
748         choices=[
749             (2, u'moderatorów mediów społecznościowych zatrudnianych w krajach o niskich kosztach pracy, [najlepsze]'),
750             (1, u'użytkowników serwisów społecznościowych publikujących codziennie i bez wynagrodzenia własne '
751                 u'materiały w tym serwisie, [dobre]'),
752             (0, u'informatyków budujących rozwiązania IT dla firm. [złe]')])
753
754     pyt10 = quiz_question(
755         label=u'10) Możesz uważać, że informacje, do których docierasz, są wiarygodne, ponieważ:',
756         choices=[
757             (1, u'pojawiają się w wielu telewizyjnych serwisach informacyjnych, na profilach społecznościowych '
758                 u'moich znajomych i w różnorodnych internetowych serwisach informacyjnych, wszędzie przedstawiane '
759                 u'są w podobny sposób,'),
760             (2, u'pojawiają się w wielu serwisach informacyjnych, na profilach moich znajomych, zawierają odnośniki '
761                 u'do oryginalnych źródeł, do których można dotrzeć,'),
762             (0, u'pojawiają się na profilach wielu moich znajomych w serwisach społecznościowych i '
763                 u'w kilku internetowych serwisach informacyjnych.')])
764     pyt11 = quiz_question(
765         label=u'11) W pewnym mieście prokuratura bada umowy z wykonawcami projektów budżetu obywatelskiego. '
766               u'Nikomu, jak dotąd, nie postawiono zarzutów. Która postać tytułu newsa opublikowanego '
767               u'na lokalnym portalu internetowym będzie najbardziej zgodna z zasadami etyki dziennikarskiej?',
768         choices=[
769             (1, u'„Budżet obywatelski: niejasne umowy z wykonawcami?”,'),
770             (2, u'„Prokuratura zbada umowy z wykonawcami projektów budżetu obywatelskiego.”,'),
771             (0, u'„Zobacz, które firmy mogły obłowić się na projektach budżetu obywatelskiego!”.')])
772     pyt12 = quiz_question(
773         label=u'12) Dołączyłeś/-aś do grupy, która zbiera informacje o problemach dotyczących młodych ludzi '
774               u'w Twojej okolicy. Zamierzacie zaprezentować zgromadzone informacje w interesujący sposób, '
775               u'tak by zainteresować lokalne media, służby miejskie, zwykłych obywateli i waszych rówieśników. '
776               u'Grupa nie ma możliwości regularnego spotykania się, dlatego wybraliście pracę wyłącznie '
777               u'przez internet. Który zestaw narzędzi pozwoli wam na jak najlepszą, wspólną pracę?',
778         choices=[
779             (0, u'mail grupowy, komunikator tekstowy (np. Messenger), oprogramowanie do tworzenia podcastów, '
780                 u'stacjonarne narzędzie do tworzenia prezentacji (np. Power Point),'),
781             (1, u'mail grupowy, komunikator tekstowy zespołu (np. Slack), narzędzie do kolektywnego tworzenia '
782                 u'map myśli (np. Coggle), blog redagowany przez wszystkich uczestników projektu, aplikacja do '
783                 u'synchronizowania plików w chmurze (np. Dropbox), narzędzie do grupowej komunikacji za pomocą wideo '
784                 u'(dyskusyjna) (np. Skype),'),
785             (2, u'aplikacja do zarządzania zadaniami zespołu i terminami do wykonania (np. Wunderlist), '
786                 u'narzędzie do tworzenia kolektywnych notatek (np. OneNote) lub wspólnej pracy z tekstem '
787                 u'(np. EtherPad, Google Dokumenty), grupa w serwisie społecznościowym lub tekstowy komunikator '
788                 u'zespołu (np. Messenger lub Slack), narzędzia do gromadzenia lub prezentowania materiałów '
789                 u'(np. wspólny blog, kanał w serwisie społecznościowym).')])
790     pyt13 = quiz_question(
791         label=u'13) Poniżej podano wybrane cechy hasła opublikowanego w Wikipedii. '
792               u'Która z nich jest najbardziej pomocna przy analizie jakości hasła?',
793         choices=[
794             (0, u'liczba edycji hasła,'),
795             (1, u'długość i struktura hasła,'),
796             (2, u'obecność i jakość przypisów.')])
797     pyt14 = quiz_question(
798         label=u'14) Na przeglądanej stronie internetowej znalazłeś/-aś interesującą grafikę, którą chciał(a)byś '
799               u'wykorzystać przygotowywanej cyfrowej narracji. Nie jest ona jednak podpisana. Co robisz?',
800         choices=[
801             (0, u'podpisuję grafikę adresem strony, na której ją znalazłem/-am,'),
802             (1, u'korzystam z opcji wyszukiwania obrazem w wyszukiwarce grafiki, chcąc znaleźć inne strony, '
803                 u'gdzie pojawiła się grafika,'),
804             (2, u'korzystam z opcji wyszukiwania obrazem, a jeśli to się nie powiedzie, skontaktuję się '
805                 u'z administratorem strony, na której znalazłem/-am grafikę, pytając o autora; przeglądam także '
806                 u'informacje o stronie, szukając ewentualnych informacji o zasadach publikacji treści; być może '
807                 u'autor informuje, że wszystkie grafiki są jego autorstwa.')])
808     pyt15 = quiz_question(
809         label=mark_safe(
810             u'15) W nieistniejącym języku programowania TEST dana jest funkcja zapisana w następujący sposób:'
811             u'<p><code>funkcja f(a) { wyświetl a + b;<br>'
812             u'}</code></p>'
813             u'<strong>Przeczytaj uważnie kod i zastanów się, jak działa ta funkcja.'
814             u'Główną wadą tego kodu jest przetwarzanie brakującego argumentu:</strong>'),
815         choices=[
816             (2, u'b,'),
817             (1, u'b będącego dowolną liczbą,'),
818             (0, u'f.')])
819     pyt16 = quiz_question(
820         label=u'16) Przygotowujesz teledysk do utworu nagranego przez twój zespół. Efekt swojej pracy opublikujesz '
821               u'na kanale zespołu na YouTube. Teledysk nie może łamać praw autorskich, w przeciwnym razie zostanie '
822               u'usunięty z serwisu. W teledysku możesz wykorzystać zdjęcia, ikony, fragmenty filmów:',
823         choices=[
824             (1, mark_safe(
825                 u'znalezionych w wyszukiwarce serwisu Flickr na licencji %s, przygotowanych przez ciebie, '
826                 u'ściągniętych z serwisu %s,' % (
827                     make_link(u'CC BY-SA', 'https://www.flickr.com/creativecommons/by-sa-2.0/'),
828                     make_link(u'The Noun Project', 'https://thenounproject.com')))),
829             (2, mark_safe(
830                 u'znalezionych w wyszukiwarce serwisu Flickr na licencji %s, przygotowanych przez ciebie, '
831                 u'ściągniętych z %s,' % (
832                     make_link(u'CC-BY', 'https://www.flickr.com/creativecommons/by-2.0/'),
833                     make_link(u'serwisu ze zdjęciami NASA',
834                               'https://www.nasa.gov/multimedia/imagegallery/index.html')))),
835             (0, mark_safe(
836                 u'znalezionych w wyszukiwarce serwisu Flickr na licencji %s, przygotowanych przez ciebie, '
837                 u'ściągniętych z wyszukiwarki grafiki Google.' %
838                 make_link('CC-BY-NC', 'https://www.flickr.com/creativecommons/by-nc-2.0/')))])
839     pyt17 = quiz_question(
840         label=mark_safe(
841             u'17) Muzeum cyfrowe udostępniło skan druku propagandowego z pierwszej połowy XVII w. '
842             u'w humorystyczny sposób przedstawiający strony angielskiej wojny domowej (trwającej z przerwami '
843             u'między 1642-1651 rokiem):'
844             u'<p><a href="https://commons.wikimedia.org/wiki/File:Engl-Bürgerkrieg.JPG">'
845             u'<img src="https://upload.wikimedia.org/wikipedia/commons/c/c6/Engl-B%C3%BCrgerkrieg.JPG"></a></p>'
846             u'<p><a href="https://commons.wikimedia.org/wiki/File:Engl-Bürgerkrieg.JPG">'
847             u'https://commons.wikimedia.org/wiki/File:Engl-Bürgerkrieg.JPG</a></p>'
848             u'<strong>Najbardziej użytecznym dla użytkowników przeszukujących stronę zestawem słów kluczowych '
849             u'opisujących ten obiekt będzie:</strong>'),
850         choices=[
851             (2, u'Anglia, wojna domowa, karykatura, propaganda,'),
852             (0, u'komiks, śmiech, Anglicy, Wielka Brytania, psy,'),
853             (1, u'Angielska Wojna Domowa 1642-1651, propaganda.')])
854     pyt18 = quiz_question(
855         label=u'18) Podczas wycieczki szkolnej zrobiłeś sporo zdjęć znajomym, w różnych sytuacjach. '
856               u'Masz również dostęp do wielu fotografii, które przygotowali twoi koledzy i koleżanki. '
857               u'Zamierzasz niektóre z nich zamieścić na swoim kanale w serwisie społecznościowym. Możesz opublikować:',
858         choices=[
859             (0, u'zdjęcia prezentujące selfie (o ile nie przedstawiają więcej niż dwóch osób), '
860                 u'zdjęcia grupy podczas zwiedzania, zdjęcia, które ktoś zrobił tobie na tle zwiedzanych obiektów, '
861                 u'zdjęcia, na których ludzie się uśmiechają i cieszą, że robisz im zdjęcie,'),
862             (1, u'zdjęcia prezentujące selfie (ale tylko twoje), zdjęcia pokazujące w oddali grupę na tle '
863                 u'zwiedzanych obiektów, zdjęcia, zdjęcia na których widać tylko ciebie, na tle zwiedzanych obiektów,'),
864             (2, u'zdjęcia prezentujące selfie (na których jesteś ty, ale również inne osoby, które potwierdziły, '
865                 u'że możesz opublikować fotografie), zdjęcia na których widać tylko ciebie '
866                 u'i masz zgodę na ich publikację od osoby, która wykonała fotografię, '
867                 u'wykonane przez ciebie zdjęcia zwiedzanych obiektów.')])
868     pyt19 = quiz_question(
869         label=u'19) Korzystając z sieci, natrafiamy na różne interesujące informacje. '
870               u'Pojawiają się w wielu serwisach informacyjnych, społecznościowych, w postaci reklam '
871               u'dołączanych do materiałów wideo, reklam zamieszczonych w tekstach itp. '
872               u'Na co warto zwracać uwagę, podczas codziennego korzystania z mediów, '
873               u'żeby efektywnie wykorzystać czas spędzony w internecie?',
874         choices=[
875             (1, u'zaplanować czas spędzany na korzystaniu z mediów i starać się trzymać swojego planu, '
876                 u'nie unikasz jednak nagłych rozmów przez komunikator, oglądania postów, '
877                 u'zdjęć i filmików dodawanych przez znajomych,'),
878             (0, u'zaplanować, co będziesz robił(a), ale traktujesz to jako ramę działania, wiesz, '
879                 u'że po drodze pojawi się wiele interesujących informacji, z których skorzystasz,'),
880             (2, u'zaplanować czas spędzany na korzystaniu z mediów i rejestrować, co, '
881                 u'kiedy i przez ile czasu robisz, np. instalując aplikację do mierzenia czasu spędzanego w sieci. '
882                 u'Następnie analizujesz zebrane informacje i starasz się określić, co robisz zbyt często '
883                 u'i jakie rzeczy odciągają Twoją uwagę od tych zaplanowanych.')])
884     pyt20 = quiz_question(
885         label=u'20) Blokująca reklamy wtyczka do przeglądarki działa w następujący sposób:',
886         choices=[
887             (0, u'analizuje treść tekstów oraz obrazków i blokuje te, które zawierają reklamy,'),
888             (1, u'blokuje wyświetlanie plików reklam zanim wyświetli je przeglądarka,'),
889             (2, u'blokuje komunikację przeglądarki z serwerami publikującymi reklamy.')])
890
891     ANSWER_COMMENTS = [
892         (u'dobrze', u'źle', u'najlepiej'),
893         (u'średnio', u'głupio', u'super'),
894         (u'słabo', u'beznadziejnie', u'ujdzie'),
895         (u'trója', u'pała', u'szóstka'),
896         (u'dobrze', u'źle', u'najlepiej'),
897         (u'średnio', u'głupio', u'super'),
898         (u'słabo', u'beznadziejnie', u'ujdzie'),
899         (u'trója', u'pała', u'szóstka'),
900         (u'dobrze', u'źle', u'najlepiej'),
901         (u'średnio', u'głupio', u'super'),
902         (u'słabo', u'beznadziejnie', u'ujdzie'),
903         (u'trója', u'pała', u'szóstka'),
904         (u'dobrze', u'źle', u'najlepiej'),
905         (u'średnio', u'głupio', u'super'),
906         (u'słabo', u'beznadziejnie', u'ujdzie'),
907         (u'trója', u'pała', u'szóstka'),
908         (u'dobrze', u'źle', u'najlepiej'),
909         (u'średnio', u'głupio', u'super'),
910         (u'słabo', u'beznadziejnie', u'ujdzie'),
911         (u'trója', u'pała', u'szóstka'),
912     ]
913
914     @classmethod
915     def results(cls, contact):
916         fields = cls().fields
917
918         def get_idx(choices, answer):
919             return dict((score, i) for i, (score, text) in enumerate(choices))[answer]
920
921         def question_data(i):
922             field = 'pyt%s' % i
923             choices = fields[field].choices
924             score = contact.body[field]
925             chosen_idx = get_idx(choices, score)
926             correct_idx = get_idx(choices, 2)
927             return {
928                 'score': score,
929                 'chosen_idx': chosen_idx,
930                 'correct_idx': correct_idx,
931                 'chosen': 'abc'[chosen_idx],
932                 'correct': 'abc'[correct_idx],
933                 'label': fields[field].label,
934                 'comment': cls.ANSWER_COMMENTS[i-1][chosen_idx],
935                 'answers': [(text, a_score == score, a_score == 2) for a_score, text in choices],
936             }
937         question_count = len(fields) - 1
938         questions = [question_data(i) for i in xrange(1, question_count + 1)]
939         points = sum(question['score'] for question in questions)
940         return {'questions': questions, 'points': points/2., 'total': question_count}