Browse Source

Upraveny výsledkovky

'–' místo ' -- ', v posledním rozsahu pořadí nechybí horní mez, v
ročníku funguje součet bodů za čísla, ^MM se nezobrazuje, když řešitel
nemá titul, trochu zkrácen view
remotes/origin/vysl deploy-prod-2015-09-09-09-48-xlfd
Matěj Kocián 9 years ago
parent
commit
0723b3421f
  1. 16
      seminar/templates/seminar/archiv/cislo.html
  2. 10
      seminar/templates/seminar/archiv/rocnik.html
  3. 159
      seminar/views.py

16
seminar/templates/seminar/archiv/cislo.html

@ -34,17 +34,21 @@
{% for p in problemy %} {% for p in problemy %}
<th class='border-r'><a href="{{ p.verejne_url }}">{{ p.cislo_zadani.cislo }}.{{ p.kod }}</a> <th class='border-r'><a href="{{ p.verejne_url }}">{{ p.cislo_zadani.cislo }}.{{ p.kod }}</a>
{% endfor %} {% endfor %}
<th class='border-r'>Sum<sup>-1</sup> <th class='border-r'>Za číslo</sup>
<th class='border-r'>Celkem <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 vysledkovka %}
<tr> <tr>
<td class='border-r'>{{ rv.poradi }} <td class='border-r'>{% autoescape off %}{{ rv.poradi }}{% endautoescape %}
<th class='border-r'> {{ rv.titul }} <sup>MM</sup> {{ rv.resitel.plne_jmeno }} <th class='border-r'>
{% for b in rv.body %} {% if rv.titul %}
{{ rv.titul }}<sup>MM</sup>
{% endif %}
{{ rv.resitel.plne_jmeno }}
{% for b in rv.body_ulohy %}
<td class='border-r'>{{ b }} <td class='border-r'>{{ b }}
{% endfor %} {% endfor %}
<td class='border-r'>{{ rv.body_minule }} <td class='border-r'>{{ rv.body_cislo }}
<td class='border-r'><b>{{ rv.body_celkem_rocnik }}</b> <td class='border-r'><b>{{ rv.body_celkem_rocnik }}</b>
<td class='border-r'>{{ rv.body_celkem_odjakziva }} <td class='border-r'>{{ rv.body_celkem_odjakziva }}
</tr> </tr>

10
seminar/templates/seminar/archiv/rocnik.html

@ -30,11 +30,15 @@
{% for rv in vysledkovka %} {% for rv in vysledkovka %}
<tr> <tr>
<td class='border-r'>{{ rv.poradi }} <td class='border-r'>{% autoescape off %}{{ rv.poradi }}{% endautoescape %}
<th class='border-r'> {{ rv.resitel.titul }} <sup>MM</sup> {{ rv.resitel.plne_jmeno }} <th class='border-r'>
{% if rv.titul %}
{{ rv.titul }}<sup>MM</sup>
{% endif %}
{{ rv.resitel.plne_jmeno }}
<td class='border-r'>{{ rv.resitel.rocnik }} <td class='border-r'>{{ rv.resitel.rocnik }}
<td class='border-r'>{{ rv.body_odjakziva }} <td class='border-r'>{{ rv.body_odjakziva }}
{% for b in rv.body %} {% for b in rv.body_cisla %}
<td class='border-r'>{{ b }} <td class='border-r'>{{ b }}
{% endfor %} {% endfor %}
<td class='border-r'><b>{{ rv.body_rocnik }}</b> <td class='border-r'><b>{{ rv.body_rocnik }}</b>

159
seminar/views.py

