Merge branch 'data_migrations' of gimli.ms.mff.cuni.cz:/akce/mam/git/mamweb into data_migrations
This commit is contained in:
commit
4c4d384a74
3 changed files with 215 additions and 97 deletions
|
@ -67,21 +67,21 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<th class='border-r'>Za číslo</sup>
|
<th class='border-r'>Za číslo</sup>
|
||||||
<th class='border-r'>Za ročník
|
<th class='border-r'>Za ročník
|
||||||
<th class='border-r'>Odjakživa
|
{#<th class='border-r'>Odjakživa#}
|
||||||
{% for rv in vysledkovka %}
|
{% for rv in radky_vysledkovky %}
|
||||||
<tr>
|
<tr>
|
||||||
<td class='border-r'>{% autoescape off %}{{ rv.poradi }}{% endautoescape %}
|
<td class='border-r'>{% autoescape off %}{{ rv.poradi }}{% endautoescape %}
|
||||||
<th class='border-r'>
|
<th class='border-r'>
|
||||||
{% if rv.titul %}
|
{% if rv.resitel.get_titul != "" %}
|
||||||
{{ rv.titul }}<sup>MM</sup>
|
{{ rv.resitel.get_titul }}<sup>MM</sup>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{{ rv.resitel.plne_jmeno }}
|
{{ rv.resitel.osoba.plne_jmeno }}
|
||||||
{% for b in rv.body_ulohy %}
|
{% for b in rv.hlavni_problemy_body %}
|
||||||
<td class='border-r'>{{ b }}
|
<td class='border-r'>{{ b }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<td class='border-r'>{{ rv.body_cislo }}
|
<td class='border-r'>{{ rv.body_cislo }}
|
||||||
<td class='border-r'><b>{{ rv.body_celkem_rocnik }}</b>
|
<td class='border-r'><b>{{ rv.body_rocnik }}</b>
|
||||||
<td class='border-r'>{{ rv.body_celkem_odjakziva }}
|
{# <td class='border-r'>{{ rv.body_celkem_odjakziva }}#}
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -23,7 +23,7 @@ urlpatterns = [
|
||||||
path('archiv/temata/', views.ArchivTemataView.as_view()),
|
path('archiv/temata/', views.ArchivTemataView.as_view()),
|
||||||
|
|
||||||
path('rocnik/<int:rocnik>/', views.RocnikView.as_view(), name='seminar_rocnik'),
|
path('rocnik/<int:rocnik>/', views.RocnikView.as_view(), name='seminar_rocnik'),
|
||||||
#path('cislo/<int:rocnik>.<int:cislo>/', views.CisloView.as_view(), name='seminar_cislo'),
|
path('cislo/<int:rocnik>.<int:cislo>/', views.CisloView.as_view(), name='seminar_cislo'),
|
||||||
path('problem/<int:pk>/', views.ProblemView.as_view(), name='seminar_problem'),
|
path('problem/<int:pk>/', views.ProblemView.as_view(), name='seminar_problem'),
|
||||||
path('treenode/<int:pk>/', views.TreeNodeView.as_view(), name='seminar_treenode'),
|
path('treenode/<int:pk>/', views.TreeNodeView.as_view(), name='seminar_treenode'),
|
||||||
#path('problem/(?P<pk>\d+)/(?P<prispevek>\d+)/', views.PrispevekView.as_view(), name='seminar_problem_prispevek'),
|
#path('problem/(?P<pk>\d+)/(?P<prispevek>\d+)/', views.PrispevekView.as_view(), name='seminar_problem_prispevek'),
|
||||||
|
|
|
@ -404,31 +404,39 @@ def sloupec_s_poradim(seznam_s_body):
|
||||||
aktualni_poradi = aktualni_poradi + velikost_skupiny
|
aktualni_poradi = aktualni_poradi + velikost_skupiny
|
||||||
return sloupec_s_poradim
|
return sloupec_s_poradim
|
||||||
|
|
||||||
# spočítá součet bodů získaných daným řešitelem za zadaný problém a všechny jeho podproblémy
|
## 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):
|
#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
|
# # od daného řešitele
|
||||||
reseni_resitele = problem.hodnoceni_set.filter(reseni__resitele=resitel,
|
# reseni_resitele = s.Reseni_Resitele.objects.filter(resitele=resitel)
|
||||||
cislo_body=cislo)
|
# hodnoceni_resitele = problem.hodnoceni.filter(reseni__in=reseni_resitele,
|
||||||
# XXX chyba na řádku výše - řešení může mít více řešitelů, asi chceme contains
|
# cislo_body=cislo)
|
||||||
# nebo in
|
# # XXX chyba na řádku výše - řešení může mít více řešitelů, asi chceme contains
|
||||||
for r in reseni_resitele:
|
# # nebo in
|
||||||
soucet += r.body
|
# for r in hodnoceni_resitele:
|
||||||
|
# soucet += r.body
|
||||||
|
#
|
||||||
|
# # a přičteme k tomu hodnocení všech podproblémů
|
||||||
|
# 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
|
||||||
|
|
||||||
# a přičteme k tomu hodnocení všech podproblémů
|
## spočítá součet všech bodů ze všech podproblémů daného problému daného řešitele
|
||||||
for p in problem.podproblem.all():
|
#def body_resitele_problemu_v_cisle(problem, resitel, cislo):
|
||||||
# i přes jméno by to měla být množina jeho podproblémů
|
# # probably FIXED: nezohledňuje číslo, do kterého se body počítají
|
||||||
soucet += __soucet_resitele_problemu(p, resitel, soucet)
|
# return __soucet_resitele_problemu(problem, resitel, cislo, 0)
|
||||||
return soucet
|
|
||||||
|
|
||||||
# spočítá součet všech bodů ze všech podproblémů daného problému daného řešitele
|
# pro daný problém vrátí jeho nejvyšší nadproblém
|
||||||
def body_resitele_problemu_v_cisle(problem, resitel, cislo):
|
def hlavni_problem(problem):
|
||||||
# probably FIXED: nezohledňuje číslo, do kterého se body počítají
|
while not(problem.nadproblem == None):
|
||||||
return __soucet_resitele_problemu(problem, resitel, cislo, 0)
|
problem = problem.nadproblem
|
||||||
|
return problem
|
||||||
|
|
||||||
# vrátí list všech problémů s body v daném čísle, které již nemají nadproblém
|
# 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):
|
||||||
hodnoceni = cislo.hodnoceni.select_related('problem', 'reseni').all() # hodnocení, která se vážou k danému číslu
|
hodnoceni = cislo.hodnoceni.select_related('problem', 'reseni').all()
|
||||||
|
# hodnocení, která se vážou k danému číslu
|
||||||
|
|
||||||
reseni = [h.reseni for h in hodnoceni]
|
reseni = [h.reseni for h in hodnoceni]
|
||||||
problemy = [h.problem for h in hodnoceni]
|
problemy = [h.problem for h in hodnoceni]
|
||||||
|
@ -439,9 +447,7 @@ def hlavni_problemy_cisla(cislo):
|
||||||
# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém)
|
# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém)
|
||||||
hlavni_problemy = []
|
hlavni_problemy = []
|
||||||
for p in problemy:
|
for p in problemy:
|
||||||
while not(p.nadproblem == None):
|
hlavni_problemy.append(hlavni_problem(p))
|
||||||
p = p.nadproblem
|
|
||||||
hlavni_problemy.append(p)
|
|
||||||
|
|
||||||
# zunikátnění
|
# zunikátnění
|
||||||
hlavni_problemy_set = set(hlavni_problemy)
|
hlavni_problemy_set = set(hlavni_problemy)
|
||||||
|
@ -450,38 +456,83 @@ def hlavni_problemy_cisla(cislo):
|
||||||
|
|
||||||
return hlavni_problemy
|
return hlavni_problemy
|
||||||
|
|
||||||
def body_resitele_odjakziva(resitel):
|
# vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník
|
||||||
body = 0
|
# POZOR! Aktuálně počítá jen za posledních 10 let od zadaného ročníku
|
||||||
resitelova_hodnoceni = Hodnoceni.objects.select_related('body').all().filter(reseni_resitele=resitel)
|
def body_resitelu_odjakziva(rocnik, resitele):
|
||||||
# TODO: v radku nahore chceme _in nebo _contains
|
body_odjakziva = {}
|
||||||
for hodnoceni in resitelova_hodnoceni:
|
|
||||||
body = body + hodnoceni.body
|
for r in resitele:
|
||||||
return body
|
body_odjakziva[str(r.id)] = 0
|
||||||
|
# # Body za posledních 10 let je dobrá aproximace pro naše potřeby (výsledkovka
|
||||||
|
# # s aktivními řešiteli)
|
||||||
|
#
|
||||||
|
# body_pred_roky = []
|
||||||
|
# for i in range(0, 10):
|
||||||
|
# body_pred_roky.append(body_resitelu_za_rocnik(rocnik-i, resitele))
|
||||||
|
#
|
||||||
|
# for r in resitele:
|
||||||
|
# for i in range(0,10):
|
||||||
|
# body_odjakziva[str(r.id)] += body_pred_roky[i][str(r.id)]
|
||||||
|
|
||||||
|
|
||||||
|
# Nasledující řešení je sice správné, ale moc pomalé:
|
||||||
|
for res in Reseni.objects.prefetch_related('resitele', 'hodnoceni').all():
|
||||||
|
for r in res.resitele.all():
|
||||||
|
# daný řešitel nemusí být v naší podmnožině
|
||||||
|
if r not in resitele: continue
|
||||||
|
|
||||||
|
for hodn in res.hodnoceni.all():
|
||||||
|
pricti_body(body_odjakziva, r, hodn.body)
|
||||||
|
return body_odjakziva
|
||||||
|
|
||||||
|
# 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[str(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
|
||||||
|
reseni = Reseni.objects.prefetch_related('resitele', 'hodnoceni').filter(hodnoceni__cislo_body__rocnik=rocnik)
|
||||||
|
for res in reseni:
|
||||||
|
for resitel in res.resitele.all():
|
||||||
|
for hodn in res.hodnoceni.all():
|
||||||
|
pricti_body(body_za_rocnik, resitel, hodn.body)
|
||||||
|
return body_za_rocnik
|
||||||
|
|
||||||
|
#def body_resitele_odjakziva(resitel):
|
||||||
|
# body = 0
|
||||||
|
# resitelova_hodnoceni = Hodnoceni.objects.select_related('body').all().filter(reseni_resitele=resitel)
|
||||||
|
# # TODO: v radku nahore chceme _in nebo _contains
|
||||||
|
# for hodnoceni in resitelova_hodnoceni:
|
||||||
|
# body = body + hodnoceni.body
|
||||||
|
# return body
|
||||||
|
|
||||||
# spočítá součet všech bodů řešitele za dané číslo
|
# spočítá součet všech bodů řešitele za dané číslo
|
||||||
def body_resitele_v_cisle(resitel, cislo):
|
#def body_resitele_v_cisle(resitel, cislo):
|
||||||
hlavni_problemy = hlavni_problemy_cisla(cislo)
|
# hlavni_problemy = hlavni_problemy_cisla(cislo)
|
||||||
body_resitele = 0
|
# body_resitele = 0
|
||||||
for h in hlavni_problemy:
|
# for h in hlavni_problemy:
|
||||||
body_resitele = body_resitele + body_resitele_problemu_v_cisle(h, resitel, cislo)
|
# body_resitele = body_resitele + body_resitele_problemu_v_cisle(h, resitel, cislo)
|
||||||
# TODO: je rozdíl mezi odevzdanou úlohou za 0 a tím, když řešitel nic neodevzdal
|
# # TODO: je rozdíl mezi odevzdanou úlohou za 0 a tím, když řešitel nic neodevzdal
|
||||||
# řešit přes kontrolu velikosti množiny řešení daného problému do daného čísla?
|
# # řešit přes kontrolu velikosti množiny řešení daného problému do daného čísla?
|
||||||
# Tady to ale nevadí, tady se počítá součet za číslo.
|
# # Tady to ale nevadí, tady se počítá součet za číslo.
|
||||||
return body_resitele
|
# return body_resitele
|
||||||
|
|
||||||
# spočítá součet všech bodů řešitele za daný rok (nebo jen do daného čísla včetně)
|
# 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, 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
|
# # pokud do_cisla=None, tak do posledního čísla v ročníku
|
||||||
# do_cisla je objekt Cislo
|
# # 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
|
# # Cislo už lexikograficky setřízené, viz models
|
||||||
body = 0
|
# body = 0
|
||||||
for cislo in cisla:
|
# for cislo in cisla:
|
||||||
if cislo.poradi == do_cisla.poradi: break
|
# if cislo.poradi == do_cisla.poradi: break
|
||||||
# druhá část zaručuje, že máme výsledky do daného čísla včetně
|
# # druhá část zaručuje, že máme výsledky do daného čísla včetně
|
||||||
body = body + body_resitele_v_cisle(resitel, cislo)
|
# body = body + body_resitele_v_cisle(resitel, cislo)
|
||||||
return body
|
# return body
|
||||||
|
|
||||||
|
# TODO: předělat na nový model
|
||||||
#def vysledkovka_rocniku(rocnik, jen_verejne=True):
|
#def vysledkovka_rocniku(rocnik, jen_verejne=True):
|
||||||
# """Přebírá ročník (např. context["rocnik"]) a vrací výsledkovou listinu ve
|
# """Přebírá ročník (např. context["rocnik"]) a vrací výsledkovou listinu ve
|
||||||
# formě vhodné pro šablonu "seminar/vysledkovka_rocniku.html"
|
# formě vhodné pro šablonu "seminar/vysledkovka_rocniku.html"
|
||||||
|
@ -563,7 +614,8 @@ class RocnikView(generic.DetailView):
|
||||||
|
|
||||||
#context['vysledkovka'] = vysledkovka_rocniku(context["rocnik"])
|
#context['vysledkovka'] = vysledkovka_rocniku(context["rocnik"])
|
||||||
#context['vysledkovka_s_neverejnymi'] = vysledkovka_rocniku(context["rocnik"], jen_verejne=False)
|
#context['vysledkovka_s_neverejnymi'] = vysledkovka_rocniku(context["rocnik"], jen_verejne=False)
|
||||||
context['temata_v_rocniku'] = verejna_temata(context["rocnik"])
|
#context['temata_v_rocniku'] = verejna_temata(context["rocnik"])
|
||||||
|
# FIXME: opravit vylistování témat v ročníku
|
||||||
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
@ -587,19 +639,30 @@ class ProblemView(generic.DetailView):
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class VysledkyResitele(object):
|
class RadekVysledkovky(object):
|
||||||
"""Pro daného řešitele ukládá počet bodů za jednotlivé úlohy a celkový
|
"""Obsahuje věci, které se hodí vědět při konstruování výsledkovky.
|
||||||
počet bodů za konkrétní ročník do daného čísla a za dané číslo."""
|
Umožňuje snazší práci v templatu (lepší, než seznam)."""
|
||||||
|
|
||||||
def __init__(self, resitel, cislo, rocnik):
|
def __init__(self, poradi, resitel, body_problemy_sezn,
|
||||||
|
body_cislo, body_rocnik, body_odjakziva):
|
||||||
self.resitel = resitel
|
self.resitel = resitel
|
||||||
self.cislo = cislo
|
self.body_cislo = body_cislo
|
||||||
self.body_cislo = body_resitele_v_cisle(resitel, cislo)
|
self.body_rocnik = body_rocnik
|
||||||
self.body = []
|
self.body_celkem_odjakziva = body_odjakziva
|
||||||
self.rocnik = rocnik
|
self.poradi = poradi
|
||||||
self.body_rocnik = body_resitele_v_rocniku(resitel, rocnik, cislo)
|
self.body_problemy_sezn = body_problemy_sezn
|
||||||
self.body_celkem_odjakziva = resitel.vsechny_body()
|
|
||||||
self.poradi = 0
|
|
||||||
|
# přiřazuje danému řešiteli body do slovníku
|
||||||
|
def pricti_body(slovnik, resitel, body):
|
||||||
|
# testujeme na None (""), pokud je to první řešení
|
||||||
|
# daného řešitele, předěláme na 0
|
||||||
|
# (v dalším kroku přičteme reálný počet bodů),
|
||||||
|
# rozlišujeme tím mezi 0 a neodevzdaným řešením
|
||||||
|
if slovnik[str(resitel.id)] == "":
|
||||||
|
slovnik[str(resitel.id)] = 0
|
||||||
|
|
||||||
|
slovnik[str(resitel.id)] += body
|
||||||
|
|
||||||
class CisloView(generic.DetailView):
|
class CisloView(generic.DetailView):
|
||||||
model = Cislo
|
model = Cislo
|
||||||
|
@ -623,48 +686,103 @@ class CisloView(generic.DetailView):
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super(CisloView, self).get_context_data(**kwargs)
|
context = super(CisloView, self).get_context_data(**kwargs)
|
||||||
|
|
||||||
## TODO upravit dle nového modelu
|
|
||||||
cislo = context['cislo']
|
cislo = context['cislo']
|
||||||
hlavni_problemy = hlavni_problemy_cisla(cislo)
|
hlavni_problemy = hlavni_problemy_cisla(cislo)
|
||||||
|
# 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 jednotlivé řešitele (slovník slovníků hlavních problémů)
|
||||||
|
hlavni_problemy_slovnik = {}
|
||||||
|
for hp in hlavni_problemy:
|
||||||
|
hlavni_problemy_slovnik[str(hp.id)] = {}
|
||||||
|
|
||||||
## TODO dostat pro tyto problémy součet v daném čísle pro daného řešitele
|
## TODO dostat pro tyto problémy součet v daném čísle pro daného řešitele
|
||||||
## TODO možná chytřeji vybírat aktivní řešitele
|
## TODO možná chytřeji vybírat aktivní řešitele
|
||||||
## chceme letos něco poslal
|
# aktivní řešitelé - chceme letos něco poslal, TODO později vyfiltrujeme ty, kdo mají
|
||||||
aktivni_resitele = Resitel.objects.filter(
|
# u alespoň jedné hodnoty něco jiného než NULL
|
||||||
rok_maturity__gte=cislo.rocnik.druhy_rok())
|
aktivni_resitele = list(Resitel.objects.filter(
|
||||||
|
rok_maturity__gte=cislo.rocnik.druhy_rok()))
|
||||||
# TODO: zkusit hodnoceni__rocnik...
|
# TODO: zkusit hodnoceni__rocnik...
|
||||||
#.filter(hodnoceni_set__rocnik__eq=cislo_rocnik)
|
#.filter(hodnoceni_set__rocnik__eq=cislo_rocnik)
|
||||||
radky_vysledkovky = []
|
# zakládání prázdných záznamů pro řešitele
|
||||||
|
cislobody = {}
|
||||||
for ar in aktivni_resitele:
|
for ar in aktivni_resitele:
|
||||||
# získáme výsledky řešitele - součty přes číslo a ročník
|
# řešitele převedeme na řetězec pomocí unikátního id
|
||||||
vr = VysledkyResitele(ar, cislo, cislo.rocnik)
|
cislobody[str(ar.id)] = ""
|
||||||
for hp in hlavni_problemy:
|
for hp in hlavni_problemy:
|
||||||
vr.body.append(
|
slovnik = hlavni_problemy_slovnik[str(hp.id)]
|
||||||
body_resitele_problemu_v_cisle(hp, ar, cislo))
|
slovnik[str(ar.id)] = ""
|
||||||
radky_vysledkovky.append(vr)
|
|
||||||
|
|
||||||
# setřídíme řádky výsledkovky/objekty VysledkyResitele podle bodů
|
|
||||||
radky_vysledkovky.sort(key=lambda vr: vr.body_rocnik, reverse=True)
|
|
||||||
|
|
||||||
# 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í
|
# vezmeme všechna řešení s body do daného čísla
|
||||||
i = 0
|
reseni_do_cisla = Reseni.objects.prefetch_related('problem', 'hodnoceni', 'resitele').filter(hodnoceni__cislo_body=cislo)
|
||||||
for rv in radky_vysledkovky:
|
|
||||||
rv.poradi = sloupec_poradi[i]
|
# projdeme všechna řešení do čísla a přičteme body každému řešiteli do celkových
|
||||||
i = i + 1
|
# bodů i do bodů za problém
|
||||||
|
for reseni in reseni_do_cisla:
|
||||||
|
|
||||||
|
# řešení může řešit více problémů
|
||||||
|
for prob in list(reseni.problem.all()):
|
||||||
|
nadproblem = hlavni_problem(prob)
|
||||||
|
nadproblem_slovnik = hlavni_problemy_slovnik[str(nadproblem.id)]
|
||||||
|
|
||||||
|
# a více hodnocení
|
||||||
|
for hodn in list(reseni.hodnoceni.all()):
|
||||||
|
body = hodn.body
|
||||||
|
|
||||||
|
# a více řešitelů
|
||||||
|
for resitel in list(reseni.resitele.all()):
|
||||||
|
pricti_body(cislobody, resitel, body)
|
||||||
|
pricti_body(nadproblem_slovnik, resitel, body)
|
||||||
|
|
||||||
|
# zeptáme se na dvojice (řešitel, body) za ročník a setřídíme sestupně
|
||||||
|
resitel_rocnikbody_slov = body_resitelu_za_rocnik(cislo.rocnik, aktivni_resitele)
|
||||||
|
resitel_rocnikbody_sezn = sorted(resitel_rocnikbody_slov.items(),
|
||||||
|
key = lambda x: x[1], reverse = True)
|
||||||
|
|
||||||
|
# získáme body odjakživa
|
||||||
|
resitel_odjakzivabody_slov = body_resitelu_odjakziva(cislo.rocnik.druhy_rok(),
|
||||||
|
aktivni_resitele)
|
||||||
|
|
||||||
|
# řešitelé setřídění podle bodů za číslo sestupně
|
||||||
|
setrizeni_resitele_id = [dvojice[0] for dvojice in resitel_rocnikbody_sezn]
|
||||||
|
setrizeni_resitele = [Resitel.objects.get(id=i) for i in setrizeni_resitele_id]
|
||||||
|
|
||||||
|
# vytvoříme jednotlivé sloupce výsledkovky
|
||||||
|
radky_vysledkovky = []
|
||||||
|
odjakziva_body = []
|
||||||
|
rocnik_body = []
|
||||||
|
cislo_body = []
|
||||||
|
hlavni_problemy_body = []
|
||||||
|
for ar_id in setrizeni_resitele_id:
|
||||||
|
# vytáhneme ze slovníků body pro daného řešitele
|
||||||
|
odjakziva_body.append(resitel_odjakzivabody_slov[ar_id])
|
||||||
|
rocnik_body.append(resitel_rocnikbody_slov[ar_id])
|
||||||
|
cislo_body.append(cislobody[ar_id])
|
||||||
|
problemy = []
|
||||||
|
for hp in hlavni_problemy:
|
||||||
|
problemy.append(hlavni_problemy_slovnik[str(hp.id)][ar_id])
|
||||||
|
hlavni_problemy_body.append(problemy)
|
||||||
|
print("{}: body za problémy - {}, číslobody - {}, ročníkbody - {}, odjakživabody - ".format(ar_id, problemy, cislobody[ar_id], resitel_rocnikbody_slov[ar_id]))
|
||||||
|
# pořadí určíme pomocí funkce, které dáme celkové body za ročník vzestupně
|
||||||
|
poradi = sloupec_s_poradim(rocnik_body)
|
||||||
|
|
||||||
|
radky_vysledkovky = []
|
||||||
|
for i in range(0, len(setrizeni_resitele_id)):
|
||||||
|
radek = RadekVysledkovky(poradi[i], setrizeni_resitele[i],
|
||||||
|
hlavni_problemy_body[i], cislo_body[i], rocnik_body[i],
|
||||||
|
odjakziva_body[i])
|
||||||
|
radky_vysledkovky.append(radek)
|
||||||
|
print("Přikládám {}-tý řádek.".format(i))
|
||||||
|
|
||||||
|
print("Následuje předávání do kontextu.")
|
||||||
# vytahané informace předáváme do kontextu
|
# vytahané informace předáváme do kontextu
|
||||||
context['cislo'] = cislo
|
context['cislo'] = cislo
|
||||||
context['radky_vysledkovky'] = radky_vysledkovky
|
context['radky_vysledkovky'] = radky_vysledkovky
|
||||||
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
|
||||||
#XXX testovat
|
#XXX nefungují body odjakživa - asi typový problém
|
||||||
#XXX opravit to, že se nezobrazují body za jednotlivé úlohy
|
#XXX nefungují tituly - možná korelace s výše uvedeným problémem
|
||||||
|
print("Předávám kontext.")
|
||||||
return context
|
return context
|
||||||
|
|
||||||
# problemy = sorted(set(r.problem for r in reseni), key=lambda x:(poradi_typu[x.typ], x.kod_v_rocniku()))
|
# problemy = sorted(set(r.problem for r in reseni), key=lambda x:(poradi_typu[x.typ], x.kod_v_rocniku()))
|
||||||
|
|
Loading…
Reference in a new issue