|
@ -387,10 +387,16 @@ class ArchivView(generic.ListView): |
|
|
|
|
|
|
|
|
### Výsledky |
|
|
### Výsledky |
|
|
|
|
|
|
|
|
# ze seznamu obsahujícího sestupně setřízené body řešitelů za daný ročník |
|
|
|
|
|
# vytvoří seznam s pořadími (včetně 3.-5. a pak 2 volná místa atp.), |
|
|
|
|
|
# podle toho, jak jdou za sebou ve výsledkovce |
|
|
|
|
|
def sloupec_s_poradim(setrizene_body): |
|
|
def sloupec_s_poradim(setrizene_body): |
|
|
|
|
|
""" Ze seznamu obsahujícího sestupně setřízené body řešitelů za daný ročník |
|
|
|
|
|
vytvoří seznam s pořadími (včetně 3.-5. a pak 2 volná místa atp.), |
|
|
|
|
|
podle toho, jak jdou za sebou ve výsledkovce. |
|
|
|
|
|
Parametr: |
|
|
|
|
|
setrizene_body (seznam integerů): sestupně setřízená čísla |
|
|
|
|
|
|
|
|
|
|
|
Výstup: |
|
|
|
|
|
sloupec_s_poradim (seznam stringů) |
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
# ze seznamu obsahujícího setřízené body spočítáme sloupec s pořadím |
|
|
# ze seznamu obsahujícího setřízené body spočítáme sloupec s pořadím |
|
|
aktualni_poradi = 1 |
|
|
aktualni_poradi = 1 |
|
@ -421,20 +427,28 @@ def sloupec_s_poradim(setrizene_body): |
|
|
aktualni_poradi = aktualni_poradi + velikost_skupiny |
|
|
aktualni_poradi = aktualni_poradi + velikost_skupiny |
|
|
return sloupec_s_poradim |
|
|
return sloupec_s_poradim |
|
|
|
|
|
|
|
|
# vrátí všechna čísla daného ročníku |
|
|
|
|
|
def cisla_rocniku(rocnik, jen_verejne=True): |
|
|
def cisla_rocniku(rocnik, jen_verejne=True): |
|
|
|
|
|
""" Vrátí všechna čísla daného ročníku. |
|
|
|
|
|
Parametry: |
|
|
|
|
|
rocnik (Rocnik): ročník semináře |
|
|
|
|
|
jen_verejne (bool): zda se mají vrátit jen veřejná, nebo všechna čísla |
|
|
|
|
|
Vrátí: |
|
|
|
|
|
seznam objektů typu Cislo |
|
|
|
|
|
""" |
|
|
if jen_verejne: |
|
|
if jen_verejne: |
|
|
return rocnik.verejna_cisla() |
|
|
return rocnik.verejna_cisla() |
|
|
else: |
|
|
else: |
|
|
return rocnik.cisla.all() |
|
|
return rocnik.cisla.all() |
|
|
|
|
|
|
|
|
# pro daný problém vrátí jeho nejvyšší nadproblém |
|
|
|
|
|
def hlavni_problem(problem): |
|
|
def hlavni_problem(problem): |
|
|
|
|
|
""" Pro daný problém vrátí jeho nejvyšší nadproblém.""" |
|
|
while not(problem.nadproblem == None): |
|
|
while not(problem.nadproblem == None): |
|
|
problem = problem.nadproblem |
|
|
problem = problem.nadproblem |
|
|
return problem |
|
|
return problem |
|
|
|
|
|
|
|
|
def hlavni_problemy_rocniku(rocnik, jen_verejne=True): |
|
|
def hlavni_problemy_rocniku(rocnik, jen_verejne=True): |
|
|
|
|
|
""" Pro zadaný ročník vrátí hlavní problémy ročníku, |
|
|
|
|
|
tj. ty, které už nemají nadproblém.""" |
|
|
hlavni_problemy = [] |
|
|
hlavni_problemy = [] |
|
|
for cislo in cisla_rocniku(rocnik, jen_verejne): |
|
|
for cislo in cisla_rocniku(rocnik, jen_verejne): |
|
|
for problem in hlavni_problemy_cisla(cislo): |
|
|
for problem in hlavni_problemy_cisla(cislo): |
|
@ -445,8 +459,8 @@ def hlavni_problemy_rocniku(rocnik, jen_verejne=True): |
|
|
|
|
|
|
|
|
return hlavni_problemy |
|
|
return hlavni_problemy |
|
|
|
|
|
|
|
|
# vrátí list všech problémů s body v daném čísle, které již nemají nadproblém |
|
|
|
|
|
def hlavni_problemy_cisla(cislo): |
|
|
def hlavni_problemy_cisla(cislo): |
|
|
|
|
|
""" Vrátí seznam všech problémů s body v daném čísle, které již nemají nadproblém. """ |
|
|
hodnoceni = cislo.hodnoceni.select_related('problem', 'reseni').all() |
|
|
hodnoceni = cislo.hodnoceni.select_related('problem', 'reseni').all() |
|
|
# hodnocení, která se vážou k danému číslu |
|
|
# hodnocení, která se vážou k danému číslu |
|
|
|
|
|
|
|
@ -468,33 +482,68 @@ def hlavni_problemy_cisla(cislo): |
|
|
|
|
|
|
|
|
return hlavni_problemy |
|
|
return hlavni_problemy |
|
|
|
|
|
|
|
|
# vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník |
|
|
def body_resitelu(resitele, za, odjakziva=True): |
|
|
def body_resitelu_odjakziva(rocnik, resitele): |
|
|
""" Funkce počítající počty bodů pro zadané řešitele, |
|
|
|
|
|
buď odjakživa do daného ročníku/čísla anebo za daný ročník/číslo. |
|
|
|
|
|
Parametry: |
|
|
|
|
|
resitele (seznam obsahující položky typu Resitel): aktivní řešitelé |
|
|
|
|
|
za (Rocnik/Cislo): za co se mají počítat body |
|
|
|
|
|
(generování starších výsledkovek) |
|
|
|
|
|
odjakziva (bool): zda se mají počítat body odjakživa, nebo jen za číslo/ročník |
|
|
|
|
|
zadané v "za" |
|
|
|
|
|
Výstup: |
|
|
|
|
|
slovník (Resitel.id):body |
|
|
|
|
|
""" |
|
|
|
|
|
resitele_id = [r.id for r in resitele] |
|
|
|
|
|
# Zjistíme, typ objektu v parametru "za" |
|
|
|
|
|
if isinstance(za, Rocnik): |
|
|
|
|
|
cislo = None |
|
|
|
|
|
rocnik = za |
|
|
|
|
|
rok = rocnik.prvni_rok |
|
|
|
|
|
elif isinstance(za, Cislo): |
|
|
|
|
|
cislo = za |
|
|
|
|
|
rocnik = None |
|
|
|
|
|
rok = cislo.rocnik.prvni_rok |
|
|
|
|
|
else: |
|
|
|
|
|
assert True, "body_resitelu: za není ani číslo ani ročník." |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Kvůli rychlosti používáme sčítáme body už v databázi, viz |
|
|
|
|
|
# https://docs.djangoproject.com/en/3.0/topics/db/aggregation/, |
|
|
|
|
|
# sekce Filtering on annotations (protože potřebujeme filtrovat výsledky |
|
|
|
|
|
# jen do nějakého data, abychom uměli správně nagenerovat výsledkovky i |
|
|
|
|
|
# za historická čísla. |
|
|
|
|
|
|
|
|
|
|
|
# Níže se vytváří dotaz na součet bodů za správně vyfiltrovaná hodnocení, |
|
|
|
|
|
# který se použije ve výsledném dotazu. |
|
|
|
|
|
if cislo and odjakziva: # Body se sčítají odjakživa do zadaného čísla. |
|
|
|
|
|
# Vyfiltrujeme všechna hodnocení, která jsou buď ze starších ročníků, |
|
|
|
|
|
# anebo ze stejného ročníku, jak je zadané číslo, tam ale sčítáme jen |
|
|
|
|
|
# pro čísla s pořadím nejvýše stejným, jako má zadané číslo. |
|
|
|
|
|
body_k_zapocteni = Sum('reseni__hodnoceni__body', |
|
|
|
|
|
filter=( Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok__lt=rok) | |
|
|
|
|
|
Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok=rok, |
|
|
|
|
|
reseni__hodnoceni__cislo_body__poradi__lte=cislo.poradi) )) |
|
|
|
|
|
elif cislo and not odjakziva: # Body se sčítají za dané číslo. |
|
|
|
|
|
body_k_zapocteni = Sum('reseni__hodnoceni__body', |
|
|
|
|
|
filter=( Q(reseni__hodnoceni__cislo_body=cislo) )) |
|
|
|
|
|
elif rocnik and odjakziva: # Spočítáme body za starší ročníky až do zadaného včetně. |
|
|
|
|
|
body_k_zapocteni = Sum('reseni__hodnoceni__body', |
|
|
|
|
|
filter= Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok__lte=rok)) |
|
|
|
|
|
elif rocnik and not odjakziva: # Spočítáme body za daný ročník. |
|
|
|
|
|
body_k_zapocteni = Sum('reseni__hodnoceni__body', |
|
|
|
|
|
filter= Q(reseni__hodnoceni__cislo_body__rocnik=rocnik)) |
|
|
|
|
|
else: |
|
|
|
|
|
assert True, "body_resitelu: Neplatná kombinace za a odjakživa." |
|
|
|
|
|
|
|
|
# Následující řádek přidá ke každému řešiteli údaj ".body" se součtem jejich bodů |
|
|
# Následující řádek přidá ke každému řešiteli údaj ".body" se součtem jejich bodů |
|
|
resitele_s_body = Resitel.objects.annotate(body=Sum('reseni__hodnoceni__body')) |
|
|
resitele_s_body = Resitel.objects.filter(id__in=resitele_id).annotate( |
|
|
# Teď jen z QuerySetu řešitelů anotovaných body vygenerujeme slovník indexovaný řešitelským id obsahující body |
|
|
body=body_k_zapocteni) |
|
|
# ... ale jen ro řešitele, které dostaneme jako parametr. |
|
|
# Teď jen z QuerySetu řešitelů anotovaných body vygenerujeme slovník |
|
|
# TODO: Zjistit, co ten parametr říká a proč je potřeba |
|
|
# indexovaný řešitelským id obsahující body. |
|
|
body_odjakziva = {int(res.id) : res.body for res in resitele_s_body if res in resitele} |
|
|
# Pokud jsou body None, nahradíme za 0. |
|
|
return body_odjakziva |
|
|
slovnik = {int(res.id) : (res.body if res.body else 0) for res in resitele_s_body} |
|
|
|
|
|
return slovnik |
|
|
# vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník |
|
|
|
|
|
def body_resitelu_za_rocnik(rocnik, aktivni_resitele): |
|
|
|
|
|
body_za_rocnik = {} |
|
|
|
|
|
# inicializujeme na 0 pro všechny aktivní řešitele |
|
|
|
|
|
for ar in aktivni_resitele: |
|
|
|
|
|
body_za_rocnik[ar.id] = 0 |
|
|
|
|
|
|
|
|
|
|
|
# spočítáme body řešitelům přes všechna řešení s hodnocením v daném ročníku |
|
|
|
|
|
print("Před dotazem:{}".format(time.time())) |
|
|
|
|
|
reseni = Reseni.objects.prefetch_related('resitele', 'hodnoceni_set').filter(hodnoceni__cislo_body__rocnik=rocnik) |
|
|
|
|
|
print("Po dotazu:{}".format(time.time())) |
|
|
|
|
|
for res in reseni: |
|
|
|
|
|
for resitel in res.resitele.all(): |
|
|
|
|
|
for hodn in res.hodnoceni_set.all(): |
|
|
|
|
|
pricti_body(body_za_rocnik, resitel, hodn.body) |
|
|
|
|
|
print("Po for-cyklu:{}".format(time.time())) |
|
|
|
|
|
return body_za_rocnik |
|
|
|
|
|
|
|
|
|
|
|
class RadekVysledkovkyRocniku(object): |
|
|
class RadekVysledkovkyRocniku(object): |
|
|
""" Obsahuje věci, které se hodí vědět při konstruování výsledkovky. |
|
|
""" Obsahuje věci, které se hodí vědět při konstruování výsledkovky. |
|
@ -523,7 +572,6 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True): |
|
|
#.filter(hodnoceni_set__rocnik__eq=cislo_rocnik) |
|
|
#.filter(hodnoceni_set__rocnik__eq=cislo_rocnik) |
|
|
cisla = cisla_rocniku(rocnik, jen_verejne) |
|
|
cisla = cisla_rocniku(rocnik, jen_verejne) |
|
|
body_cisla_slov = {} |
|
|
body_cisla_slov = {} |
|
|
print("Jen veřejná: {}, čísla: {}".format(jen_verejne, cisla)) |
|
|
|
|
|
for cislo in cisla: |
|
|
for cislo in cisla: |
|
|
# získáme body za číslo |
|
|
# získáme body za číslo |
|
|
_, cislobody = secti_body_za_cislo(cislo, aktivni_resitele) |
|
|
_, cislobody = secti_body_za_cislo(cislo, aktivni_resitele) |
|
@ -539,7 +587,7 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True): |
|
|
poradi = sloupec_s_poradim(setrizene_body) |
|
|
poradi = sloupec_s_poradim(setrizene_body) |
|
|
|
|
|
|
|
|
# získáme body odjakživa |
|
|
# získáme body odjakživa |
|
|
resitel_odjakzivabody_slov = body_resitelu_odjakziva(rocnik, aktivni_resitele) |
|
|
resitel_odjakzivabody_slov = body_resitelu(aktivni_resitele, rocnik) |
|
|
|
|
|
|
|
|
# vytvoříme jednotlivé sloupce výsledkovky |
|
|
# vytvoříme jednotlivé sloupce výsledkovky |
|
|
radky_vysledkovky = [] |
|
|
radky_vysledkovky = [] |
|
@ -558,11 +606,7 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True): |
|
|
setrizene_body[i], # body za ročník (spočítané výše s pořadím) |
|
|
setrizene_body[i], # body za ročník (spočítané výše s pořadím) |
|
|
resitel_odjakzivabody_slov[ar_id], # body odjakživa |
|
|
resitel_odjakzivabody_slov[ar_id], # body odjakživa |
|
|
rocnik) # ročník semináře pro získání ročníku řešitele |
|
|
rocnik) # ročník semináře pro získání ročníku řešitele |
|
|
print("{}: číslobody - {}, ročníkbody - {}," |
|
|
|
|
|
"odjakživabody - {}".format(radek.resitel, radek.body_cisla_sezn, |
|
|
|
|
|
radek.body_rocnik, radek.body_celkem_odjakziva)) |
|
|
|
|
|
radky_vysledkovky.append(radek) |
|
|
radky_vysledkovky.append(radek) |
|
|
print("Přikládám {}-tý řádek.".format(i)) |
|
|
|
|
|
i += 1 |
|
|
i += 1 |
|
|
|
|
|
|
|
|
return radky_vysledkovky |
|
|
return radky_vysledkovky |
|
@ -618,8 +662,8 @@ class RadekVysledkovkyCisla(object): |
|
|
self.titul = resitel.get_titul(body_odjakziva) |
|
|
self.titul = resitel.get_titul(body_odjakziva) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# přiřazuje danému řešiteli body do slovníku |
|
|
|
|
|
def pricti_body(slovnik, resitel, body): |
|
|
def pricti_body(slovnik, resitel, body): |
|
|
|
|
|
""" Přiřazuje danému řešiteli body do slovníku. """ |
|
|
# testujeme na None (""), pokud je to první řešení |
|
|
# testujeme na None (""), pokud je to první řešení |
|
|
# daného řešitele, předěláme na 0 |
|
|
# daného řešitele, předěláme na 0 |
|
|
# (v dalším kroku přičteme reálný počet bodů), |
|
|
# (v dalším kroku přičteme reálný počet bodů), |
|
@ -630,15 +674,16 @@ def pricti_body(slovnik, resitel, body): |
|
|
slovnik[resitel.id] += body |
|
|
slovnik[resitel.id] += body |
|
|
|
|
|
|
|
|
def secti_body_za_rocnik(rocnik, aktivni_resitele): |
|
|
def secti_body_za_rocnik(rocnik, aktivni_resitele): |
|
|
# spočítáme všem řešitelům jejich body za ročník |
|
|
""" Spočítá body za ročník, setřídí je sestupně a vrátí jako seznam.""" |
|
|
resitel_rocnikbody_slov = body_resitelu_za_rocnik(rocnik, aktivni_resitele) |
|
|
# spočítáme všem řešitelům jejich body za ročník (False => ne odjakživa) |
|
|
|
|
|
resitel_rocnikbody_slov = body_resitelu(aktivni_resitele, rocnik, False) |
|
|
# zeptáme se na dvojice (řešitel, body) za ročník a setřídíme sestupně |
|
|
# zeptáme se na dvojice (řešitel, body) za ročník a setřídíme sestupně |
|
|
resitel_rocnikbody_sezn = sorted(resitel_rocnikbody_slov.items(), |
|
|
resitel_rocnikbody_sezn = sorted(resitel_rocnikbody_slov.items(), |
|
|
key = lambda x: x[1], reverse = True) |
|
|
key = lambda x: x[1], reverse = True) |
|
|
return resitel_rocnikbody_sezn |
|
|
return resitel_rocnikbody_sezn |
|
|
|
|
|
|
|
|
# spočítá u řešitelů body za číslo a za jednotlivé hlavní problémy (témata) |
|
|
|
|
|
def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None): |
|
|
def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None): |
|
|
|
|
|
""" Spočítá u řešitelů body za číslo a za jednotlivé hlavní problémy (témata).""" |
|
|
# TODO setřídit hlavní problémy čísla podle id, ať jsou ve stejném pořadí pokaždé |
|
|
# TODO setřídit hlavní problémy čísla podle id, ať jsou ve stejném pořadí pokaždé |
|
|
# pro každý hlavní problém zavedeme slovník s body za daný hlavní problém |
|
|
# pro každý hlavní problém zavedeme slovník s body za daný hlavní problém |
|
|
# pro jednotlivé řešitele (slovník slovníků hlavních problémů) |
|
|
# pro jednotlivé řešitele (slovník slovníků hlavních problémů) |
|
@ -701,8 +746,7 @@ def vysledkovka_cisla(cislo, context=None): |
|
|
resitel_rocnikbody_sezn = secti_body_za_rocnik(cislo.rocnik, aktivni_resitele) |
|
|
resitel_rocnikbody_sezn = secti_body_za_rocnik(cislo.rocnik, aktivni_resitele) |
|
|
|
|
|
|
|
|
# získáme body odjakživa |
|
|
# získáme body odjakživa |
|
|
resitel_odjakzivabody_slov = body_resitelu_odjakziva(cislo.rocnik, |
|
|
resitel_odjakzivabody_slov = body_resitelu(aktivni_resitele, cislo) |
|
|
aktivni_resitele) |
|
|
|
|
|
|
|
|
|
|
|
# řešitelé setřídění podle bodů za číslo sestupně |
|
|
# řešitelé setřídění podle bodů za číslo sestupně |
|
|
setrizeni_resitele_id = [dvojice[0] for dvojice in resitel_rocnikbody_sezn] |
|
|
setrizeni_resitele_id = [dvojice[0] for dvojice in resitel_rocnikbody_sezn] |
|
@ -729,10 +773,7 @@ def vysledkovka_cisla(cislo, context=None): |
|
|
setrizeni_resitele_body[i], # body za ročník (spočítané výše s pořadím) |
|
|
setrizeni_resitele_body[i], # body za ročník (spočítané výše s pořadím) |
|
|
resitel_odjakzivabody_slov[ar_id], # body odjakživa |
|
|
resitel_odjakzivabody_slov[ar_id], # body odjakživa |
|
|
cislo.rocnik) # ročník semináře pro zjištění ročníku řešitele |
|
|
cislo.rocnik) # ročník semináře pro zjištění ročníku řešitele |
|
|
print("{}: body za problémy - {}, číslobody - {}, ročníkbody - {}, odjakživabody - {}".format(radek.resitel, |
|
|
|
|
|
radek.body_problemy_sezn, radek.body_cislo, radek.body_rocnik, radek.body_celkem_odjakziva)) |
|
|
|
|
|
radky_vysledkovky.append(radek) |
|
|
radky_vysledkovky.append(radek) |
|
|
print("Přikládám {}-tý řádek.".format(i)) |
|
|
|
|
|
i += 1 |
|
|
i += 1 |
|
|
|
|
|
|
|
|
# vytahané informace předáváme do kontextu |
|
|
# vytahané informace předáváme do kontextu |
|
@ -741,7 +782,6 @@ def vysledkovka_cisla(cislo, context=None): |
|
|
context['problemy'] = hlavni_problemy |
|
|
context['problemy'] = hlavni_problemy |
|
|
#context['v_cisle_zadane'] = TODO |
|
|
#context['v_cisle_zadane'] = TODO |
|
|
#context['resene_problemy'] = resene_problemy |
|
|
#context['resene_problemy'] = resene_problemy |
|
|
print("Předávám kontext.") |
|
|
|
|
|
return context |
|
|
return context |
|
|
|
|
|
|
|
|
class CisloView(generic.DetailView): |
|
|
class CisloView(generic.DetailView): |
|
@ -779,7 +819,7 @@ class ArchivTemataView(generic.ListView): |
|
|
### Generovani vysledkovky |
|
|
### Generovani vysledkovky |
|
|
|
|
|
|
|
|
class CisloVysledkovkaView(CisloView): |
|
|
class CisloVysledkovkaView(CisloView): |
|
|
"View vytvořené pro stránku zobrazující výsledkovku čísla v TeXu." |
|
|
"""View vytvořené pro stránku zobrazující výsledkovku čísla v TeXu.""" |
|
|
|
|
|
|
|
|
model = Cislo |
|
|
model = Cislo |
|
|
template_name = 'seminar/archiv/cislo_vysledkovka.tex' |
|
|
template_name = 'seminar/archiv/cislo_vysledkovka.tex' |
|
@ -789,7 +829,7 @@ class CisloVysledkovkaView(CisloView): |
|
|
#vypise na stranku textovy obsah vyTeXane vysledkovky k okopirovani |
|
|
#vypise na stranku textovy obsah vyTeXane vysledkovky k okopirovani |
|
|
|
|
|
|
|
|
class RocnikVysledkovkaView(RocnikView): |
|
|
class RocnikVysledkovkaView(RocnikView): |
|
|
"View vytvořené pro stránku zobrazující výsledkovku ročníku v TeXu." |
|
|
""" View vytvořené pro stránku zobrazující výsledkovku ročníku v TeXu.""" |
|
|
model = Rocnik |
|
|
model = Rocnik |
|
|
template_name = 'seminar/archiv/rocnik_vysledkovka.tex' |
|
|
template_name = 'seminar/archiv/rocnik_vysledkovka.tex' |
|
|
#content_type = 'application/x-tex; charset=UTF8' |
|
|
#content_type = 'application/x-tex; charset=UTF8' |
|
@ -798,6 +838,7 @@ class RocnikVysledkovkaView(RocnikView): |
|
|
#vypise na stranku textovy obsah vyTeXane vysledkovky k okopirovani |
|
|
#vypise na stranku textovy obsah vyTeXane vysledkovky k okopirovani |
|
|
|
|
|
|
|
|
### Generovani obalek |
|
|
### Generovani obalek |
|
|
|
|
|
|
|
|
class CisloObalkyStruct: |
|
|
class CisloObalkyStruct: |
|
|
rocnik = None |
|
|
rocnik = None |
|
|
cisla = None |
|
|
cisla = None |
|
@ -827,8 +868,10 @@ def aktivniResitele(rocnik,cislo): |
|
|
if int(cislo) > 3: |
|
|
if int(cislo) > 3: |
|
|
problemy = Problem.objects.filter(cislo_zadani__in = letos.cisla) |
|
|
problemy = Problem.objects.filter(cislo_zadani__in = letos.cisla) |
|
|
else: |
|
|
else: |
|
|
problemy = Problem.objects.filter(Q(cislo_zadani__in = letos.cisla)|Q(cislo_zadani__in = loni.cisla)) |
|
|
problemy = Problem.objects.filter( |
|
|
resitele = aktualni_resitele.filter(reseni__in = Reseni.objects.filter(problem__in=problemy)).distinct() |
|
|
Q(cislo_zadani__in = letos.cisla) | Q(cislo_zadani__in = loni.cisla) ) |
|
|
|
|
|
resitele = aktualni_resitele.filter(reseni__in = Reseni.objects.filter( |
|
|
|
|
|
problem__in=problemy)).distinct() |
|
|
return resitele |
|
|
return resitele |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -875,13 +918,15 @@ def oldObalkovaniView(request, rocnik, cislo): |
|
|
### Tituly |
|
|
### Tituly |
|
|
|
|
|
|
|
|
def TitulyView(request, rocnik, cislo): |
|
|
def TitulyView(request, rocnik, cislo): |
|
|
|
|
|
""" View pro stažení makra titulů v TeXu.""" |
|
|
rocnik_obj = Rocnik.objects.get(rocnik = rocnik) |
|
|
rocnik_obj = Rocnik.objects.get(rocnik = rocnik) |
|
|
resitele = Resitel.objects.filter(rok_maturity__gte = rocnik_obj.prvni_rok) |
|
|
resitele = Resitel.objects.filter(rok_maturity__gte = rocnik_obj.prvni_rok) |
|
|
cislo_obj = Cislo.objects.get(rocnik = rocnik_obj, poradi = cislo) |
|
|
cislo_obj = Cislo.objects.get(rocnik = rocnik_obj, poradi = cislo) |
|
|
|
|
|
|
|
|
asciijmena = [] |
|
|
asciijmena = [] |
|
|
jmenovci = False # detekuje, zda jsou dva řešitelé jmenovci (modulo nabodeníčka), pokud ano, vrátí se jako true |
|
|
jmenovci = False # detekuje, zda jsou dva řešitelé jmenovci (modulo nabodeníčka), |
|
|
slovnik_s_body = body_resitelu_odjakziva(rocnik_obj, resitele) |
|
|
# pokud ano, vrátí se jako true |
|
|
|
|
|
slovnik_s_body = body_resitelu(resitele, rocnik_obj) |
|
|
|
|
|
|
|
|
for resitel in resitele: |
|
|
for resitel in resitele: |
|
|
resitel.titul = resitel.get_titul(slovnik_s_body[resitel.id]) |
|
|
resitel.titul = resitel.get_titul(slovnik_s_body[resitel.id]) |
|
@ -899,8 +944,6 @@ def TitulyView(request, rocnik, cislo): |
|
|
return render(request, 'seminar/archiv/tituly.tex', |
|
|
return render(request, 'seminar/archiv/tituly.tex', |
|
|
{'resitele': resitele,'jmenovci':jmenovci},content_type="text/plain") |
|
|
{'resitele': resitele,'jmenovci':jmenovci},content_type="text/plain") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Soustredeni |
|
|
### Soustredeni |
|
|
|
|
|
|
|
|
class SoustredeniListView(generic.ListView): |
|
|
class SoustredeniListView(generic.ListView): |
|
@ -929,13 +972,13 @@ class SoustredeniUcastniciBaseView(generic.ListView): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SoustredeniMailyUcastnikuView(SoustredeniUcastniciBaseView): |
|
|
class SoustredeniMailyUcastnikuView(SoustredeniUcastniciBaseView): |
|
|
"""Seznam e-mailů řešitelů oddělených čárkami""" |
|
|
""" Seznam e-mailů řešitelů oddělených čárkami. """ |
|
|
model = Soustredeni_Ucastnici |
|
|
model = Soustredeni_Ucastnici |
|
|
template_name = 'seminar/soustredeni/maily_ucastniku.txt' |
|
|
template_name = 'seminar/soustredeni/maily_ucastniku.txt' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SoustredeniUcastniciView(SoustredeniUcastniciBaseView): |
|
|
class SoustredeniUcastniciView(SoustredeniUcastniciBaseView): |
|
|
"""HTML tabulka účastníků pro tisk""" |
|
|
""" HTML tabulka účastníků pro tisk. """ |
|
|
model = Soustredeni_Ucastnici |
|
|
model = Soustredeni_Ucastnici |
|
|
template_name = 'seminar/soustredeni/seznam_ucastniku.html' |
|
|
template_name = 'seminar/soustredeni/seznam_ucastniku.html' |
|
|
|
|
|
|
|
@ -1057,11 +1100,11 @@ def texUploadView(request): |
|
|
} |
|
|
} |
|
|
problem_typ = typy[meta["typ"]] |
|
|
problem_typ = typy[meta["typ"]] |
|
|
|
|
|
|
|
|
# Pokud už problém existuje, vytáhneme jej z db a upravíme |
|
|
# Pokud už problém existuje, vytáhneme jej z db a upravíme. |
|
|
# Pokud neexistuje, vytvoříme jej jedině pokud je to vynucené |
|
|
# Pokud neexistuje, vytvoříme jej jedině pokud je to vynucené. |
|
|
|
|
|
|
|
|
# Pokud ročník/číslo ještě neexistuje, vyhodí to výjimku -> |
|
|
# Pokud ročník/číslo ještě neexistuje, vyhodí to výjimku -> |
|
|
# číslo/ročník se musí založit ručně v adminu |
|
|
# číslo/ročník se musí založit ručně v adminu. |
|
|
rocnik = Rocnik.objects.get(rocnik=meta["rocnik"]) |
|
|
rocnik = Rocnik.objects.get(rocnik=meta["rocnik"]) |
|
|
cislo = Cislo.objects.get(rocnik=rocnik, cislo=meta["cislo"]) |
|
|
cislo = Cislo.objects.get(rocnik=rocnik, cislo=meta["cislo"]) |
|
|
|
|
|
|
|
@ -1195,7 +1238,8 @@ class ResitelView(LoginRequiredMixin,generic.DetailView): |
|
|
print(self.request.user) |
|
|
print(self.request.user) |
|
|
return Resitel.objects.get(osoba__user=self.request.user) |
|
|
return Resitel.objects.get(osoba__user=self.request.user) |
|
|
|
|
|
|
|
|
## Formulare |
|
|
### Formulare |
|
|
|
|
|
|
|
|
class AddSolutionView(LoginRequiredMixin, FormView): |
|
|
class AddSolutionView(LoginRequiredMixin, FormView): |
|
|
template_name = 'seminar/org/vloz_reseni.html' |
|
|
template_name = 'seminar/org/vloz_reseni.html' |
|
|
form_class = f.VlozReseniForm |
|
|
form_class = f.VlozReseniForm |
|
@ -1234,9 +1278,6 @@ class SubmitSolutionView(LoginRequiredMixin, CreateView): |
|
|
|
|
|
|
|
|
return HttpResponseRedirect(self.get_success_url()) |
|
|
return HttpResponseRedirect(self.get_success_url()) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def resetPasswordView(request): |
|
|
def resetPasswordView(request): |
|
|
pass |
|
|
pass |
|
|
|
|
|
|
|
@ -1398,10 +1439,6 @@ def prihlaskaView(request): |
|
|
|
|
|
|
|
|
return render(request, 'seminar/prihlaska.html', {'form': form}) |
|
|
return render(request, 'seminar/prihlaska.html', {'form': form}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# FIXME: Tohle asi vlastně vůbec nepatří do aplikace 'seminar' |
|
|
# FIXME: Tohle asi vlastně vůbec nepatří do aplikace 'seminar' |
|
|
class LoginView(auth_views.LoginView): |
|
|
class LoginView(auth_views.LoginView): |
|
|
# Jen vezmeme vestavěný a dáme mu vhodný template a přesměrovací URL |
|
|
# Jen vezmeme vestavěný a dáme mu vhodný template a přesměrovací URL |
|
@ -1419,25 +1456,25 @@ class LogoutView(auth_views.LogoutView): |
|
|
# Pavel: Vůbec nevím, proč to s _lazy funguje, ale bez toho to bylo rozbité. |
|
|
# Pavel: Vůbec nevím, proč to s _lazy funguje, ale bez toho to bylo rozbité. |
|
|
next_page = reverse_lazy('titulni_strana') |
|
|
next_page = reverse_lazy('titulni_strana') |
|
|
|
|
|
|
|
|
# "Chci resetovat heslo" |
|
|
|
|
|
class PasswordResetView(auth_views.PasswordResetView): |
|
|
class PasswordResetView(auth_views.PasswordResetView): |
|
|
|
|
|
""" Chci resetovat heslo. """ |
|
|
#template_name = 'seminar/password_reset.html' |
|
|
#template_name = 'seminar/password_reset.html' |
|
|
# TODO: vlastní email_template_name a subject_template_name a html_email_template_name |
|
|
# TODO: vlastní email_template_name a subject_template_name a html_email_template_name |
|
|
success_url = reverse_lazy('reset_password_done') |
|
|
success_url = reverse_lazy('reset_password_done') |
|
|
from_email = 'login@mam.mff.cuni.cz' |
|
|
from_email = 'login@mam.mff.cuni.cz' |
|
|
|
|
|
|
|
|
# "Poslali jsme e-mail (pokud bylo kam))" |
|
|
|
|
|
class PasswordResetDoneView(auth_views.PasswordResetDoneView): |
|
|
class PasswordResetDoneView(auth_views.PasswordResetDoneView): |
|
|
|
|
|
""" Poslali jsme e-mail (pokud bylo kam)). """ |
|
|
#template_name = 'seminar/password_reset_done.html' |
|
|
#template_name = 'seminar/password_reset_done.html' |
|
|
pass |
|
|
pass |
|
|
|
|
|
|
|
|
# "Vymysli si heslo" |
|
|
|
|
|
class PasswordResetConfirmView(auth_views.PasswordResetConfirmView): |
|
|
class PasswordResetConfirmView(auth_views.PasswordResetConfirmView): |
|
|
|
|
|
""" Vymysli si heslo. """ |
|
|
#template_name = 'seminar/password_confirm_done.html' |
|
|
#template_name = 'seminar/password_confirm_done.html' |
|
|
success_url = reverse_lazy('reset_password_complete') |
|
|
success_url = reverse_lazy('reset_password_complete') |
|
|
|
|
|
|
|
|
# "Heslo se asi změnilo." |
|
|
|
|
|
class PasswordResetCompleteView(auth_views.PasswordResetCompleteView): |
|
|
class PasswordResetCompleteView(auth_views.PasswordResetCompleteView): |
|
|
|
|
|
""" Heslo se asi změnilo.""" |
|
|
#template_name = 'seminar/password_complete_done.html' |
|
|
#template_name = 'seminar/password_complete_done.html' |
|
|
pass |
|
|
pass |
|
|
|
|
|
|
|
|