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