|
|
@ -281,16 +281,18 @@ def sloupec_s_poradim(vysledky): |
|
|
|
return poradi_l |
|
|
|
|
|
|
|
# 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, soucet): |
|
|
|
def __soucet_resitele_problemu(problem, resitel, cislo, soucet): |
|
|
|
# FIXME: správně je nadproblem_(typ problemu), ale to by bylo potřeba nějak |
|
|
|
# zjistit, jaký typ nodu to vlastně je a aplikovat to ve volání funkce |
|
|
|
|
|
|
|
# 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__contains=resitel) |
|
|
|
reseni_resitele = problem.hodnoceni_set.filter(reseni_resitele__contains=resitel, |
|
|
|
cislo_body=cislo) |
|
|
|
for r in reseni_resitele: |
|
|
|
soucet += r.body |
|
|
|
|
|
|
|
# a přičteme k tomu hodnocení všech podproblémů |
|
|
|
for p in problem.nadproblem_set: |
|
|
|
# i přes jméno by to měla být množina jeho podproblémů |
|
|
|
soucet += __soucet_resitele_problemu(p, resitel, soucet) |
|
|
@ -298,7 +300,8 @@ def __soucet_resitele_problemu(problem, resitel, soucet): |
|
|
|
|
|
|
|
# spočítá součet všech bodů ze všech podproblémů daného problému daného řešitele |
|
|
|
def body_resitele_problemu_v_cisle(problem, resitel, cislo): |
|
|
|
return __soucet_resitele_problemu(problem, resitel, 0) |
|
|
|
# probably FIXED: nezohledňuje číslo, do kterého se body počítají |
|
|
|
return __soucet_resitele_problemu(problem, resitel, cislo, 0) |
|
|
|
|
|
|
|
# vrátí list všech problémů s body v daném čísle, které již nemají nadproblém |
|
|
|
def hlavni_problemy_cisla(cislo): |
|
|
@ -335,15 +338,15 @@ def body_resitele_v_cisle(resitel, cislo): |
|
|
|
return body_resitele |
|
|
|
|
|
|
|
# spočítá součet všech bodů řešitele za daný rok (nebo jen do daného čísla včetně) |
|
|
|
def body_resitele_v_rocniku(resitel, rocnik_node, do_cisla=None): |
|
|
|
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 |
|
|
|
cislo_node = rocnik_node.firstChild |
|
|
|
cisla = rocnik.cisla # funkce vrátí pole objektů Cislo už lexikograficky setřízené, viz models |
|
|
|
body = 0 |
|
|
|
while not (cislo_node == None or cislo_node.cislo == do_cisla.CisloNode.next): |
|
|
|
for cislo in cisla: |
|
|
|
if cislo.poradi == do_cisla.poradi: break |
|
|
|
# druhá část zaručuje, že máme výsledky do daného čísla včetně |
|
|
|
body = body + body_resitele_v_cisle(resitel, cislo_node.cislo) |
|
|
|
cislo_node = cislo_node.next |
|
|
|
body = body + body_resitele_v_cisle(resitel, cislo) |
|
|
|
return body |
|
|
|
|
|
|
|
#def vysledkovka_rocniku(rocnik, jen_verejne=True): |
|
|
@ -361,7 +364,7 @@ def body_resitele_v_rocniku(resitel, rocnik_node, do_cisla=None): |
|
|
|
# return None |
|
|
|
# |
|
|
|
# #vybere vsechny vysledky z posledniho (verejneho) cisla a setridi sestupne dle bodu |
|
|
|
# vysledky = list(cisla_v_rocniku.filter(cislo = cisla_v_rocniku[0].cislo).order_by('-body', 'resitel__prijmeni', 'resitel__jmeno').select_related('resitel')) |
|
|
|
# vysledky = list(cisla_v_rocniku.filter(cislo = cisla_v_rocniku[0].poradi).order_by('-body', 'resitel__prijmeni', 'resitel__jmeno').select_related('resitel')) |
|
|
|
# |
|
|
|
# class Vysledkovka: |
|
|
|
# def __init__(self): |
|
|
@ -377,7 +380,7 @@ def body_resitele_v_rocniku(resitel, rocnik_node, do_cisla=None): |
|
|
|
# v.poradi = poradi |
|
|
|
# v.resitel.rocnik = v.resitel.rocnik(rocnik) |
|
|
|
# |
|
|
|
# verejne_vysl_odjakziva = VysledkyKCisluOdjakziva.objects.filter(cislo__rocnik=rocnik, cislo=cisla_v_rocniku[0].cislo) |
|
|
|
# verejne_vysl_odjakziva = VysledkyKCisluOdjakziva.objects.filter(cislo__rocnik=rocnik, cislo=cisla_v_rocniku[0].poradi) |
|
|
|
# if jen_verejne: |
|
|
|
# verejne_vysl_odjakziva = verejne_vysl_odjakziva.filter(cislo__verejna_vysledkovka=True) |
|
|
|
# |
|
|
@ -459,11 +462,14 @@ class VysledkyResitele(object): |
|
|
|
resitel_jmeno = resitel.osoba.jmeno |
|
|
|
resitel_prijmeni = resitel.osoba.prijmeni |
|
|
|
body = {} |
|
|
|
body_cislo = 0 |
|
|
|
body_rocnik = 0 |
|
|
|
|
|
|
|
def body_za_cislo(self): |
|
|
|
return sum(body.values()) |
|
|
|
|
|
|
|
def body_za_rocnik(self): |
|
|
|
return body_rocnik |
|
|
|
|
|
|
|
class CisloView(generic.DetailView): |
|
|
|
model = Cislo |
|
|
|
template_name = 'seminar/archiv/cislo.html' |
|
|
@ -498,37 +504,18 @@ class CisloView(generic.DetailView): |
|
|
|
#.filter(hodnoceni_set__rocnik__eq=cislo_rocnik) |
|
|
|
radky_vysledkovky = [] |
|
|
|
for ar in aktivni_resitele: |
|
|
|
# získáme výsledky řešitele - součty přes jednotlivé hlavní problémy |
|
|
|
vr = VysledkyResitele(ar) |
|
|
|
for h in hlavni_problemy: |
|
|
|
body = body_resitele_problemu_v_cisle(h, ar, cislo) |
|
|
|
# vr.body[h.kod_v_rocniku] = body |
|
|
|
vr.body_cislo = vr.body_cislo + body |
|
|
|
# ukládání součtu bodů za všechny hlavní problémy => součet bodů za číslo |
|
|
|
vr.body_cislo = body_resitele_v_cisle(ar, cislo) |
|
|
|
# výpočet bodů za ročník do daného čísla (aby fungovalo i pro starší čísla) |
|
|
|
vr.body_rocnik = body_resitele_v_rocniku(ar, cislo.rocnik, cislo) |
|
|
|
radky_vysledkovky.append(vr) |
|
|
|
|
|
|
|
## TODO: spočítat počet bodů řešitele v daném ročníku a seřadit je podle toho |
|
|
|
## TODO: seřadit řešitele podle bodů v daném ročníku |
|
|
|
## řazení viz fce výše - pochopit a případně přepsat |
|
|
|
## počet bodů udělat ve fce body_resitele_v_rocniku |
|
|
|
|
|
|
|
|
|
|
|
# vysledky = VysledkyKCisluZaRocnik.objects.filter(cislo = context['cislo']).\ |
|
|
|
# order_by('-body', 'resitel__prijmeni', 'resitel__jmeno') |
|
|
|
# reseni = Reseni.objects.filter(cislo_body = context['cislo']).select_related("resitel") |
|
|
|
|
|
|
|
# typy úloh, které se mají zobrazovat u čísla, tj. těch, které byly |
|
|
|
# v čísle skutečně zadány |
|
|
|
# typy_skutecne_zadanych = [Problem.TYP_ULOHA, Problem.TYP_SERIAL, Problem.TYP_ORG_CLANEK] |
|
|
|
# v_cisle_zadane = Problem.objects.filter(cislo_zadani=context['cislo']).filter(typ__in=typy_skutecne_zadanych).order_by('kod') |
|
|
|
|
|
|
|
# resene_problemy = Problem.objects.filter(cislo_reseni=context['cislo']).filter(typ__in=typy_skutecne_zadanych).order_by('cislo_zadani__cislo', 'kod') |
|
|
|
# |
|
|
|
# poradi_typu = { |
|
|
|
# Problem.TYP_ULOHA: 1, |
|
|
|
|
|
|
|
# Problem.TYP_SERIAL: 2, |
|
|
|
# Problem.TYP_ORG_CLANEK: 3, |
|
|
|
# Problem.TYP_TEMA: 4, |
|
|
|
# Problem.TYP_RES_CLANEK: 5 |
|
|
|
# } |
|
|
|
# problemy = sorted(set(r.problem for r in reseni), key=lambda x:(poradi_typu[x.typ], x.kod_v_rocniku())) |
|
|
|
# #setridi problemy podle typu a poradi zadani |
|
|
|
# problem_index = {} |
|
|
@ -975,7 +962,7 @@ def texDownloadView(request, rocnik, cislo): |
|
|
|
"body": p.body, |
|
|
|
"zadani": p.text_zadani, |
|
|
|
"reseni": p.text_reseni, |
|
|
|
"cislo_zadani": p.cislo_zadani.cislo, |
|
|
|
"cislo_zadani": p.cislo_zadani.poradi, |
|
|
|
} for p in resene |
|
|
|
], |
|
|
|
} |
|
|
|