Vylepšení odevzdávátka #13

Merged
zelvuska merged 17 commits from vylepseni_odevzdavatka into master 2023-01-02 20:25:01 +01:00
7 changed files with 50 additions and 1 deletions
Showing only changes of commit 0d17b45011 - Show all commits

View file

@ -32,6 +32,7 @@ class PrihlaskaForm(PasswordResetForm):
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)
@ -105,6 +106,17 @@ class PrihlaskaForm(PasswordResetForm):
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')
@ -138,6 +150,7 @@ class ProfileEditForm(forms.Form):
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)
@ -190,6 +203,18 @@ class ProfileEditForm(forms.Form):
# pass
# return username
#
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)
zelvuska marked this conversation as resolved Outdated

Tohle velmi zní, jako že ta přezdívka prostě nejde editovat vůbec – pokud už v databázi jsem, tak tohle matchne.

Tohle velmi zní, jako že ta přezdívka prostě nejde editovat vůbec – pokud už v databázi jsem, tak tohle matchne.

?

?

Pokud si Alice nastaví přezdívku „Axolotl“, tak ji má v databázi. Dotaz Restitel.objects.get(prezdivka=Axolotl) tedy tuto přezdívku najde a celý ResitelEditForm kvůli tomu nepůjde Alici odeslat, přestože je to její přezdívka.

Pokud si Alice nastaví přezdívku „Axolotl“, tak ji má v databázi. Dotaz `Restitel.objects.get(prezdivka=Axolotl)` tedy tuto přezdívku najde a celý `ResitelEditForm` kvůli tomu nepůjde Alici odeslat, přestože je to její přezdívka.

Promiň, tvůj komentář jsem pochopil jinak. Samozřejmě tohle je špatně… Dík

Promiň, tvůj komentář jsem pochopil jinak. Samozřejmě tohle je špatně… Dík

Ha, já nevím, podle čeho určit, který řešitel to edituje…

Ha, já nevím, podle čeho určit, který řešitel to edituje…

A nestačí to prostě uložit a zjistit, jestli to vyšlo? (Dost možná nestačí, nemám nastudovanou interakci formů a modelů, ale kdyby to stačilo, tak je to zdaleka nejjednodušší…)

A nestačí to prostě uložit a zjistit, jestli to vyšlo? (Dost možná nestačí, nemám nastudovanou interakci formů a modelů, ale kdyby to stačilo, tak je to zdaleka nejjednodušší…)

A poznáš, co selhalo? A přijde mi, že tohle by mělo být ještě v clean_…

A poznáš, co selhalo? A přijde mi, že tohle by mělo být ještě v clean_…

Vyřešeno. Ten objekt má při použití nastavený username…

Vyřešeno. Ten objekt má při použití nastavený username…
raise forms.ValidationError('Přezdívka je již použita')
except ObjectDoesNotExist:
pass
zelvuska marked this conversation as resolved Outdated

Reálně se celý try-block snaží jen imitovat podmínku „pokud přezdívka není zabraná“ – je přehlednější to vyřešit spíš něčím jako if m.Resitel.objects.….count() > 0: raise Exception() (ne nutně na jednom řádku a s určitě s příslušnými třídami a doplněními).

Reálně se celý try-block snaží jen imitovat podmínku „pokud přezdívka není zabraná“ – je přehlednější to vyřešit spíš něčím jako `if m.Resitel.objects.….count() > 0: raise Exception()` (ne nutně na jednom řádku a s určitě s příslušnými třídami a doplněními).
return prezdivka_resitele
def clean_email(self):
err_logger = logging.getLogger('seminar.prihlaska.problem')
email = self.cleaned_data.get('email')

View file

@ -44,6 +44,7 @@
</h4>
<table class="form">
{% include "personalni/udaje/prihlaska_field.html" with field=form.jmeno %}
{% include "personalni/udaje/prihlaska_field.html" with field=form.prezdivka_resitele %}
{% include "personalni/udaje/prihlaska_field.html" with field=form.prijmeni %}
{% include "personalni/udaje/prihlaska_field.html" with field=form.pohlavi_muz%}
{% include "personalni/udaje/prihlaska_field.html" with field=form.email %}

