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 , 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 )
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 )