@ -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 :
r v. 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 :
r v. 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,59 +199,27 @@ 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