Browse Source

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.)

pull/3/head
Jonas Havelka 2 years ago
parent
commit
750d02f2a7
  1. 2
      seminar/models/tvorba.py
  2. 3
      seminar/templates/seminar/archiv/rocnik.html
  3. 5
      seminar/urls.py
  4. 57
      seminar/views/views_all.py
  5. 29
      vysledkovky/utils.py

2
seminar/models/tvorba.py

@ -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

3
seminar/templates/seminar/archiv/rocnik.html

@ -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>

5
seminar/urls.py

@ -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()),

57
seminar/views/views_all.py

@ -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

29
vysledkovky/utils.py

@ -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…
Cancel
Save