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.
 
 
 
 
 
 

66 lines
2.2 KiB

from http import HTTPStatus
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 Tohle není odladěné, selhává to nekontrolovaně
# a obecně je to fujky nekomentovaný kód
class HromadnePridaniForm(Form):
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:")
# FIXME Tohle není odladěné, selhává to nekontrolovaně
# a obecně je to fujky nekomentovaný kód
class HromadnePridaniView(FormView):
form_class = HromadnePridaniForm
template_name = "generic_form.html"
success_url = 'hromadne_pridani'
def get_context_data(self, **kwargs):
context = super().get_context_data()
context["nadpis"] = "Hromadné přidání úloh"
return context
def form_valid(self, form):
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):
u = m.Uloha.objects.create(
nadproblem=t,
nazev=pfx + f"{'úloha' if b > 0 else 'problém'} {k + 1}",
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)