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 %} {{ p.cislo_zadani.cislo }}.{{ p.kod }} {% endfor %} - Sum-1 - Celkem + Za číslo + Za ročník Odjakživa {% for rv in vysledkovka %} - {{ rv.poradi }} - {{ rv.titul }} MM {{ rv.resitel.plne_jmeno }} - {% for b in rv.body %} + {% autoescape off %}{{ rv.poradi }}{% endautoescape %} + + {% if rv.titul %} + {{ rv.titul }}MM + {% endif %} + {{ rv.resitel.plne_jmeno }} + {% for b in rv.body_ulohy %} {{ b }} {% endfor %} - {{ rv.body_minule }} + {{ rv.body_cislo }} {{ rv.body_celkem_rocnik }} {{ rv.body_celkem_odjakziva }} diff --git a/seminar/templates/seminar/archiv/rocnik.html b/seminar/templates/seminar/archiv/rocnik.html index 9aa8cacc..346f9c44 100644 --- a/seminar/templates/seminar/archiv/rocnik.html +++ b/seminar/templates/seminar/archiv/rocnik.html @@ -30,11 +30,15 @@ {% for rv in vysledkovka %} - {{ 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