@ -26,49 +26,50 @@ class SouhrnReseni:
body : float
body : float
class TabulkaOdevzdanychReseniView ( Template View) :
class TabulkaOdevzdanychReseniView ( List View) :
template_name = ' seminar/odevzdavatko/tabulka.html '
template_name = ' seminar/odevzdavatko/tabulka.html '
model = m . Hodnoceni
def get_context_data ( self , * args , * * kwargs ) :
akt_rocnik = m . Nastaveni . get_solo ( ) . aktualni_rocnik # .get_solo() vrátí tu jedinou instanci, asi...
akt_rocnik = m . Nastaveni . get_solo ( ) . aktualni_rocnik # .get_solo() vrátí tu jedinou instanci, asi...
resitele = resi_v_rocniku ( akt_rocnik )
resitele = resi_v_rocniku ( akt_rocnik )
zadane_problemy = m . Problem . objects . filter ( stav = m . Problem . STAV_ZADANY )
# NOTE: Protože řešení odkazuje přímo na Problém a QuerySet na Hodnocení je nepolymorfní, musíme porovnávat taky s nepolymorfními Problémy.
zadane_problemy = m . Problem . objects . filter ( stav = m . Problem . STAV_ZADANY ) . non_polymorphic ( )
ctx = dict ( )
ctx [ ' problemy ' ] = zadane_problemy
def get_queryset ( self ) :
ctx [ ' resitele ' ] = resitele
qs = super ( ) . get_queryset ( )
qs = qs . filter ( problem__in = self . zadane_problemy ) . select_related ( ' reseni ' , ' problem ' ) . prefetch_related ( ' reseni__resitele__osoba ' )
# Zkonstruujeme jednotlivé řádky
return qs
# Řádky budou indexované řešiteli a budou obsahovat SouhrnyReseni
# TODO: Tohle se asi nějak dá urychlit / zpřehlednit...
def get_context_data ( self , * args , * * kwargs ) :
ctx [ ' radky ' ] = dict ( )
ctx = super ( ) . get_context_data ( * args , * * kwargs )
for resitel in resitele :
ctx [ ' problemy ' ] = self . zadane_problemy
ctx [ ' radky ' ] [ resitel ] = [ ]
ctx [ ' resitele ' ] = self . resitele
for problem in zadane_problemy :
tabulka = dict ( )
reseni_k_tomuto_problemu = m . Reseni . objects . filter (
resitele__in = [ resitel ] , # Snad funguje i takhle
def pridej_reseni ( problem , resitel , body , cas ) :
hodnoceni__problem__in = [ problem ] , # ditto
if problem not in tabulka :
) . order_by ( ' -cas_doruceni ' )
tabulka [ problem ] = dict ( )
pocet_reseni = reseni_k_tomuto_problemu . count ( )
if resitel not in tabulka [ problem ] :
if pocet_reseni > 0 :
tabulka [ problem ] [ resitel ] = SouhrnReseni ( pocet_reseni = 1 , posledni_odevzdani = cas , body = body )
nejnovejsi = reseni_k_tomuto_problemu . first ( ) . cas_doruceni
pocet_bodu = max (
[ h . body for h in m . Hodnoceni . objects . filter (
reseni__in = reseni_k_tomuto_problemu ,
problem = problem ,
)
]
)
else :
else :
nejnovejsi = None
tabulka [ problem ] [ resitel ] . posledni_odevzdani = max ( tabulka [ problem ] [ resitel ] . posledni_odevzdani , cas )
pocet_bodu = None
tabulka [ problem ] [ resitel ] . body = max ( tabulka [ problem ] [ resitel ] . body , body )
ctx [ ' radky ' ] [ resitel ] . append (
tabulka [ problem ] [ resitel ] . pocet_reseni + = 1
SouhrnReseni (
pocet_reseni = pocet_reseni ,
for hodnoceni in self . get_queryset ( ) :
posledni_odevzdani = nejnovejsi ,
for resitel in hodnoceni . reseni . resitele . all ( ) :
body = pocet_bodu ,
pridej_reseni ( hodnoceni . problem , resitel , hodnoceni . body , hodnoceni . reseni . cas_doruceni )
)
)
hodnoty = [ ]
for resitel in self . resitele :
resiteluv_radek = [ ]
for problem in self . zadane_problemy :
if problem in tabulka and resitel in tabulka [ problem ] :
resiteluv_radek . append ( tabulka [ problem ] [ resitel ] )
else :
resiteluv_radek . append ( None )
hodnoty . append ( resiteluv_radek )
ctx [ ' radky ' ] = list ( zip ( self . resitele , hodnoty ) )
return ctx
return ctx
class ReseniProblemuView ( ListView ) :
class ReseniProblemuView ( ListView ) :