diff --git a/seminar/templates/seminar/archiv/cislo.html b/seminar/templates/seminar/archiv/cislo.html
index b7b11a1c..23d115a7 100644
--- a/seminar/templates/seminar/archiv/cislo.html
+++ b/seminar/templates/seminar/archiv/cislo.html
@@ -34,17 +34,21 @@
{% for p in problemy %}
- {{ rv.poradi }}
- | {{ rv.resitel.titul }} MM {{ rv.resitel.plne_jmeno }}
+ | {% autoescape off %}{{ rv.poradi }}{% endautoescape %}
+ |
+ {% if rv.titul %}
+ {{ rv.titul }}MM
+ {% endif %}
+ {{ rv.resitel.plne_jmeno }}
| {{ rv.resitel.rocnik }}
| {{ rv.body_odjakziva }}
- {% for b in rv.body %}
+ {% for b in rv.body_cisla %}
| {{ b }}
{% endfor %}
| {{ rv.body_rocnik }}
diff --git a/seminar/views.py b/seminar/views.py
index 33fd1f89..03f77180 100644
--- a/seminar/views.py
+++ b/seminar/views.py
@@ -12,6 +12,7 @@ from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjak
from . import utils
import datetime
+from itertools import groupby
def AktualniZadaniView(request):
@@ -72,6 +73,26 @@ class CislaView(generic.ListView):
model = Rocnik
template_name='seminar/archiv/cisla.html'
+
+def sloupec_s_poradim(vysledky):
+ # počet řešitelů ve výsledkovce nad aktuálním
+ lepsich_resitelu = 0
+
+ poradi_l = []
+ # projdeme skupiny řešitelů se stejným počtem bodů
+ for skupina in (list(x) for _, x in groupby(vysledky, lambda x: x.body)):
+
+ # připravíme si obsahy buněk ve sloupci pořadí pro skupinu
+ if len(skupina) == 1:
+ poradi_l += ["{}.".format(lepsich_resitelu + 1)]
+ # je-li účastníků se stejným počtem bodů víc, pořadí (rozsah X.-Y.) je jen u prvního
+ else:
+ poradi_l += ["{}.–{}.".format(lepsich_resitelu + 1, lepsich_resitelu + len(skupina))] + [""] * (len(skupina)-1)
+ lepsich_resitelu += len(skupina)
+
+ return poradi_l
+
+
class RocnikView(generic.DetailView):
model = Rocnik
template_name = 'seminar/archiv/rocnik.html'
@@ -93,71 +114,40 @@ class RocnikView(generic.DetailView):
def get_context_data(self, **kwargs):
context = super(RocnikView, self).get_context_data(**kwargs)
- cisla_v_rocniku = VysledkyKCisluZaRocnik.objects.filter(cislo__verejna_vysledkovka = True).filter(cislo__rocnik = context['rocnik']).order_by('-cislo')
+ cisla_v_rocniku = VysledkyKCisluZaRocnik.objects.filter(cislo__verejna_vysledkovka = True).filter(cislo__rocnik = context['rocnik']).order_by('cislo')
#vyberu vsechny verejne vysledky z rocniku
#pokud žádné nejsou, výsledkovka se nezobrazí
if cisla_v_rocniku:
- vysledky = 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].cislo).order_by('-body', 'resitel__prijmeni', 'resitel__jmeno').select_related('resitel'))
#vybere vsechny vysledky z posledniho verejneho cisla a setridi sestupne dle bodu
- vysledky_resitele = {}
- stejne_body = {}
- konec_rozmezi = {}
vysledkovka = []
- posledni_body = 100000
- predchozi_poradi = None
- body_minule = None
-
- for vi in range(len(vysledky)):
- v = vysledky[vi]
- rv = RadekVysledkovky()
- rv.resitel = v.resitel
+
+ # doplníme některé údaje do řádků výsledkovky pro řešitele ve skupině
+ for poradi, v in zip(sloupec_s_poradim(vysledky), vysledky):
+ v.poradi = poradi
+ v.resitel.rocnik = v.resitel.rocnik(context['rocnik'])
+
verejne_vysl_odjakziva = VysledkyKCisluOdjakziva.objects.filter(cislo__verejna_vysledkovka = True).filter(cislo__rocnik = context['rocnik']).filter(cislo = cisla_v_rocniku[0].cislo)
- rv.body_odjakziva = verejne_vysl_odjakziva.filter(resitel = rv.resitel)[0].body
- rv.resitel.titul = rv.resitel.get_titul(rv.body_odjakziva)
- rv.resitel.rocnik = rv.resitel.rocnik(context['rocnik'])
- rv.body = []*len(context['rocnik'].verejna_cisla())
+
+ v.body_odjakziva = verejne_vysl_odjakziva.filter(resitel = v.resitel)[0].body
+ v.titul = v.resitel.get_titul(v.body_odjakziva)
+ v.body_rocnik = v.body
+ v.body_cisla = []
+
#pokud pro dany rok a cislo nema resitel vysledky, ma defaultne 0
for cis in context['rocnik'].verejna_cisla():
if cis.verejna_vysledkovka:
- print cis
- body_za_cislo = VysledkyZaCislo.objects.filter(cislo__rocnik = context['rocnik']).filter(cislo = cis).filter(resitel = rv.resitel)
+ body_za_cislo = VysledkyZaCislo.objects.filter(cislo__rocnik = context['rocnik']).filter(cislo = cis).filter(resitel = v.resitel)
#seznam vysledku se spravnym rocnikem a cislem pro resitele
#zobrazim jen je-li vysledkovka verejna
if body_za_cislo:
- rv.body.append(body_za_cislo[0].body)
+ v.body_cisla.append(body_za_cislo[0].body)
#neprazdne vysledky by mely obsahovat prave jeden vysledek
else:
- rv.body.append(0)
+ v.body_cisla.append(0)
#resitel nema za cislo body
- rv.poradi = ''
- #defaultni poradi je prazdne - kvuli sdilenym mistum
- rv.body_rocnik = v.body
- rv.body_na_zacatku = rv.body_odjakziva - rv.body_rocnik
- #body za minule rocniky
- if posledni_body > v.body:
- if stejne_body.get(posledni_body):
- #pokud uz jsme predtim narazili na stejny pocet bodu
- konec_rozmezi[posledni_body] = int(predchozi_poradi.poradi) + stejne_body[posledni_body]
- #druha hranice sdilenych pozic - zacatek + pocet lidi se stejnymi body
- predchozi_poradi.poradi = '{0}. -- {1}.'.format(predchozi_poradi.poradi,konec_rozmezi[posledni_body])
- #predchozi radek ktery menil pocty bodu bude mit rozsah, pokud bylo vice radku se stejnym poctem bodu
- elif predchozi_poradi :
- predchozi_poradi.poradi = '{0}.'.format(predchozi_poradi.poradi)
- #pokud nebyl rozsah hodnot, vypisu, pridam tecku za cislo
- posledni_body = v.body
- rv.poradi = vi + 1
- #poradi se meni jen u resitele s rozdilnym poctem bodu nez mel minuly
- predchozi_poradi = rv
- elif posledni_body == v.body:
- if not stejne_body.get(v.body):
- stejne_body[v.body] = 1
- #pokud klic neexistuje, zalozim novy pro tohoto resitele
- else:
- stejne_body[v.body] += 1
- #rozsirim pocet resitelu sdilejici stejnou pozici
- vysledky_resitele[v.resitel.id] = rv
- #odkaz na radek vysledkovky patrici danemu resiteli
- vysledkovka.append(rv)
+
+ vysledkovka.append(v)
context['vysledkovka'] = vysledkovka
return context
@@ -188,6 +178,7 @@ class CisloView(generic.DetailView):
{'verbose_name': queryset.model._meta.verbose_name})
return obj
+
def get_context_data(self, **kwargs):
context = super(CisloView, self).get_context_data(**kwargs)
@@ -208,60 +199,28 @@ class CisloView(generic.DetailView):
#umoznuje zjistit index podle id problemu
vysledky_resitele = {}
- stejne_body = {}
- konec_rozmezi = {}
vysledkovka = []
- posledni_body = 100000
- predchozi_poradi = None
- body_minule = None
-
- for vi in range(len(vysledky)):
- v = vysledky[vi]
- tv = RadekVysledkovky()
- tv.resitel = v.resitel
- tv.resitel.titul = tv.resitel.get_titul(v.body)
- tv.rocnik = tv.resitel.rocnik(context['cislo'].rocnik)
- tv.vysledek = v
- #odkazuje na VysledkyKCislu
- tv.body = ['']*len(problemy)
- #pole bodu za ulohy
- tv.poradi = ''
- #defaultni poradi je prazdne - kvuli sdilenym mistum
- tv.body_celkem_rocnik = v.body
- tv.body_celkem_odjakziva = VysledkyKCisluOdjakziva.objects.get(resitel=v.resitel, cislo=context['cislo']).body
+
+ # doplníme některé údaje do řádků výsledkovky pro řešitele ve skupině
+ for poradi, v in zip(sloupec_s_poradim(vysledky), vysledky):
+ v.poradi = poradi
+ v.body_celkem_rocnik = v.body
+ v.body_celkem_odjakziva = VysledkyKCisluOdjakziva.objects.get(resitel=v.resitel, cislo=context['cislo']).body
+ v.body_ulohy = [0] * len(problemy)
+ v.titul = v.resitel.get_titul(v.body_celkem_odjakziva)
+
body_cislo_q = VysledkyZaCislo.objects.filter(resitel=v.resitel, cislo=context['cislo'])
- tv.body_cislo = body_cislo_q[0].body if len(body_cislo_q) > 0 else 0
- tv.body_minule = tv.body_celkem_rocnik - tv.body_cislo
- tv.titul=tv.resitel.get_titul(int(tv.body_celkem_odjakziva))
- #pocet bodu do tohoto cisla
- if posledni_body > tv.body_celkem_rocnik:
- if stejne_body.get(posledni_body):
- konec_rozmezi[posledni_body] = int(predchozi_poradi.poradi) + stejne_body[posledni_body]
- #druha hranice sdilenych pozic - zacatek + pocet lidi se stejnymi body
- predchozi_poradi.poradi = '{0}. -- {1}.'.format(predchozi_poradi.poradi,konec_rozmezi[posledni_body])
- #predchozi radek ktery menil pocty bodu bude mit rozsah, pokud bylo vice radku se stejnym poctem bodu
- elif predchozi_poradi :
- predchozi_poradi.poradi = '{0}.'.format(predchozi_poradi.poradi)
- #pokud nebyl rozsah hodnot, pridam tecku za cislo
- posledni_body = tv.body_celkem_rocnik
- tv.poradi = vi + 1
- #poradi se meni jen u resitele s rozdilnym poctem bodu nez mel minuly
- predchozi_poradi = tv
- elif posledni_body == tv.body_celkem_rocnik:
- if not stejne_body.get(tv.body_celkem_rocnik):
- stejne_body[tv.body_celkem_rocnik] = 1
- #pokud klic neexistuje, zalozim novy pro tohoto resitele
- else:
- stejne_body[tv.body_celkem_rocnik] += 1
- #rozsirim pocet resitelu sdilejici stejnou pozici
- vysledky_resitele[v.resitel.id] = tv
- #odkaz na radek vysledkovky patrici danemu resiteli
- vysledkovka.append(tv)
+ v.body_cislo = body_cislo_q[0].body if body_cislo_q else 0
- for r in reseni:
- vysledky_resitele[r.resitel.id].body[problem_index[r.problem.id]] = r.body
-
+ vysledkovka.append(v)
+ # připravíme si odkaz na řádek, abychom do něj mohli doplnit body za jednotlivé úlohy
+ vysledky_resitele[v.resitel.id] = v
+
+ # za každé řešení doplníme k příslušnému řešiteli a úloze body
+ for r in reseni:
+ vysledky_resitele[r.resitel.id].body_ulohy[problem_index[r.problem.id]] = r.body
+
context['vysledkovka'] = vysledkovka
context['problemy'] = problemy
context['v_cisle_zadane'] = v_cisle_zadane
|