|
|
@ -62,7 +62,7 @@ class VlozBodyView(generic.ListView): |
|
|
|
print(self.tema) |
|
|
|
self.problemy = Problem.objects.filter(nadproblem = self.tema) |
|
|
|
print(self.problemy) |
|
|
|
self.reseni = Reseni.objects.filter(problem__in=self.problemy) |
|
|
|
self.reseni = Reseni.objects.filter(problem__in=self.problemy) |
|
|
|
print(self.reseni) |
|
|
|
return self.reseni |
|
|
|
|
|
|
@ -81,7 +81,7 @@ class ObalkovaniView(generic.ListView): |
|
|
|
def get_context_data(self, **kwargs): |
|
|
|
context = super(ObalkovaniView, self).get_context_data(**kwargs) |
|
|
|
print(self.cislo) |
|
|
|
context['cislo'] = self.cislo |
|
|
|
context['cislo'] = self.cislo |
|
|
|
return context |
|
|
|
|
|
|
|
|
|
|
@ -130,8 +130,8 @@ def vytahniZLesaSeznam(tematko, koren, pouze_zajimave=False): |
|
|
|
stack.append((wn.succ, wd, wr)) |
|
|
|
if isinstance(wn, s.TemaVCisleNode): |
|
|
|
print("TEMA") |
|
|
|
print(wn.tema.id) |
|
|
|
print(tematko.id) |
|
|
|
print(wn.tema.id) |
|
|
|
print(tematko.id) |
|
|
|
if wn.tema.id == tematko.id: |
|
|
|
returnVal.append((posledni_cislo, 0)) |
|
|
|
print("PRIDANO") |
|
|
@ -144,7 +144,7 @@ def vytahniZLesaSeznam(tematko, koren, pouze_zajimave=False): |
|
|
|
tagClose = s.Text(na_web = "Zavírací srolovací tag") |
|
|
|
tagCloseNode = s.TextNode(text = tagClose) |
|
|
|
stack.append((tagCloseNode, wd, True)) |
|
|
|
|
|
|
|
|
|
|
|
if wn.first_child != None: |
|
|
|
stack.append((wn.first_child, wd + 1, wr)) |
|
|
|
|
|
|
@ -152,14 +152,14 @@ def vytahniZLesaSeznam(tematko, koren, pouze_zajimave=False): |
|
|
|
posledni_cislo = wn |
|
|
|
print(wn) |
|
|
|
|
|
|
|
if wr: |
|
|
|
if wr: |
|
|
|
print("ZAJIMAVE") |
|
|
|
if pouze_zajimave: |
|
|
|
if not wn.zajimave: |
|
|
|
continue |
|
|
|
returnVal.append((wn, wd)) |
|
|
|
return returnVal |
|
|
|
|
|
|
|
|
|
|
|
def TematkoView(request, rocnik, tematko): |
|
|
|
nastaveni = s.Nastaveni.objects.first() |
|
|
|
rocnik_object = s.Rocnik.objects.filter(rocnik=rocnik) |
|
|
@ -172,7 +172,7 @@ def TematkoView(request, rocnik, tematko): |
|
|
|
pass |
|
|
|
|
|
|
|
return render(request, 'seminar/tematka/toaletak.html', {}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def TemataRozcestnikView(request): |
|
|
|
print("=============================================") |
|
|
@ -198,17 +198,17 @@ def TemataRozcestnikView(request): |
|
|
|
vcisle.append((odkaz[0].getOdkazStr(), odkaz[0].getOdkaz())) |
|
|
|
if cislo != None: |
|
|
|
cisla.append((cislo, vcisle)) |
|
|
|
|
|
|
|
|
|
|
|
print(cisla) |
|
|
|
tematka.append({ |
|
|
|
"kod" : tematko_object.kod, |
|
|
|
"nazev" : tematko_object.nazev, |
|
|
|
"abstrakt" : tematko_object.abstrakt, |
|
|
|
"abstrakt" : tematko_object.abstrakt, |
|
|
|
"obrazek": tematko_object.obrazek, |
|
|
|
"cisla" : cisla |
|
|
|
}) |
|
|
|
return render(request, 'seminar/tematka/rozcestnik.html', {"tematka": tematka, "rocnik" : nastaveni.aktualni_rocnik().rocnik}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#def ZadaniAktualniVysledkovkaView(request): |
|
|
|
# nastaveni = get_object_or_404(Nastaveni) |
|
|
@ -311,7 +311,6 @@ class CojemamOrganizatoriStariView(generic.ListView): |
|
|
|
|
|
|
|
### Archiv |
|
|
|
|
|
|
|
|
|
|
|
class ArchivView(generic.ListView): |
|
|
|
model = Rocnik |
|
|
|
template_name='seminar/archiv/cisla.html' |
|
|
@ -322,13 +321,16 @@ class ArchivView(generic.ListView): |
|
|
|
vyska = 297 # px |
|
|
|
sirka = 210 # px |
|
|
|
|
|
|
|
# nejnovějších 10 zveřejněných čísel |
|
|
|
cisla = Cislo.objects.filter(verejne_db=True)[:10] |
|
|
|
|
|
|
|
# op = os.path, udělá z argumentů cestu |
|
|
|
png_dir = op.join(settings.MEDIA_ROOT, "cislo", "png") |
|
|
|
|
|
|
|
# seznam [(url obrázku, číslo)] |
|
|
|
urls = [] |
|
|
|
|
|
|
|
# c je číslo, i je pořadí čísla |
|
|
|
for i, c in enumerate(cisla): |
|
|
|
if not c.pdf: |
|
|
|
continue |
|
|
@ -420,7 +422,7 @@ def sloupec_s_poradim(seznam_s_body): |
|
|
|
sloupec_s_poradim.append("{}.".format(aktualni_poradi)) |
|
|
|
# pokud je skupina větší, vypíšu rozsah |
|
|
|
else: |
|
|
|
sloupec_s_poradim.append("{}.–{}.".format(aktualni_poradi, |
|
|
|
sloupec_s_poradim.append("{}.–{}.".format(aktualni_poradi, |
|
|
|
aktualni_poradi+velikost_skupiny-1)) |
|
|
|
# zvětšíme aktuální pořadí o tolik, kolik pozic bylo přeskočeno |
|
|
|
aktualni_poradi = aktualni_poradi + velikost_skupiny |
|
|
@ -428,9 +430,9 @@ def sloupec_s_poradim(seznam_s_body): |
|
|
|
|
|
|
|
# spočítá součet bodů získaných daným řešitelem za zadaný problém a všechny jeho podproblémy |
|
|
|
def __soucet_resitele_problemu(problem, resitel, cislo, soucet): |
|
|
|
# sečteme body za daný problém přes všechna řešení daného problému |
|
|
|
# sečteme body za daný problém přes všechna řešení daného problému |
|
|
|
# od daného řešitele |
|
|
|
reseni_resitele = problem.hodnoceni_set.filter(reseni__resitele=resitel, |
|
|
|
reseni_resitele = problem.hodnoceni_set.filter(reseni__resitele=resitel, |
|
|
|
cislo_body=cislo) |
|
|
|
# XXX chyba na řádku výše - řešení může mít více řešitelů, asi chceme contains |
|
|
|
# nebo in |
|
|
@ -438,7 +440,7 @@ def __soucet_resitele_problemu(problem, resitel, cislo, soucet): |
|
|
|
soucet += r.body |
|
|
|
|
|
|
|
# a přičteme k tomu hodnocení všech podproblémů |
|
|
|
for p in problem.podproblem.all(): |
|
|
|
for p in problem.podproblem.all(): |
|
|
|
# i přes jméno by to měla být množina jeho podproblémů |
|
|
|
soucet += __soucet_resitele_problemu(p, resitel, soucet) |
|
|
|
return soucet |
|
|
@ -451,25 +453,25 @@ def body_resitele_problemu_v_cisle(problem, resitel, cislo): |
|
|
|
# vrátí list všech problémů s body v daném čísle, které již nemají nadproblém |
|
|
|
def hlavni_problemy_cisla(cislo): |
|
|
|
hodnoceni = cislo.hodnoceni.select_related('problem', 'reseni').all() # hodnocení, která se vážou k danému číslu |
|
|
|
|
|
|
|
|
|
|
|
reseni = [h.reseni for h in hodnoceni] |
|
|
|
problemy = [h.problem for h in hodnoceni] |
|
|
|
problemy_set = set(problemy) # chceme každý problém unikátně, |
|
|
|
problemy = (list(problemy_set)) # převedení na množinu a zpět to zaručí |
|
|
|
|
|
|
|
# hlavní problémy čísla |
|
|
|
# hlavní problémy čísla |
|
|
|
# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém) |
|
|
|
hlavni_problemy = [] |
|
|
|
for p in problemy: |
|
|
|
while not(p.nadproblem == None): |
|
|
|
p = p.nadproblem |
|
|
|
hlavni_problemy.append(p) |
|
|
|
|
|
|
|
|
|
|
|
# zunikátnění |
|
|
|
hlavni_problemy_set = set(hlavni_problemy) |
|
|
|
hlavni_problemy = list(hlavni_problemy_set) |
|
|
|
hlavni_problemy.sort(key=lambda k: k.kod_v_rocniku()) # setřídit podle t1, t2, c3, ... |
|
|
|
|
|
|
|
|
|
|
|
return hlavni_problemy |
|
|
|
|
|
|
|
def body_resitele_odjakziva(resitel): |
|
|
@ -495,7 +497,7 @@ def body_resitele_v_cisle(resitel, cislo): |
|
|
|
def body_resitele_v_rocniku(resitel, rocnik, do_cisla=None): |
|
|
|
# pokud do_cisla=None, tak do posledního čísla v ročníku |
|
|
|
# do_cisla je objekt Cislo |
|
|
|
cisla = rocnik.cisla.all() # funkce vrátí pole objektů |
|
|
|
cisla = rocnik.cisla.all() # funkce vrátí pole objektů |
|
|
|
# Cislo už lexikograficky setřízené, viz models |
|
|
|
body = 0 |
|
|
|
for cislo in cisla: |
|
|
@ -671,7 +673,7 @@ class CisloView(generic.DetailView): |
|
|
|
# generujeme sloupec s pořadím pomocí stejně zvané funkce |
|
|
|
pocty_bodu = [rv.body_rocnik for rv in radky_vysledkovky] |
|
|
|
sloupec_poradi = sloupec_s_poradim(pocty_bodu) |
|
|
|
|
|
|
|
|
|
|
|
# každému řádku výsledkovky přidáme jeho pořadí |
|
|
|
i = 0 |
|
|
|
for rv in radky_vysledkovky: |
|
|
@ -680,7 +682,7 @@ class CisloView(generic.DetailView): |
|
|
|
|
|
|
|
# vytahané informace předáváme do kontextu |
|
|
|
context['cislo'] = cislo |
|
|
|
context['radky_vysledkovky'] = radky_vysledkovky |
|
|
|
context['radky_vysledkovky'] = radky_vysledkovky |
|
|
|
context['problemy'] = hlavni_problemy |
|
|
|
# context['v_cisle_zadane'] = TODO |
|
|
|
# context['resene_problemy'] = resene_problemy |
|
|
@ -1164,7 +1166,7 @@ def loginView(request): |
|
|
|
if request.method == 'POST': |
|
|
|
form = LoginForm(request.POST) |
|
|
|
if form.is_valid(): |
|
|
|
user = authenticate(request, |
|
|
|
user = authenticate(request, |
|
|
|
username=form.cleaned_data['username'], |
|
|
|
password=form.cleaned_data['password']) |
|
|
|
print(form.cleaned_data) |
|
|
@ -1172,8 +1174,8 @@ def loginView(request): |
|
|
|
login(request,user) |
|
|
|
return HttpResponseRedirect('/') |
|
|
|
else: |
|
|
|
return render(request, |
|
|
|
'seminar/login.html', |
|
|
|
return render(request, |
|
|
|
'seminar/login.html', |
|
|
|
{'form': form, 'login_error': 'Neplatné jméno nebo heslo'}) |
|
|
|
|
|
|
|
else: |
|
|
@ -1191,7 +1193,7 @@ def logoutView(request): |
|
|
|
def prihlaska_log_gdpr_safe(logger, gdpr_logger, msg, form_data): |
|
|
|
msg = "{}, form_hash:{}".format(msg,hash(form_data)) |
|
|
|
logger.warn(msg) |
|
|
|
gdpr_logger.warn(msg+", form:{}".format(form_data)) |
|
|
|
gdpr_logger.warn(msg+", form:{}".format(form_data)) |
|
|
|
|
|
|
|
from django.forms.models import model_to_dict |
|
|
|
def resitelEditView(request): |
|
|
@ -1201,7 +1203,7 @@ def resitelEditView(request): |
|
|
|
osoba_edit = Osoba.objects.get(user=u) |
|
|
|
resitel_edit = osoba_edit.resitel |
|
|
|
user_edit = osoba_edit.user |
|
|
|
## Vytvoření slovníku, kterým předvyplním formulář |
|
|
|
## Vytvoření slovníku, kterým předvyplním formulář |
|
|
|
prefill_1=model_to_dict(user_edit) |
|
|
|
prefill_2=model_to_dict(resitel_edit) |
|
|
|
prefill_3=model_to_dict(osoba_edit) |
|
|
@ -1259,7 +1261,7 @@ def prihlaskaView(request): |
|
|
|
fcd = form.cleaned_data |
|
|
|
form_hash = hash(fcd) |
|
|
|
form_logger.info(fcd,form_hash=form_hash) |
|
|
|
|
|
|
|
|
|
|
|
with transaction.atomic(): |
|
|
|
u = User.objects.create_user( |
|
|
|
username=fcd['username'], |
|
|
@ -1298,7 +1300,7 @@ def prihlaskaView(request): |
|
|
|
rok_maturity = fcd['rok_maturity'], |
|
|
|
zasilat = fcd['zasilat'] |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
r.save() |
|
|
|
r.osoba = o |
|
|
|
if fcd.get('skola'): |
|
|
@ -1328,7 +1330,7 @@ class SkolaAutocomplete(autocomplete.Select2QuerySetView): |
|
|
|
Q(kratky_nazev__istartswith=self.q)| |
|
|
|
Q(ulice__istartswith=self.q)| |
|
|
|
Q(mesto__istartswith=self.q)) |
|
|
|
|
|
|
|
|
|
|
|
return qs |
|
|
|
|
|
|
|
class LoginRequiredAjaxMixin(object): |
|
|
|