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):
|
||||
"Čí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
|
||||
if (i < 0) or (i >= len(cs)):
|
||||
return None
|
||||
|
|
|
@ -120,7 +120,8 @@
|
|||
{% if user.je_org %}
|
||||
<div class='mam-org-only'>
|
||||
<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šší… #}
|
||||
<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>
|
||||
|
|
|
@ -77,6 +77,11 @@ urlpatterns = [
|
|||
org_required(views.TitulyViewRocnik),
|
||||
name='seminar_rocnik_titul'
|
||||
),
|
||||
path(
|
||||
'rocnik/<int:rocnik>/posledni_vysledkovka.tex',
|
||||
org_required(views.PosledniCisloVysledkovkaView.as_view()),
|
||||
name='seminar_rocnik_posledni_vysledkovka'
|
||||
),
|
||||
path(
|
||||
'cislo/<int:rocnik>.<str:cislo>/vysledkovka.tex',
|
||||
org_required(views.CisloVysledkovkaView.as_view()),
|
||||
|
|
|
@ -20,7 +20,7 @@ from treenode import treelib
|
|||
import treenode.templatetags as tnltt
|
||||
import treenode.serializers as vr
|
||||
from vysledkovky.utils import body_resitelu, VysledkovkaCisla, \
|
||||
VysledkovkaRocniku
|
||||
VysledkovkaRocniku, VysledkovkaDoTeXu
|
||||
|
||||
from datetime import date, datetime
|
||||
from django.utils import timezone
|
||||
|
@ -438,7 +438,6 @@ class CisloView(generic.DetailView):
|
|||
|
||||
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['vysledkovka'] = VysledkovkaCisla(cislo, not self.request.user.je_org)
|
||||
|
||||
deadliny = Deadline.objects.filter(cislo=cislo).reverse()
|
||||
deadliny_s_vysledkovkami = []
|
||||
|
@ -506,6 +505,60 @@ class CisloVysledkovkaView(CisloView):
|
|||
content_type = 'text/plain; charset=UTF8'
|
||||
#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):
|
||||
""" View vytvořené pro stránku zobrazující výsledkovku ročníku v TeXu."""
|
||||
model = Rocnik
|
||||
|
|
|
@ -456,3 +456,32 @@ class VysledkovkaCisla(Vysledkovka):
|
|||
def ne_clanek_ne_konfera(problem):
|
||||
inst = problem.get_real_instance()
|
||||
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