mamweb/tvorba/views/tex.py

132 lines
4.3 KiB
Python

import unicodedata
from django.shortcuts import get_object_or_404, render
from django.views import generic
from django.utils.translation import ugettext as _
from django.http import Http404
from personalni.models.resitel import Resitel
from tvorba.models import Rocnik, Cislo, Deadline
from vysledkovky.utils import body_resitelu, VysledkovkaCisla, VysledkovkaDoTeXu
from tvorba.views.archiv import CisloView, RocnikView
class CisloVysledkovkaView(CisloView):
"""View vytvořené pro stránku zobrazující výsledkovku čísla v TeXu."""
model = Cislo
template_name = 'tvorba/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
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 = 'tvorba/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
template_name = 'tvorba/archiv/rocnik_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
# Tituly
def TitulyViewRocnik(request, rocnik):
return TitulyView(request, rocnik, None)
def TitulyView(request, rocnik, cislo):
""" View pro stažení makra titulů v TeXu."""
rocnik_obj = get_object_or_404(Rocnik, rocnik=rocnik)
resitele = Resitel.objects.filter(rok_maturity__gte=rocnik_obj.prvni_rok)
asciijmena = []
jmenovci = False # detekuje, zda jsou dva řešitelé jmenovci (modulo nabodeníčka),
# pokud ano, vrátí se jako true
if cislo is not None:
cislo_obj = get_object_or_404(Cislo, rocnik=rocnik_obj, poradi=cislo)
slovnik_s_body = body_resitelu(
do=cislo_obj.zlomovy_deadline_pro_papirove_cislo(), jen_verejne=False
)
else:
slovnik_s_body = body_resitelu(
do=Deadline.objects.filter(cislo__rocnik=rocnik_obj).last(),
jen_verejne=False
)
for resitel in resitele:
resitel.titul = resitel.get_titul(slovnik_s_body[resitel.id])
jmeno = resitel.osoba.jmeno+resitel.osoba.prijmeni
# převedeme jména a příjmení řešitelů do ASCII
ascii_jmeno_bytes = unicodedata.normalize('NFKD', jmeno).encode("ascii", "ignore")
# vrátí se byte string, převedeme na standardní string
ascii_jmeno_divnoznaky = str(ascii_jmeno_bytes, "utf-8", "ignore").replace(" ", "")
resitel.ascii = ''.join(a for a in ascii_jmeno_divnoznaky if a.isalnum())
if resitel.ascii not in asciijmena:
asciijmena.append(resitel.ascii)
else:
jmenovci = True
return render(
request, 'tvorba/archiv/tituly.tex',
{'resitele': resitele, 'jmenovci': jmenovci},
content_type="text/plain"
)