from django import forms from dal import autocomplete from django.contrib.auth.forms import PasswordResetForm from django.core.exceptions import ObjectDoesNotExist from django.contrib.auth.models import User from seminar.models import Skola, Resitel, Osoba from datetime import date import logging # pro přidání políčka do formuláře je potřeba # - mít v modelu tu položku, kterou chci upravovat # - přidat do views (prihlaskaView, resitelEditView) # - přidat do forms # - includovat do html class DateInput(forms.DateInput): # aby se datum dalo vybírat z kalendáře input_type = 'date' class TelInput(forms.TextInput): # tohle je možná k niřemu, ale alepsoň to mění input type a nic to nekazí input_type = 'tel' 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') 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 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_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 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) 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') except ObjectDoesNotExist: pass return username def clean_email(self): err_logger = logging.getLogger('seminar.prihlaska.problem') email = self.cleaned_data.get('email') try: osoba = Osoba.objects.get(email=email) msg = "Email {} exists".format(email) if osoba.user is not None: 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) 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ů.') 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') != '': 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')) 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 # 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.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') 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')) class PoMaturiteProfileEditForm(ProfileEditForm): rok_maturity = forms.IntegerField( label='Rok maturity', required=True)