|
@ -1,5 +1,6 @@ |
|
|
from http import HTTPStatus |
|
|
from http import HTTPStatus |
|
|
|
|
|
|
|
|
|
|
|
from django.core.exceptions import ValidationError |
|
|
from django.db import transaction |
|
|
from django.db import transaction |
|
|
from django.forms import Form, CharField, IntegerField |
|
|
from django.forms import Form, CharField, IntegerField |
|
|
from django.views.generic import FormView |
|
|
from django.views.generic import FormView |
|
@ -21,28 +22,44 @@ def problemView(request, pk): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# FIXME Tohle možná patří do forms.py |
|
|
# FIXME Tohle možná patří do forms.py |
|
|
# FIXME Tohle není odladěné, selhává to nekontrolovaně |
|
|
# FIXME Chyby se ve formuláři zobrazují nějak divně |
|
|
# a obecně je to fujky nekomentovaný kód |
|
|
|
|
|
class HromadnePridaniForm(Form): |
|
|
class HromadnePridaniForm(Form): |
|
|
|
|
|
""" Formulář pro hromadné přidání úložek a problémů """ |
|
|
|
|
|
|
|
|
tema = CharField(label="Název tématu:") |
|
|
tema = CharField(label="Název tématu:") |
|
|
dil = IntegerField(label="Díl:", min_value=1) |
|
|
dil = IntegerField(label="Díl:", min_value=1) |
|
|
body = CharField(label="Počty bodů (0 pro problém) oddělené čárkami:") |
|
|
body = CharField(label="Počty bodů (0 pro problém) oddělené čárkami:") |
|
|
|
|
|
|
|
|
|
|
|
def clean_tema(self): |
|
|
|
|
|
""" Kontrola, že `tema` je název právě jednoho tématu """ |
|
|
|
|
|
if m.Tema.objects.filter( |
|
|
|
|
|
nazev__exact=self.cleaned_data['tema'], |
|
|
|
|
|
nadproblem=None).count() != 1: |
|
|
|
|
|
raise ValidationError("Špatný nebo nepřesně zadaný název témátka") |
|
|
|
|
|
|
|
|
|
|
|
def clean_body(self): |
|
|
|
|
|
""" Kontrola, že `body` je seznam čísel """ |
|
|
|
|
|
try: |
|
|
|
|
|
list(map(int, self.cleaned_data["body"].split(","))) |
|
|
|
|
|
except ValueError: |
|
|
|
|
|
raise ValidationError("Špatný formát bodů") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# FIXME Tohle není odladěné, selhává to nekontrolovaně |
|
|
|
|
|
# a obecně je to fujky nekomentovaný kód |
|
|
|
|
|
class HromadnePridaniView(FormView): |
|
|
class HromadnePridaniView(FormView): |
|
|
|
|
|
""" View pro hromadné přidání úložek a problémů """ |
|
|
form_class = HromadnePridaniForm |
|
|
form_class = HromadnePridaniForm |
|
|
template_name = "generic_form.html" |
|
|
template_name = "generic_form.html" |
|
|
success_url = 'hromadne_pridani' |
|
|
success_url = 'hromadne_pridani' |
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs): |
|
|
def get_context_data(self, **kwargs): |
|
|
|
|
|
""" Přidání nadpisu stránky a url, kam se má poslat formulář. """ |
|
|
context = super().get_context_data() |
|
|
context = super().get_context_data() |
|
|
context["nadpis"] = "Hromadné přidání úloh" |
|
|
context["nadpis"] = "Hromadné přidání úloh" |
|
|
context["form_url"] = "hromadne_pridani" |
|
|
context["form_url"] = "hromadne_pridani" |
|
|
return context |
|
|
return context |
|
|
|
|
|
|
|
|
def form_valid(self, form): |
|
|
def form_valid(self, form): |
|
|
|
|
|
""" Upravený Pavlův skript na hromadné přidání úložek a problémů. """ |
|
|
cd = form.cleaned_data |
|
|
cd = form.cleaned_data |
|
|
tema = cd["tema"] |
|
|
tema = cd["tema"] |
|
|
dil = cd["dil"] |
|
|
dil = cd["dil"] |
|
@ -52,10 +69,10 @@ class HromadnePridaniView(FormView): |
|
|
with transaction.atomic(): |
|
|
with transaction.atomic(): |
|
|
pfx = f"{t.nazev}, díl {dil}, " |
|
|
pfx = f"{t.nazev}, díl {dil}, " |
|
|
|
|
|
|
|
|
for k, b in enumerate(body): |
|
|
for k, b in enumerate(body, 1): |
|
|
u = m.Uloha.objects.create( |
|
|
u = m.Uloha.objects.create( |
|
|
nadproblem=t, |
|
|
nadproblem=t, |
|
|
nazev=pfx + f"{'úloha' if b > 0 else 'problém'} {k + 1}", |
|
|
nazev=pfx + f"{'úloha' if b > 0 else 'problém'} {k}", |
|
|
autor=t.autor, |
|
|
autor=t.autor, |
|
|
garant=t.garant, |
|
|
garant=t.garant, |
|
|
max_body=b, |
|
|
max_body=b, |
|
|