View file

@ -11,7 +11,7 @@ Získáváme od Tebe údaje vyplněné v přihlášce do semináře (jméno, př
Slibujeme Ti, že Tvá osobní data nezneužijeme k ničemu, co by nesouviselo s M&amp;M nebo s dalšími aktivitami Matfyzu, a nikdy je nepředáme nikomu cizímu. Údaje využíváme k zajištění chodu semináře a také je sdílíme s ostatními propagačními akcemi Matfyzu, abychom mohli vyhodnocovat úspěšnost akcí. Pokud budeš mít zájem, budeme Ti také posílat zajímavé zprávy a novinky týkajíci se Matfyzu.
</p>
<p class="gdpr">
Veřejně vystavujeme pouze výsledkové listiny, které také uchováváme pro archivní účely. Pokud ale z nějakého důvodu nebudeš chtít mít své jméno či školu uvedené ve výsledkové listině, není problém to zařídit, napiš nám. Z tištěných materiálů samozřejmě údaje už odstranit nemůžeme.
Veřejně vystavujeme pouze seznam přezdívek (pro výběr spoluřešitelů k řešení) a výsledkové listiny, které také uchováváme pro archivní účely. Pokud ale z nějakého důvodu nebudeš chtít mít své jméno či školu uvedené ve výsledkové listině, není problém to zařídit, napiš nám. Z tištěných materiálů samozřejmě údaje už odstranit nemůžeme.
zelvuska marked this conversation as resolved
Review

👍

👍
</p>
<p class="gdpr">
Na soustředěních a dalších akcích semináře navíc pořizujeme fotografie a videozáznamy a používáme je ke zpravodajským a propagačním účelům. Pro propagační účely si od Tebe vyžádáme samostatný souhlas na začátku akce.

View file

@ -46,6 +46,7 @@
</h4>
<table class="form">
{% include "personalni/udaje/prihlaska_field.html" with field=form.jmeno %}
{% include "personalni/udaje/prihlaska_field.html" with field=form.prezdivka_resitele %}
{% include "personalni/udaje/prihlaska_field.html" with field=form.prijmeni %}
{% include "personalni/udaje/prihlaska_field.html" with field=form.pohlavi_muz%}
{% include "personalni/udaje/prihlaska_field.html" with field=form.email %}

View file

@ -160,6 +160,7 @@ def resitelEditView(request):
if resitel_edit:
## Změny v řešiteli
resitel_edit.prezdivka_resitele = fcd['prezdivka_resitele']
resitel_edit.skola = fcd['skola']
resitel_edit.rok_maturity = fcd['rok_maturity']
resitel_edit.zasilat = fcd['zasilat']
@ -263,6 +264,7 @@ def prihlaskaView(request):
err_logger.warning(f'Zaregistrovala se osoba s kolizním jménem. ID osob: {[o.id for o in kolize]}')
r = s.Resitel(
prezdivka_resitele=fcd['prezdivka_resitele'],
rok_maturity = fcd['rok_maturity'],
zasilat = fcd['zasilat'],
zasilat_cislo_emailem = fcd['zasilat_cislo_emailem']

View file

@ -0,0 +1,18 @@
# Generated by Django 2.2.28 on 2022-11-21 22:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('seminar', '0109_hodnoceni_feedback'),
]
operations = [
migrations.AddField(
model_name='resitel',
name='prezdivka_resitele',
field=models.CharField(blank=True, max_length=256, null=True, unique=True, verbose_name='přezdívka řešitele'),
),
]

View file

@ -211,6 +211,8 @@ class Resitel(SeminarModelBase):
# Interní ID
id = models.AutoField(primary_key = True)
prezdivka_resitele = models.CharField('přezdívka řešitele', blank=True, null=True, max_length=256, unique=True)
osoba = models.OneToOneField(Osoba, blank=False, null=False, verbose_name='osoba',
on_delete=models.PROTECT)