Dokončena oprava výsledkovek čísla a ročníku - generování TeXu.
This commit is contained in:
parent
03696d79ab
commit
c499d823f9
5 changed files with 57 additions and 140 deletions
|
@ -1,9 +1,9 @@
|
|||
\setlength{\tabcolsep}{3pt}
|
||||
\begin{longtable}{|r|l|c|r|{% for p in problemy %}c@{\hskip.5em}{% endfor %}|r|r|}\hline
|
||||
& & & & \multicolumn{ {{ problemy|length}} }{c|}{\textbf{Úlohy}} & & \\\textbf{Poř.}& \textbf{Jméno}& \textbf{R.}& \raisebox{0.7mm}{$\sum_{-1}$}& {% for p in problemy %}{% if p.typ == "uloha" %}\textbf{r{{p.kod}}}&{% elif p.typ == "tema" %}\textbf{t{{p.kod}}}&{% else %}\textbf{ {{p.kod}} }&{% endif %}{% endfor %}\raisebox{0.7mm}{$\sum_0$}&\raisebox{0.7mm}{$\sum_1$}\\\hline
|
||||
& & & & \multicolumn{ {{ problemy|length}} }{c|}{\textbf{Úlohy}} & & \\\textbf{Poř.}& \textbf{Jméno}& \textbf{R.}& \raisebox{0.7mm}{$\sum_{-1}$}& {% for p in problemy %}\textbf{ {{ p.kod_v_rocniku }} }&{% endfor %}\raisebox{0.7mm}{$\sum_0$}&\raisebox{0.7mm}{$\sum_1$}\\\hline
|
||||
\endhead
|
||||
\hline
|
||||
\endfoot
|
||||
{% for rv in vysledkovka %}{{rv.poradi}}&{% if rv.titul %}\titul{ {{ rv.titul}}}{% endif %}{{rv.resitel.inicial_krestni}} {{rv.resitel.prijmeni}}&{{rv.resitel.rocnik|default:""}}&{{rv.body_celkem_odjakziva}}&{% for b in rv.body_ulohy %}{{b}}&{% endfor %}{{rv.body_cislo}}&{{rv.body_celkem_rocnik|default:0}}\\
|
||||
{% for rv in radky_vysledkovky %}{{rv.poradi}}&{% if rv.titul %}\titul{ {{ rv.titul}}}{% endif %}{{rv.resitel.osoba.jmeno|slice:":1"}}. {{rv.resitel.osoba.prijmeni}}&{{rv.rocnik_resitele|default:""}}&{{rv.body_celkem_odjakziva}}&{% for b in rv.body_problemy_sezn %}{{b}}&{% endfor %}{{rv.body_cislo}}&{{rv.body_rocnik|default:0}}\\
|
||||
{% endfor %}
|
||||
\end{longtable}
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
{% with lb="{" %}
|
||||
{% with rb="}" %}
|
||||
\setlength{\tabcolsep}{3pt}
|
||||
\begin{longtable}{|r|l|c|r|{% for cislo in vysledkovka.cisla %}c{% if not forloop.last %}@{\hskip.5em}{% endif %}{% endfor %}|r|}
|
||||
\hline
|
||||
& & & & \multicolumn{{ lb }}{{ vysledkovka.cisla|length }}}{c|}{\textbf{Číslo}} & \\\textbf{Poř.} & \textbf{Jméno} & \textbf{R.} & \raisebox{0.7mm}{$\sum_{-1}$} & {% for cislo in vysledkovka.cisla %}\textbf{{ lb }}{{ cislo.cislo }}{{ rb }} & {% endfor %}\raisebox{0.7mm}{$\sum_1$} \\\hline
|
||||
\begin{longtable}{|r|l|c|r|{% for cislo in cisla %}c{% if not forloop.last %}@{\hskip.5em}{% endif %}{% endfor %}|r|}\hline
|
||||
& & & & \multicolumn{{ lb }}{{ cisla|length }}}{c|}{\textbf{Číslo}} & \\\textbf{Poř.} & \textbf{Jméno} & \textbf{R.} & \raisebox{0.7mm}{$\sum_{-1}$} & {% for cislo in cisla %}\textbf{{ lb }}{{ cislo.poradi }}{{ rb }} & {% endfor %}\raisebox{0.7mm}{$\sum_1$} \\\hline
|
||||
\endhead
|
||||
\hline
|
||||
\endfoot
|
||||
{% for rv in radky_vysledkovky %}{{ rv.poradi }} & {% if rv.titul %}\titul{{ lb }}{{ rv.titul }}}~{% endif %}{{ rv.resitel.osoba.jmeno|slice:":1" }}.~{{ rv.resitel.osoba.prijmeni }} & {% if rv.resitel.rocnik %}{{ rv.resitel.rocnik }}.{% endif %} & {{ rv.body_odjakziva }} {% for b in rv.body_cisla_sezn %} & {{ b }}{% endfor %} & {{ rv.body_rocnik }} \\
|
||||
{% for rv in radky_vysledkovky %}{{ rv.poradi }} & {% if rv.titul %}\titul{{ lb }}{{ rv.titul }}}~{% endif %}{{ rv.resitel.osoba.jmeno|slice:":1" }}.~{{ rv.resitel.osoba.prijmeni }} & {% if rv.rocnik_resitele %}{{ rv.rocnik_resitele }}{% endif %} & {{ rv.body_celkem_odjakziva }} {% for b in rv.body_cisla_sezn %} & {{ b }}{% endfor %} & {{ rv.body_rocnik }} \\
|
||||
{% endfor %}\end{longtable}
|
||||
{% endwith %}
|
||||
{% endwith %}
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
{{ rv.titul }}<sup>MM</sup>
|
||||
{% endif %}
|
||||
{{ rv.resitel.osoba.plne_jmeno }}
|
||||
<td class='border-r'>{{ rv.resitel.rocnik }}
|
||||
<td class='border-r'>{{ rv.rocnik_resitele }}
|
||||
<td class='border-r'>{{ rv.body_celkem_odjakziva }}
|
||||
{% for b in rv.body_cisla_sezn %}
|
||||
<td class='border-r'>{{ b }}
|
||||
|
|
|
@ -75,13 +75,15 @@ urlpatterns = [
|
|||
path('aesop-export/index.csv', export.ExportIndexView.as_view(), name='seminar_export_index'),
|
||||
|
||||
# Stranky viditelne pouze pro orgy:
|
||||
#path(
|
||||
# 'rocnik/(?P<rocnik>\d+)/vysledkovka.tex',
|
||||
# staff_member_required(views.RocnikVysledkovkaView.as_view()),
|
||||
# name='seminar_cislo_vysledkovka'
|
||||
#),
|
||||
#path('cislo/(?P<rocnik>\d+).(?P<cislo>[0-9-]+)/vysledkovka.tex',
|
||||
# staff_member_required(views.CisloVysledkovkaView.as_view()), name='seminar_cislo_vysledkovka'),
|
||||
path(
|
||||
'rocnik/<int:rocnik>/vysledkovka.tex',
|
||||
staff_member_required(views.RocnikVysledkovkaView.as_view()),
|
||||
name='seminar_rocnik_vysledkovka'
|
||||
),
|
||||
path('cislo/<int:rocnik>.<int:cislo>/vysledkovka.tex',
|
||||
staff_member_required(views.CisloVysledkovkaView.as_view()),
|
||||
name='seminar_cislo_vysledkovka'
|
||||
),
|
||||
path('cislo/<int:rocnik>.<int:cislo>/obalky.pdf',
|
||||
staff_member_required(views.cisloObalkyView), name='seminar_cislo_obalky'),
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@ import traceback
|
|||
import sys
|
||||
import csv
|
||||
import logging
|
||||
import time
|
||||
|
||||
|
||||
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
|
||||
# s aktivními řešiteli)
|
||||
|
||||
body_pred_roky = []
|
||||
rok = rocnik.prvni_rok
|
||||
rocniky = Rocnik.objects.filter(prvni_rok__gt=rok-11)
|
||||
for roc in rocniky:
|
||||
body_pred_roky.append(body_resitelu_za_rocnik(roc, resitele))
|
||||
|
||||
for r in resitele:
|
||||
for i in range(0,10):
|
||||
body_odjakziva[str(r.id)] += body_pred_roky[i][str(r.id)]
|
||||
#body_pred_roky = []
|
||||
#rok = rocnik.prvni_rok
|
||||
#rocniky = Rocnik.objects.filter(prvni_rok__gt=rok-11)
|
||||
#for roc in rocniky:
|
||||
# body_pred_roky.append(body_resitelu_za_rocnik(roc, resitele))
|
||||
#
|
||||
#for r in resitele:
|
||||
# for i in range(0,10):
|
||||
# body_odjakziva[str(r.id)] += body_pred_roky[i][str(r.id)]
|
||||
|
||||
|
||||
# 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é)
|
||||
# for res in Reseni.objects.prefetch_related('resitele', 'hodnoceni_set').all():
|
||||
# for r in res.resitele.all():
|
||||
# # daný řešitel nemusí být v naší podmnožině
|
||||
# if r not in resitele: continue
|
||||
#
|
||||
# for hodn in res.hodnoceni_set.all():
|
||||
# pricti_body(body_odjakziva, r, hodn.body)
|
||||
for res in Reseni.objects.prefetch_related('resitele', 'hodnoceni_set').all():
|
||||
for r in res.resitele.all():
|
||||
# daný řešitel nemusí být v naší podmnožině
|
||||
if r not in resitele: continue
|
||||
|
||||
for hodn in res.hodnoceni_set.all():
|
||||
pricti_body(body_odjakziva, r, hodn.body)
|
||||
return body_odjakziva
|
||||
|
||||
# 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
|
||||
|
||||
# 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)
|
||||
print("Po dotazu:{}".format(time.time()))
|
||||
for res in reseni:
|
||||
for resitel in res.resitele.all():
|
||||
for hodn in res.hodnoceni_set.all():
|
||||
pricti_body(body_za_rocnik, resitel, hodn.body)
|
||||
print("Po for-cyklu:{}".format(time.time()))
|
||||
return body_za_rocnik
|
||||
|
||||
class RadekVysledkovkyRocniku(object):
|
||||
"""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)."""
|
||||
|
||||
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.resitel = resitel
|
||||
self.rocnik_resitele = resitel.rocnik(rok)
|
||||
self.body_rocnik = body_rocnik
|
||||
self.body_celkem_odjakziva = body_odjakziva
|
||||
self.body_cisla_sezn = body_cisla_sezn
|
||||
self.titul = resitel.get_titul(body_odjakziva)
|
||||
elf.titul = resitel.get_titul(body_odjakziva)
|
||||
|
||||
def vysledkovka_rocniku(rocnik, jen_verejne=True):
|
||||
"""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)
|
||||
body_cisla_sezn, # seznam bodů za čísla
|
||||
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 - {},"
|
||||
"odjakživabody - {}".format(radek.resitel, radek.body_cisla_sezn,
|
||||
radek.body_rocnik, radek.body_celkem_odjakziva))
|
||||
|
@ -643,59 +649,6 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True):
|
|||
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):
|
||||
model = Rocnik
|
||||
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'] = cisla_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_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)."""
|
||||
|
||||
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.rocnik_resitele = resitel.rocnik(rok)
|
||||
self.body_cislo = body_cislo
|
||||
self.body_rocnik = body_rocnik
|
||||
self.body_celkem_odjakziva = body_odjakziva
|
||||
|
@ -826,7 +781,6 @@ def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None):
|
|||
pricti_body(cislobody, resitel, body)
|
||||
pricti_body(nadproblem_slovnik, resitel, body)
|
||||
return hlavni_problemy_slovnik, cislobody
|
||||
|
||||
|
||||
def vysledkovka_cisla(cislo, context=None):
|
||||
if context is None:
|
||||
|
@ -874,14 +828,14 @@ def vysledkovka_cisla(cislo, context=None):
|
|||
problemy, # seznam bodů za hlavní problémy čísla
|
||||
cislobody[ar_id], # body za číslo
|
||||
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,
|
||||
radek.body_problemy_sezn, radek.body_cislo, radek.body_rocnik, radek.body_celkem_odjakziva))
|
||||
radky_vysledkovky.append(radek)
|
||||
print("Přikládám {}-tý řádek.".format(i))
|
||||
i += 1
|
||||
|
||||
print("Následuje předávání do kontextu.")
|
||||
# vytahané informace předáváme do kontextu
|
||||
context['cislo'] = cislo
|
||||
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
|
||||
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):
|
||||
model = Problem
|
||||
|
@ -962,19 +879,18 @@ class ArchivTemataView(generic.ListView):
|
|||
|
||||
### Generovani vysledkovky
|
||||
|
||||
#class CisloVysledkovkaView(CisloView):i
|
||||
# poradi | titul. jmeno prijmeni | ulohy | za cislo | celkem | odjakziva
|
||||
#
|
||||
#
|
||||
#
|
||||
# model = Cislo
|
||||
# template_name = 'seminar/archiv/cislo_vysledkovka.tex'
|
||||
# #content_type = 'application/x-tex; charset=UTF8'
|
||||
# #umozni rovnou stahnout TeXovsky dokument
|
||||
# content_type = 'text/plain; charset=UTF8'
|
||||
# #vypise na stranku textovy obsah vyTeXane vysledkovky k okopirovani
|
||||
#
|
||||
class CisloVysledkovkaView(CisloView):
|
||||
"View vytvořené pro stránku zobrazující výsledkovku čísla v TeXu."
|
||||
|
||||
model = Cislo
|
||||
template_name = 'seminar/archiv/cislo_vysledkovka.tex'
|
||||
#content_type = 'application/x-tex; charset=UTF8'
|
||||
#umozni rovnou stahnout TeXovsky dokument
|
||||
content_type = 'text/plain; charset=UTF8'
|
||||
#vypise na stranku textovy obsah vyTeXane vysledkovky k okopirovani
|
||||
|
||||
class RocnikVysledkovkaView(RocnikView):
|
||||
"View vytvořené pro stránku zobrazující výsledkovku ročníku v TeXu."
|
||||
model = Rocnik
|
||||
template_name = 'seminar/archiv/rocnik_vysledkovka.tex'
|
||||
#content_type = 'application/x-tex; charset=UTF8'
|
||||
|
|
Loading…
Reference in a new issue