Výsledkovky do TeXu (náchylné na chyby v „nemožných“ případech jako, že ročník má jen 1 číslo, číslo nemá deadline, apod.)
This commit is contained in:
parent
0069382f51
commit
750d02f2a7
5 changed files with 92 additions and 4 deletions
|
@ -220,7 +220,7 @@ class Cislo(SeminarModelBase):
|
||||||
|
|
||||||
def relativni_v_rocniku(self, rel_index):
|
def relativni_v_rocniku(self, rel_index):
|
||||||
"Číslo o `index` dále v ročníku. None pokud neexistuje."
|
"Číslo o `index` dále v ročníku. None pokud neexistuje."
|
||||||
cs = self.rocnik.cisla.order_by('cislo').all()
|
cs = self.rocnik.cisla.order_by('poradi').all()
|
||||||
i = list(cs).index(self) + rel_index
|
i = list(cs).index(self) + rel_index
|
||||||
if (i < 0) or (i >= len(cs)):
|
if (i < 0) or (i >= len(cs)):
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -120,7 +120,8 @@
|
||||||
{% if user.je_org %}
|
{% if user.je_org %}
|
||||||
<div class='mam-org-only'>
|
<div class='mam-org-only'>
|
||||||
<p><a href='vysledkovka.tex' download>Výsledkovka ročníku (LaTeX, včetně neveřejných)</a></p>
|
<p><a href='vysledkovka.tex' download>Výsledkovka ročníku (LaTeX, včetně neveřejných)</a></p>
|
||||||
<a href="tituly.tex" download>Tituly (TeX, do konce ročníku = pro poslední číslo)</a>
|
<p><a href="tituly.tex" download>Tituly (TeX, do konce ročníku = pro poslední číslo)</a></p>
|
||||||
|
<p><a href="posledni_vysledkovka.tex" download>Výsledkovka posledního čísla</a></p>
|
||||||
{# FIXME: Sice to sem asi nepatří sémanticky, ale bylo to nejjednodušší… #}
|
{# FIXME: Sice to sem asi nepatří sémanticky, ale bylo to nejjednodušší… #}
|
||||||
<p><a href='{% url 'seminar_rocnik_resitele_csv' rocnik=rocnik.rocnik %}' download>CSV export řešitelů</a></p>
|
<p><a href='{% url 'seminar_rocnik_resitele_csv' rocnik=rocnik.rocnik %}' download>CSV export řešitelů</a></p>
|
||||||
<h2>Výsledková listina včetně neveřejných bodů</h2>
|
<h2>Výsledková listina včetně neveřejných bodů</h2>
|
||||||
|
|
|
@ -77,6 +77,11 @@ urlpatterns = [
|
||||||
org_required(views.TitulyViewRocnik),
|
org_required(views.TitulyViewRocnik),
|
||||||
name='seminar_rocnik_titul'
|
name='seminar_rocnik_titul'
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
'rocnik/<int:rocnik>/posledni_vysledkovka.tex',
|
||||||
|
org_required(views.PosledniCisloVysledkovkaView.as_view()),
|
||||||
|
name='seminar_rocnik_posledni_vysledkovka'
|
||||||
|
),
|
||||||
path(
|
path(
|
||||||
'cislo/<int:rocnik>.<str:cislo>/vysledkovka.tex',
|
'cislo/<int:rocnik>.<str:cislo>/vysledkovka.tex',
|
||||||
org_required(views.CisloVysledkovkaView.as_view()),
|
org_required(views.CisloVysledkovkaView.as_view()),
|
||||||
|
|
|
@ -20,7 +20,7 @@ from treenode import treelib
|
||||||
import treenode.templatetags as tnltt
|
import treenode.templatetags as tnltt
|
||||||
import treenode.serializers as vr
|
import treenode.serializers as vr
|
||||||
from vysledkovky.utils import body_resitelu, VysledkovkaCisla, \
|
from vysledkovky.utils import body_resitelu, VysledkovkaCisla, \
|
||||||
VysledkovkaRocniku
|
VysledkovkaRocniku, VysledkovkaDoTeXu
|
||||||
|
|
||||||
from datetime import date, datetime
|
from datetime import date, datetime
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
@ -438,7 +438,6 @@ class CisloView(generic.DetailView):
|
||||||
|
|
||||||
cislo = context['cislo']
|
cislo = context['cislo']
|
||||||
context['prevcislo'] = Cislo.objects.filter((Q(rocnik__lt=self.object.rocnik) | Q(poradi__lt=self.object.poradi))&Q(rocnik__lte=self.object.rocnik)).first()
|
context['prevcislo'] = Cislo.objects.filter((Q(rocnik__lt=self.object.rocnik) | Q(poradi__lt=self.object.poradi))&Q(rocnik__lte=self.object.rocnik)).first()
|
||||||
context['vysledkovka'] = VysledkovkaCisla(cislo, not self.request.user.je_org)
|
|
||||||
|
|
||||||
deadliny = Deadline.objects.filter(cislo=cislo).reverse()
|
deadliny = Deadline.objects.filter(cislo=cislo).reverse()
|
||||||
deadliny_s_vysledkovkami = []
|
deadliny_s_vysledkovkami = []
|
||||||
|
@ -506,6 +505,60 @@ class CisloVysledkovkaView(CisloView):
|
||||||
content_type = 'text/plain; charset=UTF8'
|
content_type = 'text/plain; charset=UTF8'
|
||||||
#vypise na stranku textovy obsah vyTeXane vysledkovky k okopirovani
|
#vypise na stranku textovy obsah vyTeXane vysledkovky k okopirovani
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super(CisloVysledkovkaView, self).get_context_data()
|
||||||
|
cislo = context['cislo']
|
||||||
|
|
||||||
|
cislopred = cislo.predchozi()
|
||||||
|
if cislopred is not None:
|
||||||
|
context['vysledkovka'] = VysledkovkaDoTeXu(
|
||||||
|
cislo,
|
||||||
|
od_vyjma=cislopred.zlomovy_deadline_pro_papirove_cislo(),
|
||||||
|
do_vcetne=cislo.zlomovy_deadline_pro_papirove_cislo(),
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
context['vysledkovka'] = VysledkovkaCisla(
|
||||||
|
cislo,
|
||||||
|
jen_verejne=False,
|
||||||
|
do_deadlinu=cislo.zlomovy_deadline_pro_papirove_cislo(),
|
||||||
|
)
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
# Podle předchozího
|
||||||
|
class PosledniCisloVysledkovkaView(generic.DetailView):
|
||||||
|
"""View vytvořené pro zobrazení výsledkovky posledního čísla v TeXu."""
|
||||||
|
|
||||||
|
model = Rocnik
|
||||||
|
template_name = 'seminar/archiv/cislo_vysledkovka.tex'
|
||||||
|
content_type = 'text/plain; charset=UTF8'
|
||||||
|
|
||||||
|
def get_object(self, queryset=None):
|
||||||
|
if queryset is None:
|
||||||
|
queryset = self.get_queryset()
|
||||||
|
rocnik_arg = self.kwargs.get('rocnik')
|
||||||
|
queryset = queryset.filter(rocnik=rocnik_arg)
|
||||||
|
|
||||||
|
try:
|
||||||
|
obj = queryset.get()
|
||||||
|
except queryset.model.DoesNotExist:
|
||||||
|
raise Http404(_("No %(verbose_name)s found matching the query") %
|
||||||
|
{'verbose_name': queryset.model._meta.verbose_name})
|
||||||
|
return obj
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super(PosledniCisloVysledkovkaView, self).get_context_data()
|
||||||
|
rocnik = context['rocnik']
|
||||||
|
cislo = rocnik.cisla.order_by("poradi").last()
|
||||||
|
cislopred = cislo.predchozi()
|
||||||
|
context['vysledkovka'] = VysledkovkaDoTeXu(
|
||||||
|
cislo,
|
||||||
|
od_vyjma=cislopred.zlomovy_deadline_pro_papirove_cislo(),
|
||||||
|
do_vcetne=cislo.deadline_v_cisle.order_by("deadline").last(),
|
||||||
|
)
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
class RocnikVysledkovkaView(RocnikView):
|
class RocnikVysledkovkaView(RocnikView):
|
||||||
""" View vytvořené pro stránku zobrazující výsledkovku ročníku v TeXu."""
|
""" View vytvořené pro stránku zobrazující výsledkovku ročníku v TeXu."""
|
||||||
model = Rocnik
|
model = Rocnik
|
||||||
|
|
|
@ -456,3 +456,32 @@ class VysledkovkaCisla(Vysledkovka):
|
||||||
def ne_clanek_ne_konfera(problem):
|
def ne_clanek_ne_konfera(problem):
|
||||||
inst = problem.get_real_instance()
|
inst = problem.get_real_instance()
|
||||||
return not (isinstance(inst, m.Clanek) or isinstance(inst, m.Konfera))
|
return not (isinstance(inst, m.Clanek) or isinstance(inst, m.Konfera))
|
||||||
|
|
||||||
|
|
||||||
|
class VysledkovkaDoTeXu(VysledkovkaCisla):
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
nejake_cislo: m.Cislo,
|
||||||
|
od_vyjma: m.Deadline,
|
||||||
|
do_vcetne: m.Deadline
|
||||||
|
):
|
||||||
|
super().__init__(nejake_cislo, False, do_vcetne)
|
||||||
|
self.od_deadlinu = od_vyjma
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def problemy(self) -> list[m.Problem]:
|
||||||
|
return m.Problem.objects.filter(hodnoceni__in=m.Hodnoceni.objects.filter(
|
||||||
|
deadline_body__deadline__gt=self.od_deadlinu.deadline,
|
||||||
|
deadline_body__deadline__lte=self.do_deadlinu.deadline,
|
||||||
|
)).distinct().non_polymorphic().select_related('nadproblem').select_related('nadproblem__nadproblem')
|
||||||
|
|
||||||
|
@property
|
||||||
|
def hodnoceni_do_cisla(self):
|
||||||
|
hodnoceni = m.Hodnoceni.objects.prefetch_related(
|
||||||
|
'problem', 'reseni', 'reseni__resitele')
|
||||||
|
if self.jen_verejne:
|
||||||
|
hodnoceni = hodnoceni.filter(deadline_body__verejna_vysledkovka=True)
|
||||||
|
return hodnoceni.filter(
|
||||||
|
deadline_body__deadline__gt=self.od_deadlinu.deadline,
|
||||||
|
deadline_body__deadline__lte=self.do_deadlinu.deadline
|
||||||
|
)
|
Loading…
Reference in a new issue