@ -39,6 +39,7 @@ import traceback
import sys
import sys
import csv
import csv
import logging
import logging
import time
def verejna_temata ( rocnik ) :
def verejna_temata ( rocnik ) :
@ -536,26 +537,26 @@ def body_resitelu_odjakziva(rocnik, resitele):
# Body za posledních 10 let je dobrá aproximace pro naše potřeby (výsledkovka
# Body za posledních 10 let je dobrá aproximace pro naše potřeby (výsledkovka
# s aktivními řešiteli)
# s aktivními řešiteli)
body_pred_roky = [ ]
#body_pred_roky = [ ]
rok = rocnik . prvni_rok
#rok = rocnik. prvni_rok
rocniky = Rocnik . objects . filter ( prvni_rok__gt = rok - 11 )
#rocniky = Rocnik.objects.filter(prvni_rok__gt=rok-11 )
for roc in rocniky :
#for roc in rocniky:
body_pred_roky . append ( body_resitelu_za_rocnik ( roc , resitele ) )
# body_pred_roky.append(body_resitelu_za_rocnik(roc, resitele) )
#
for r in resitele :
#for r in resitele :
for i in range ( 0 , 10 ) :
# for i in range(0,10) :
body_odjakziva [ str ( r . id ) ] + = body_pred_roky [ i ] [ str ( r . id ) ]
# body_odjakziva[str(r.id)] += body_pred_roky[i][str(r.id) ]
# Nasledující řešení je sice správné, ale moc pomalé:
# Nasledující řešení je sice správné, ale moc pomalé:
# (důsledek toho, že dotazy na joinování databázových tabulek jsou kvadratické)
# (důsledek toho, že dotazy na joinování databázových tabulek jsou kvadratické)
# for res in Reseni.objects.prefetch_related('resitele', 'hodnoceni_set').all() :
for res in Reseni . objects . prefetch_related ( ' resitele ' , ' hodnoceni_set ' ) . all ( ) :
# for r in res.resitele.all() :
for r in res . resitele . all ( ) :
# # daný řešitel nemusí být v naší podmnožině
# daný řešitel nemusí být v naší podmnožině
# if r not in resitele: continue
if r not in resitele : continue
#
# for hodn in res.hodnoceni_set.all() :
for hodn in res . hodnoceni_set . all ( ) :
# pricti_body(body_odjakziva, r, hodn.body )
pricti_body ( body_odjakziva , r , hodn . body )
return body_odjakziva
return body_odjakziva
# vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník
# vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník
@ -566,24 +567,28 @@ def body_resitelu_za_rocnik(rocnik, aktivni_resitele):
body_za_rocnik [ str ( ar . id ) ] = 0
body_za_rocnik [ str ( ar . id ) ] = 0
# spočítáme body řešitelům přes všechna řešení s hodnocením v daném ročníku
# spočítáme body řešitelům přes všechna řešení s hodnocením v daném ročníku
print ( " Před dotazem: {} " . format ( time . time ( ) ) )
reseni = Reseni . objects . prefetch_related ( ' resitele ' , ' hodnoceni_set ' ) . filter ( hodnoceni__cislo_body__rocnik = rocnik )
reseni = Reseni . objects . prefetch_related ( ' resitele ' , ' hodnoceni_set ' ) . filter ( hodnoceni__cislo_body__rocnik = rocnik )
print ( " Po dotazu: {} " . format ( time . time ( ) ) )
for res in reseni :
for res in reseni :
for resitel in res . resitele . all ( ) :
for resitel in res . resitele . all ( ) :
for hodn in res . hodnoceni_set . all ( ) :
for hodn in res . hodnoceni_set . all ( ) :
pricti_body ( body_za_rocnik , resitel , hodn . body )
pricti_body ( body_za_rocnik , resitel , hodn . body )
print ( " Po for-cyklu: {} " . format ( time . time ( ) ) )
return body_za_rocnik
return body_za_rocnik
class RadekVysledkovkyRocniku ( object ) :
class RadekVysledkovkyRocniku ( object ) :
""" Obsahuje věci, které se hodí vědět při konstruování výsledkovky.
""" Obsahuje věci, které se hodí vědět při konstruování výsledkovky.
Umožňuje snazší práci v templatu ( lepší , než seznam ) . """
Umožňuje snazší práci v templatu ( lepší , než seznam ) . """
def __init__ ( self , poradi , resitel , body_cisla_sezn , body_rocnik , body_odjakziva ) :
def __init__ ( self , poradi , resitel , body_cisla_sezn , body_rocnik , body_odjakziva , rok ) :
self . poradi = poradi
self . poradi = poradi
self . resitel = resitel
self . resitel = resitel
self . rocnik_resitele = resitel . rocnik ( rok )
self . body_rocnik = body_rocnik
self . body_rocnik = body_rocnik
self . body_celkem_odjakziva = body_odjakziva
self . body_celkem_odjakziva = body_odjakziva
self . body_cisla_sezn = body_cisla_sezn
self . body_cisla_sezn = body_cisla_sezn
s elf. titul = resitel . get_titul ( body_odjakziva )
elf . titul = resitel . get_titul ( body_odjakziva )
def vysledkovka_rocniku ( rocnik , jen_verejne = True ) :
def vysledkovka_rocniku ( rocnik , jen_verejne = True ) :
""" Přebírá ročník (např. context[ " rocnik " ]) a vrací výsledkovou listinu ve
""" Přebírá ročník (např. context[ " rocnik " ]) a vrací výsledkovou listinu ve
@ -632,7 +637,8 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True):
Resitel . objects . get ( id = ar_id ) , # řešitel (z id)
Resitel . objects . get ( id = ar_id ) , # řešitel (z id)
body_cisla_sezn , # seznam bodů za čísla
body_cisla_sezn , # seznam bodů za čísla
setrizene_body [ i ] , # body za ročník (spočítané výše s pořadím)
setrizene_body [ i ] , # body za ročník (spočítané výše s pořadím)
resitel_odjakzivabody_slov [ ar_id ] ) # body odjakživa
resitel_odjakzivabody_slov [ ar_id ] , # body odjakživa
rocnik ) # ročník semináře pro získání ročníku řešitele
print ( " {} : číslobody - {} , ročníkbody - {} , "
print ( " {} : číslobody - {} , ročníkbody - {} , "
" odjakživabody - {} " . format ( radek . resitel , radek . body_cisla_sezn ,
" odjakživabody - {} " . format ( radek . resitel , radek . body_cisla_sezn ,
radek . body_rocnik , radek . body_celkem_odjakziva ) )
radek . body_rocnik , radek . body_celkem_odjakziva ) )
@ -643,59 +649,6 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True):
return radky_vysledkovky
return radky_vysledkovky
#vyberu vsechny vysledky z rocniku
# cisla_v_rocniku = VysledkyKCisluZaRocnik.objects.filter(cislo__rocnik=rocnik).order_by('cislo')
# if jen_verejne:
# cisla_v_rocniku = cisla_v_rocniku.filter(cislo__verejna_vysledkovka=True)
#
# #pokud žádné nejsou, výsledkovka se nezobrazí
# if not cisla_v_rocniku:
# return None
#
# #vybere vsechny vysledky z posledniho (verejneho) cisla a setridi sestupne dle bodu
# vysledky = list(cisla_v_rocniku.filter(cislo = cisla_v_rocniku[0].poradi).order_by('-body', 'resitel__prijmeni', 'resitel__jmeno').select_related('resitel'))
#
# class Vysledkovka:
# def __init__(self):
# self.rocnik = rocnik.rocnik
# self.radky = []
# self.cisla = []
#
# vysledkovka = Vysledkovka()
# vysledkovka.cisla = (rocnik.verejne_vysledkovky_cisla() if jen_verejne else rocnik.cisla.all().order_by('cislo'))
#
# # 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(rocnik)
#
# verejne_vysl_odjakziva = VysledkyKCisluOdjakziva.objects.filter(cislo__rocnik=rocnik, cislo=cisla_v_rocniku[0].poradi)
# if jen_verejne:
# verejne_vysl_odjakziva = verejne_vysl_odjakziva.filter(cislo__verejna_vysledkovka=True)
#
# 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 vysledkovka.cisla:
# if not jen_verejne or cis.verejna_vysledkovka:
# #seznam vysledku se spravnym rocnikem a cislem pro resitele
# #zobrazim jen je-li vysledkovka verejna
# body_za_cislo = VysledkyZaCislo.objects.filter(cislo__rocnik=rocnik).filter(cislo = cis).filter(resitel = v.resitel)
# if body_za_cislo:
# #neprazdne vysledky by mely obsahovat prave jeden vysledek
# v.body_cisla.append(body_za_cislo[0].body)
# else:
# #resitel nema za cislo body
# v.body_cisla.append(0)
#
# vysledkovka.radky.append(v)
#
# return vysledkovka
class RocnikView ( generic . DetailView ) :
class RocnikView ( generic . DetailView ) :
model = Rocnik
model = Rocnik
template_name = ' seminar/archiv/rocnik.html '
template_name = ' seminar/archiv/rocnik.html '
@ -723,7 +676,8 @@ class RocnikView(generic.DetailView):
context [ ' cisla_s_neverejnymi ' ] = cisla_rocniku ( context [ " rocnik " ] , jen_verejne = False )
context [ ' cisla_s_neverejnymi ' ] = cisla_rocniku ( context [ " rocnik " ] , jen_verejne = False )
context [ ' cisla ' ] = cisla_rocniku ( context [ " rocnik " ] )
context [ ' cisla ' ] = cisla_rocniku ( context [ " rocnik " ] )
context [ ' radky_vysledkovky ' ] = vysledkovka_rocniku ( context [ " rocnik " ] )
context [ ' radky_vysledkovky ' ] = vysledkovka_rocniku ( context [ " rocnik " ] )
context [ ' radky_vysledkovky_s_neverejnymi ' ] = vysledkovka_rocniku ( context [ " rocnik " ] , jen_verejne = False )
context [ ' radky_vysledkovky_s_neverejnymi ' ] = vysledkovka_rocniku (
context [ " rocnik " ] , jen_verejne = False )
context [ ' hlavni_problemy_v_rocniku ' ] = hlavni_problemy_rocniku ( context [ " rocnik " ] )
context [ ' hlavni_problemy_v_rocniku ' ] = hlavni_problemy_rocniku ( context [ " rocnik " ] )
context [ ' hlavni_problemy_v_rocniku_s_neverejnymi ' ] = hlavni_problemy_rocniku ( context [ " rocnik " ] , jen_verejne = False )
context [ ' hlavni_problemy_v_rocniku_s_neverejnymi ' ] = hlavni_problemy_rocniku ( context [ " rocnik " ] , jen_verejne = False )
@ -754,8 +708,9 @@ class RadekVysledkovkyCisla(object):
Umožňuje snazší práci v templatu ( lepší , než seznam ) . """
Umožňuje snazší práci v templatu ( lepší , než seznam ) . """
def __init__ ( self , poradi , resitel , body_problemy_sezn ,
def __init__ ( self , poradi , resitel , body_problemy_sezn ,
body_cislo , body_rocnik , body_odjakziva ) :
body_cislo , body_rocnik , body_odjakziva , rok ) :
self . resitel = resitel
self . resitel = resitel
self . rocnik_resitele = resitel . rocnik ( rok )
self . body_cislo = body_cislo
self . body_cislo = body_cislo
self . body_rocnik = body_rocnik
self . body_rocnik = body_rocnik
self . body_celkem_odjakziva = body_odjakziva
self . body_celkem_odjakziva = body_odjakziva
@ -827,7 +782,6 @@ def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None):
pricti_body ( nadproblem_slovnik , resitel , body )
pricti_body ( nadproblem_slovnik , resitel , body )
return hlavni_problemy_slovnik , cislobody
return hlavni_problemy_slovnik , cislobody
def vysledkovka_cisla ( cislo , context = None ) :
def vysledkovka_cisla ( cislo , context = None ) :
if context is None :
if context is None :
context = { }
context = { }
@ -874,14 +828,14 @@ def vysledkovka_cisla(cislo, context=None):
problemy , # seznam bodů za hlavní problémy čísla
problemy , # seznam bodů za hlavní problémy čísla
cislobody [ ar_id ] , # body za číslo
cislobody [ ar_id ] , # body za číslo
setrizeni_resitele_body [ i ] , # body za ročník (spočítané výše s pořadím)
setrizeni_resitele_body [ i ] , # body za ročník (spočítané výše s pořadím)
resitel_odjakzivabody_slov [ ar_id ] ) # body odjakživa
resitel_odjakzivabody_slov [ ar_id ] , # body odjakživa
cislo . rocnik ) # ročník semináře pro zjištění ročníku řešitele
print ( " {} : body za problémy - {} , číslobody - {} , ročníkbody - {} , odjakživabody - {} " . format ( radek . resitel ,
print ( " {} : body za problémy - {} , číslobody - {} , ročníkbody - {} , odjakživabody - {} " . format ( radek . resitel ,
radek . body_problemy_sezn , radek . body_cislo , radek . body_rocnik , radek . body_celkem_odjakziva ) )
radek . body_problemy_sezn , radek . body_cislo , radek . body_rocnik , radek . body_celkem_odjakziva ) )
radky_vysledkovky . append ( radek )
radky_vysledkovky . append ( radek )
print ( " Přikládám {} -tý řádek. " . format ( i ) )
print ( " Přikládám {} -tý řádek. " . format ( i ) )
i + = 1
i + = 1
print ( " Následuje předávání do kontextu. " )
# vytahané informace předáváme do kontextu
# vytahané informace předáváme do kontextu
context [ ' cislo ' ] = cislo
context [ ' cislo ' ] = cislo
context [ ' radky_vysledkovky ' ] = radky_vysledkovky
context [ ' radky_vysledkovky ' ] = radky_vysledkovky
@ -917,43 +871,6 @@ class CisloView(generic.DetailView):
# vrátíme context (aktuálně obsahuje jen věci ohledně výsledkovky
# vrátíme context (aktuálně obsahuje jen věci ohledně výsledkovky
return vysledkovka_cisla ( cislo , context )
return vysledkovka_cisla ( cislo , context )
# problemy = sorted(set(r.problem for r in reseni), key=lambda x:(poradi_typu[x.typ], x.kod_v_rocniku()))
# #setridi problemy podle typu a poradi zadani
# problem_index = {}
# for i in range(len(problemy)):
# #umoznuje zjistit index podle id problemu
#
# vysledky_resitele = {}
# vysledkovka = []
#
# # 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.resitel.rocnik = v.resitel.rocnik(v.cislo.rocnik)
#
# # je tady '', aby se nezobrazovala 0, pokud se řešitel o řešení úlohy ani nepokusil
# v.body_ulohy = [''] * len(problemy)
#
# v.titul = v.resitel.get_titul(v.body_celkem_odjakziva)
#
# body_cislo_q = VysledkyZaCislo.objects.filter(resitel=v.resitel, cislo=context['cislo'])
# v.body_cislo = body_cislo_q[0].body if body_cislo_q else 0
#
# 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
# context['resene_problemy'] = resene_problemy
class ArchivTemataView ( generic . ListView ) :
class ArchivTemataView ( generic . ListView ) :
model = Problem
model = Problem
@ -962,19 +879,18 @@ class ArchivTemataView(generic.ListView):
### Generovani vysledkovky
### Generovani vysledkovky
#class CisloVysledkovkaView(CisloView):i
class CisloVysledkovkaView ( CisloView ) :
# poradi | titul. jmeno prijmeni | ulohy | za cislo | celkem | odjakziva
" View vytvořené pro stránku zobrazující výsledkovku čísla v TeXu. "
#
#
model = Cislo
#
template_name = ' seminar/archiv/cislo_vysledkovka.tex '
# model = Cislo
#content_type = 'application/x-tex; charset=UTF8'
# template_name = 'seminar/archiv/cislo_vysledkovka.tex'
#umozni rovnou stahnout TeXovsky dokument
# #content_type = 'application/x-tex; charset=UTF8'
content_type = ' text/plain; charset=UTF8 '
# #umozni rovnou stahnout TeXovsky dokument
#vypise na stranku textovy obsah vyTeXane vysledkovky k okopirovani
# content_type = 'text/plain; charset=UTF8'
# #vypise na stranku textovy obsah vyTeXane vysledkovky k okopirovani
#
class RocnikVysledkovkaView ( RocnikView ) :
class RocnikVysledkovkaView ( RocnikView ) :
" View vytvořené pro stránku zobrazující výsledkovku ročníku v TeXu. "
model = Rocnik
model = Rocnik
template_name = ' seminar/archiv/rocnik_vysledkovka.tex '
template_name = ' seminar/archiv/rocnik_vysledkovka.tex '
#content_type = 'application/x-tex; charset=UTF8'
#content_type = 'application/x-tex; charset=UTF8'