Web M&M
https://mam.matfyz.cz
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
251 lines
10 KiB
251 lines
10 KiB
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)
|
|
|
|
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
|
|
try:
|
|
Resitel.objects.get(prezdivka_resitele=prezdivka_resitele)
|
|
raise forms.ValidationError('Přezdívka je již použita')
|
|
except ObjectDoesNotExist:
|
|
pass
|
|
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)
|
|
|