@ -12,6 +12,7 @@ from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjak
from . import utils from . import utils
import datetime import datetime
from itertools import groupby
def AktualniZadaniView(request): def AktualniZadaniView(request):
@ -72,6 +73,26 @@ class CislaView(generic.ListView):
model = Rocnik model = Rocnik
template_name='seminar/archiv/cisla.html' 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 += ["{}.&ndash;{}.".format(lepsich_resitelu + 1, lepsich_resitelu + len(skupina))] + [""] * (len(skupina)-1)
lepsich_resitelu += len(skupina)
return poradi_l
class RocnikView(generic.DetailView): class RocnikView(generic.DetailView):
model = Rocnik model = Rocnik
template_name = 'seminar/archiv/rocnik.html' template_name = 'seminar/archiv/rocnik.html'
@ -93,71 +114,40 @@ class RocnikView(generic.DetailView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(RocnikView, self).get_context_data(**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 #vyberu vsechny verejne vysledky z rocniku
#pokud žádné nejsou, výsledkovka se nezobrazí #pokud žádné nejsou, výsledkovka se nezobrazí
if cisla_v_rocniku: 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 #vybere vsechny vysledky z posledniho verejneho cisla a setridi sestupne dle bodu
vysledky_resitele = {}
stejne_body = {}
konec_rozmezi = {}
vysledkovka = [] vysledkovka = []
posledni_body = 100000
predchozi_poradi = None # doplníme některé údaje do řádků výsledkovky pro řešitele ve skupině
body_minule = None for poradi, v in zip(sloupec_s_poradim(vysledky), vysledky):
v.poradi = poradi
for vi in range(len(vysledky)): v.resitel.rocnik = v.resitel.rocnik(context['rocnik'])
v = vysledky[vi]
rv = RadekVysledkovky()
rv.resitel = v.resitel
verejne_vysl_odjakziva = VysledkyKCisluOdjakziva.objects.filter(cislo__verejna_vysledkovka = True).filter(cislo__rocnik = context['rocnik']).filter(cislo = cisla_v_rocniku[0].cislo) 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) v.body_odjakziva = verejne_vysl_odjakziva.filter(resitel = v.resitel)[0].body
rv.resitel.rocnik = rv.resitel.rocnik(context['rocnik']) v.titul = v.resitel.get_titul(v.body_odjakziva)
rv.body = []*len(context['rocnik'].verejna_cisla()) v.body_rocnik = v.body
v.body_cisla = []
#pokud pro dany rok a cislo nema resitel vysledky, ma defaultne 0 #pokud pro dany rok a cislo nema resitel vysledky, ma defaultne 0
for cis in context['rocnik'].verejna_cisla(): for cis in context['rocnik'].verejna_cisla():
if cis.verejna_vysledkovka: if cis.verejna_vysledkovka:
print cis body_za_cislo = VysledkyZaCislo.objects.filter(cislo__rocnik = context['rocnik']).filter(cislo = cis).filter(resitel = v.resitel)
body_za_cislo = VysledkyZaCislo.objects.filter(cislo__rocnik = context['rocnik']).filter(cislo = cis).filter(resitel = rv.resitel)
#seznam vysledku se spravnym rocnikem a cislem pro resitele #seznam vysledku se spravnym rocnikem a cislem pro resitele
#zobrazim jen je-li vysledkovka verejna #zobrazim jen je-li vysledkovka verejna
if body_za_cislo: 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 #neprazdne vysledky by mely obsahovat prave jeden vysledek
else: else:
rv.body.append(0) v.body_cisla.append(0)
#resitel nema za cislo body #resitel nema za cislo body
rv.poradi = ''
#defaultni poradi je prazdne - kvuli sdilenym mistum vysledkovka.append(v)
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)
context['vysledkovka'] = vysledkovka context['vysledkovka'] = vysledkovka
return context return context
@ -188,6 +178,7 @@ class CisloView(generic.DetailView):
{'verbose_name': queryset.model._meta.verbose_name}) {'verbose_name': queryset.model._meta.verbose_name})
return obj return obj
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)
@ -208,60 +199,28 @@ class CisloView(generic.DetailView):
#umoznuje zjistit index podle id problemu #umoznuje zjistit index podle id problemu
vysledky_resitele = {} vysledky_resitele = {}
stejne_body = {}
konec_rozmezi = {}
vysledkovka = [] vysledkovka = []
posledni_body = 100000
predchozi_poradi = None # doplníme některé údaje do řádků výsledkovky pro řešitele ve skupině
body_minule = None for poradi, v in zip(sloupec_s_poradim(vysledky), vysledky):
v.poradi = poradi
for vi in range(len(vysledky)): v.body_celkem_rocnik = v.body
v = vysledky[vi] v.body_celkem_odjakziva = VysledkyKCisluOdjakziva.objects.get(resitel=v.resitel, cislo=context['cislo']).body
tv = RadekVysledkovky() v.body_ulohy = [0] * len(problemy)
tv.resitel = v.resitel v.titul = v.resitel.get_titul(v.body_celkem_odjakziva)
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
body_cislo_q = VysledkyZaCislo.objects.filter(resitel=v.resitel, cislo=context['cislo']) 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 v.body_cislo = body_cislo_q[0].body if body_cislo_q 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)
for r in reseni: vysledkovka.append(v)
vysledky_resitele[r.resitel.id].body[problem_index[r.problem.id]] = r.body
# 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['vysledkovka'] = vysledkovka
context['problemy'] = problemy context['problemy'] = problemy
context['v_cisle_zadane'] = v_cisle_zadane context['v_cisle_zadane'] = v_cisle_zadane

Loading…
Cancel
Save