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.

87 lines
3.0 KiB

from http import HTTPStatus
from django.core.exceptions import ValidationError
from django.db import transaction
from django.forms import Form, CharField, IntegerField
from django.views.generic import FormView
import seminar.models as m
from django.shortcuts import render, get_object_or_404
def problemView(request, pk):
# Pokud problém neexistuje, hodíme obyčejnou 404
# Taktéž v případě, že takový problém nemá být vidět
problem = get_object_or_404(m.Problem, id=pk, stav__in=[m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY])
# Problém existuje, neumíme ho zobrazit, renderujeme nějakou haluz
template = 'universal.html'
ctx = {
'raw_html': f'<h2>Obsah nelze zobrazit</h2><p>Požadovaný problém {problem.nazev} sice existuje, ale aktuálně jej nelze zobrazit. Omlouváme se za potíže</p>',
}
status_code = HTTPStatus.NOT_FOUND
return render(request, template, context=ctx, status=status_code)
# FIXME Tohle možná patří do forms.py
# FIXME Chyby se ve formuláři zobrazují nějak divně
class HromadnePridaniForm(Form):
""" Formulář pro hromadné přidání úložek a problémů """
tema = CharField(label="Název tématu:")
dil = IntegerField(label="Díl:", min_value=1)
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")
return self.cleaned_data['tema']
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ů")
return self.cleaned_data['body']
class HromadnePridaniView(FormView):
""" View pro hromadné přidání úložek a problémů """
form_class = HromadnePridaniForm
template_name = "generic_form.html"
success_url = 'hromadne_pridani'
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["nadpis"] = "Hromadné přidání úloh"
context["form_url"] = "hromadne_pridani"
return context
def form_valid(self, form):
""" Upravený Pavlův skript na hromadné přidání úložek a problémů. """
cd = form.cleaned_data
tema = cd["tema"]
dil = cd["dil"]
body = list(map(int, cd["body"].split(",")))
t = m.Problem.objects.get(nazev__exact=tema, nadproblem=None)
with transaction.atomic():
pfx = f"{t.nazev}, díl {dil}, "
for k, b in enumerate(body, 1):
u = m.Uloha.objects.create(
nadproblem=t,
nazev=pfx + f"{'úloha' if b > 0 else 'problém'} {k}",
autor=t.autor,
garant=t.garant,
max_body=b,
cislo_zadani=m.Cislo.get(t.rocnik.rocnik, dil),
kod=k,
stav=m.Problem.STAV_ZADANY,
)
u.opravovatele.set(t.opravovatele.all())
return super().form_valid(form)