diff --git a/personalni/forms.py b/personalni/forms.py index 2494d08a..3199a8a2 100644 --- a/personalni/forms.py +++ b/personalni/forms.py @@ -25,106 +25,85 @@ class TelInput(forms.TextInput): input_pattern="^[+]?[()/0-9. -]{9,}$" -class PrihlaskaForm(PasswordResetForm): - username = forms.CharField(label='Přihlašovací jméno', - max_length=256, - required=True, - help_text='Tímto jménem se následně budeš přihlašovat pro odevzdání řešení a další činnosti v semináři') +class UdajeForm(forms.Form): + username = None + err_logger = logging.getLogger('seminar.prihlaska.problem') jmeno = forms.CharField(label='Jméno', max_length=256, required=True) prezdivka_resitele = forms.CharField(label='Přezdívka (veřejná)', max_length=256, required=False) prijmeni = forms.CharField(label='Příjmení', max_length=256, required=True) - pohlavi_muz = forms.ChoiceField(label='Pohlaví', - choices = ((True,'muž'),(False,'žena')), required=True) - email = forms.EmailField(label='E-mail',max_length=256, required=True) - telefon = forms.CharField(widget=TelInput(),label='Telefon',max_length=256, required=False) - datum_narozeni = forms.DateField(widget=DateInput(),label='Datum narození', required=False) + pohlavi_muz = forms.ChoiceField(label='Pohlaví', choices=((True, 'muž'), (False, 'žena')), required=True) + email = forms.EmailField(label='E-mail', max_length=256, required=True) + telefon = forms.CharField(widget=TelInput(), label='Telefon', max_length=256, required=False) + datum_narozeni = forms.DateField(widget=DateInput(), label='Datum narození', required=False) ulice = forms.CharField(label='Ulice a číslo popisné', max_length=256, required=False) mesto = forms.CharField(label='Město', max_length=256, required=False) psc = forms.CharField(label='PSČ', max_length=32, required=False) - stat = forms.ChoiceField(label='Stát', - choices = (('CZ', 'Česká Republika'), - ('SK', 'Slovenská Republika'), - ('other', 'Jiné')), - required=False) + stat = forms.ChoiceField(label='Stát', choices=(('CZ', 'Česká republika'), ('SK', 'Slovenská republika'), ('other', 'Jiné')), required=False) stat_text = forms.CharField(label='Stát', max_length=256, required=False) - skola = forms.ModelChoiceField(label="Škola", + skola = forms.ModelChoiceField( + label="Škola", queryset=Skola.objects.all(), widget=autocomplete.ModelSelect2( url='autocomplete_skola', - attrs = {'data-placeholder--id': '-1', - 'data-placeholder--text' : '---', - 'data-allow-clear': 'true'}) - ,required=False) - + attrs={ + 'data-placeholder--id': '-1', + 'data-placeholder--text': '---', + 'data-allow-clear': 'true' + } + ), + required=False, + ) + skola_nazev = forms.CharField(label='Název školy', max_length=256, required=False) skola_adresa = forms.CharField(label='Adresa školy', max_length=256, required=False) -# trida = forms.CharField(label='Třída',max_length=10, required=True) - rok_maturity = forms.IntegerField( - label='Rok maturity', - min_value=date.today().year, + label='Rok maturity', + min_value=date.today().year, max_value=date.today().year+8, - required=True) - zasilat = forms.ChoiceField(label='Kam zasílat čísla (zasílání není zpoplatněno)',choices = Resitel.ZASILAT_CHOICES, required=True, initial=Resitel.ZASILAT_NIKAM) - zasilat_cislo_emailem = forms.BooleanField(label='Chci dostávat e-mailem upozornění na vydání nového čísla', required=False, initial=True) - - jak_se_dozvedeli = forms.CharField(widget=forms.Textarea({"rows": 3, "cols": 20}), label='Jak ses o M&M dozvěděl(a)? (Nechceš-li odpovídat, napiš „nechci uvést“.)', required=True) + required=True, + ) - gdpr = forms.BooleanField(label='Souhlasím se zpracováním osobních údajů', required=True) - spam = forms.BooleanField(label='Souhlasím se zasíláním materiálů od MFF UK', required=False) - - def clean_username(self): - err_logger = logging.getLogger('seminar.prihlaska.problem') - username = self.cleaned_data.get('username') - try: - User.objects.get(username=username) - msg = "Username {} exists".format(username) - err_logger.info(msg) - raise forms.ValidationError('Přihlašovací jméno je již použito') + zasilat = forms.ChoiceField(label='Kam zasílat (odměny, pozvánky, případně čísla nebo propagační materiály)', choices=[it for it in Resitel.ZASILAT_CHOICES if it[0] != Resitel.ZASILAT_NIKAM], required=True, initial=Resitel.ZASILAT_DOMU) + zasilat_cislo_papirove = forms.BooleanField(label='Chci dostávat čísla poštou (zasílání není zpoplatněno)', required=False, initial=False) + zasilat_cislo_emailem = forms.BooleanField(label='Chci dostávat e-mailem upozornění na vydání nového čísla', required=False, initial=True) + spam = forms.BooleanField(label='Souhlasím se zasíláním propagačních materiálů od MFF UK', required=False) - except ObjectDoesNotExist: - pass - return username + def clean_prezdivka_resitele(self): + prezdivka_resitele = self.cleaned_data.get('prezdivka_resitele') + if prezdivka_resitele == '': + return prezdivka_resitele + if Resitel.objects.filter(prezdivka_resitele=prezdivka_resitele).exclude(osoba__user__username=self.username).count() > 0: + raise forms.ValidationError('Přezdívka je již použita') + return prezdivka_resitele def clean_email(self): - err_logger = logging.getLogger('seminar.prihlaska.problem') email = self.cleaned_data.get('email') try: - osoba = Osoba.objects.get(email=email) + osoba = Osoba.objects.exclude(user__username=self.username).get(email=email) msg = "Email {} exists".format(email) if osoba.user is not None: - err_logger.info(msg) + self.err_logger.info(msg) raise forms.ValidationError('E-mail je již použit') else: msg += ', but currently has no User, so allowing registration.' - err_logger.info(msg) + self.err_logger.info(msg) except ObjectDoesNotExist: pass return email - def clean_prezdivka_resitele(self): - prezdivka_resitele = self.cleaned_data.get('prezdivka_resitele') - if prezdivka_resitele == '': - return prezdivka_resitele - if Resitel.objects.filter(prezdivka_resitele=prezdivka_resitele).count() > 0: - raise forms.ValidationError('Přezdívka je již použita') - return prezdivka_resitele - def clean_zasilat(self): zasilat = self.cleaned_data.get('zasilat') ulice = self.cleaned_data.get('ulice') if zasilat == Resitel.ZASILAT_DOMU and ulice == "": - raise forms.ValidationError('Nevyplněná adresa bydliště, nelze zasílat čísla domů.') + raise forms.ValidationError('Nevyplněná adresa bydliště, nelze zasílat domů.') return zasilat def clean(self): super().clean() - - err_logger = logging.getLogger('seminar.prihlaska.problem') data = self.cleaned_data if data.get('stat') != 'other' and data.get('stat_text') != '': @@ -140,106 +119,41 @@ class PrihlaskaForm(PasswordResetForm): self.add_error('skola_adresa',forms.ValidationError('Je nutné vyplnit adresu školy')) -class ProfileEditForm(forms.Form): - username = forms.CharField(label='Přihlašovací jméno', - max_length=256, - required=False, - disabled=True) - - jmeno = forms.CharField(label='Jméno', max_length=256, required=True) - prezdivka_resitele = forms.CharField(label='Přezdívka (veřejná)', max_length=256, required=False) - prijmeni = forms.CharField(label='Příjmení', max_length=256, required=True) - pohlavi_muz = forms.ChoiceField(label='Pohlaví', - choices = ((True,'muž'),(False,'žena')), required=True) - email = forms.EmailField(label='E-mail',max_length=256, required=True) - telefon = forms.CharField(widget=TelInput(),label='Telefon',max_length=256, required=False) - datum_narozeni = forms.DateField(widget=DateInput(),label='Datum narození', required=False) - ulice = forms.CharField(label='Ulice', max_length=256, required=False) - mesto = forms.CharField(label='Město', max_length=256, required=False) - psc = forms.CharField(label='PSČ', max_length=32, required=False) - stat = forms.ChoiceField(label='Stát', - choices = (('CZ', 'Česká republika'), - ('SK', 'Slovenská republika'), - ('other', 'Jiné')), - required=False) - stat_text = forms.CharField(label='Stát', max_length=256, required=False) - - skola = forms.ModelChoiceField(label="Škola", - queryset=Skola.objects.all(), - widget=autocomplete.ModelSelect2( - url='autocomplete_skola', - attrs = {'data-placeholder--id': '-1', - 'data-placeholder--text' : '---', - 'data-allow-clear': 'true'}) - ,required=False) - - skola_nazev = forms.CharField(label='Název školy', max_length=256, required=False) - skola_adresa = forms.CharField(label='Adresa školy', max_length=256, required=False) -# trida = forms.CharField(label='Třída',max_length=10, required=True) - rok_maturity = forms.IntegerField( - label='Rok maturity', - min_value=date.today().year, - max_value=date.today().year+8, - required=True) - zasilat = forms.ChoiceField(label='Kam zasílat čísla',choices = Resitel.ZASILAT_CHOICES, required=True) - zasilat_cislo_emailem = forms.BooleanField(label='Chci dostávat email s upozorněním na vydání nového čísla', required=False) - - spam = forms.BooleanField(label='Souhlasím se zasíláním materiálů od MFF UK', required=False) -# def clean_username(self): -# err_logger = logging.getLogger('seminar.prihlaska.problem') -# username = self.cleaned_data.get('username') -# try: -# User.objects.get(username=username) -# msg = "Username {} exists".format(username) -# err_logger.info(msg) -# raise forms.ValidationError('Přihlašovací jméno je již použito') -# -# except ObjectDoesNotExist: -# pass -# return username -# +class PrihlaskaForm(PasswordResetForm, UdajeForm): + username = forms.CharField( + label='Přihlašovací jméno', + max_length=256, + required=True, + help_text='Tímto jménem se následně budeš přihlašovat pro odevzdání řešení a další činnosti v semináři', + ) - def clean_prezdivka_resitele(self): - prezdivka_resitele = self.cleaned_data.get('prezdivka_resitele') - if prezdivka_resitele == '': - return prezdivka_resitele - if Resitel.objects.filter(prezdivka_resitele=prezdivka_resitele).exclude(osoba__user__username=self.username).count() > 0: - raise forms.ValidationError('Přezdívka je již použita') - return prezdivka_resitele + jak_se_dozvedeli = forms.CharField(widget=forms.Textarea({"rows": 3, "cols": 20}), label='Jak ses o M&M dozvěděl(a)? (Nechceš-li odpovídat, napiš „nechci uvést“.)', required=True) - def clean_email(self): - err_logger = logging.getLogger('seminar.prihlaska.problem') - email = self.cleaned_data.get('email') + gdpr = forms.BooleanField(label='Souhlasím se zpracováním osobních údajů', required=True) + + def clean_username(self): + username = self.cleaned_data.get('username') try: - Osoba.objects.exclude(user__username=self.username).get(email=email) - msg = "Email {} exists (in edit)".format(email) - err_logger.info(msg) - raise forms.ValidationError('Email je již použit') + User.objects.get(username=username) + msg = "Username {} exists".format(username) + self.err_logger.info(msg) + raise forms.ValidationError('Přihlašovací jméno je již použito') except ObjectDoesNotExist: pass - return email - #def clean(self): - # super().clean() - # - # err_logger = logging.getLogger('seminar.prihlaska.problem') - - # data = self.cleaned_data - # if data.get('password') != data.get('password_check'): - # self.add_error('password_check',forms.ValidationError('Hesla se neshodují')) - # if data.get('stat') != '' and data.get('stat_text') != '': - # self.add_error('stat',forms.ValidationError('Nelze mít vybraný stát z menu a zároven zapsaný textem')) - # if data.get('skola') and (data.get('skola_nazev') or data.get('skola_adresa')): - # self.add_error('skola',forms.ValidationError('Pokud je škola v seznamu, nevypisujte ji ručně, pokud není, zrušte výběr ze seznamu (křížek vpravo)')) - # if not data.get('skola'): - # if data.get('skola_nazev')=='' and data.get('skola_adresa')=='': - # self.add_error('skola',forms.ValidationError('Je nutné vyplnit školu')) - # elif data.get('skola_nazev')=='': - # self.add_error('skola_nazev',forms.ValidationError('Je nutné vyplnit název školy')) - # elif data.get('skola_adresa')=='': - # self.add_error('skola_adresa',forms.ValidationError('Je nutné vyplnit adresu školy')) + return username + + +class ProfileEditForm(UdajeForm): + err_logger = logging.getLogger('seminar.edit.problem') + username = forms.CharField( + label='Přihlašovací jméno', + max_length=256, + required=False, + disabled=True, + ) class PoMaturiteProfileEditForm(ProfileEditForm): diff --git a/personalni/templates/personalni/udaje/edit.html b/personalni/templates/personalni/udaje/edit.html index 9091925d..085e4246 100644 --- a/personalni/templates/personalni/udaje/edit.html +++ b/personalni/templates/personalni/udaje/edit.html @@ -1,109 +1,19 @@ {% extends "base.html" %} {% load static %} -{% block script %} - -{% endblock %} - - - {% block content %}
Tučně popsaná pole jsou povinná.
- - - {% endblock %} diff --git a/personalni/templates/personalni/udaje/udaje.html b/personalni/templates/personalni/udaje/udaje.html new file mode 100644 index 00000000..f39e8b47 --- /dev/null +++ b/personalni/templates/personalni/udaje/udaje.html @@ -0,0 +1,75 @@ +{% load static %} + +{% block script %} + +{% endblock %} + +{% csrf_token %} +{{form.non_field_errors}} + +(Prosíme, zkuste ji najít, téměř jistě ji v seznamu máme. Školy se dobře hledají podle příjmení lidí v jejich názvu, podle ulice, případně název ulice mezera město, atd. Nezadávejte slova, která se často zkracují – gymnázium, střední odborná škola, křestní jména…) | ||
Vyplň prosím celý název a adresu školy. |