diff --git a/tvorba/static/tvorba/logomm-new.pdf b/tvorba/static/tvorba/logomm-new.pdf new file mode 100644 index 00000000..207b32dc Binary files /dev/null and b/tvorba/static/tvorba/logomm-new.pdf differ diff --git a/tvorba/static/tvorba/mff-uk-logo.pdf b/tvorba/static/tvorba/mff-uk-logo.pdf new file mode 100644 index 00000000..025892a5 Binary files /dev/null and b/tvorba/static/tvorba/mff-uk-logo.pdf differ diff --git a/tvorba/templates/tvorba/archiv/rocnik.html b/tvorba/templates/tvorba/archiv/rocnik.html index 6792fb93..b965d500 100644 --- a/tvorba/templates/tvorba/archiv/rocnik.html +++ b/tvorba/templates/tvorba/archiv/rocnik.html @@ -122,6 +122,7 @@

Tituly (TeX, včetně neveřejných, všechny, nevhodné do mamtexu)

{# FIXME: Sice to sem asi nepatří sémanticky, ale bylo to nejjednodušší… #}

CSV export řešitelů

+

Certifikáty úspěšných řešitelů (doplňte místa [a data] narození a zkompilujte ./certifikaty)

Výsledková listina včetně neveřejných bodů

{% include "vysledkovky/vysledkovka_rocnik.html" with vysledkovka=vysledkovka_neverejna %} diff --git a/tvorba/templates/tvorba/archiv/rocnik_certifikat.tex b/tvorba/templates/tvorba/archiv/rocnik_certifikat.tex new file mode 100644 index 00000000..0360edf5 --- /dev/null +++ b/tvorba/templates/tvorba/archiv/rocnik_certifikat.tex @@ -0,0 +1,11 @@ +{% autoescape off %}{% load static %}{% load tex %}{% with lb='{' %} +\def\ucastnik{{resitel|sloz}} +\def\narozeni{{lb}} {% firstof ofresitel.osoba.datum_narozeni "\\TODO{datum narození ve tvaru 1. 1. 2001}" %}} +\def\mistonar{\TODO{místo narození}} +\def\body{{lb}}{{body}} bod{% if cele %}ů{% else %}u{% endif %}} + +\newif\ifresitelka +{% if osloveni_zenske %}\resitelkatrue{% else %}\resitelkafalse{% endif %} + +\input{certifikat.tex} +{% endwith %}{% endautoescape %} diff --git a/tvorba/templates/tvorba/archiv/rocnik_certifikat_part.tex b/tvorba/templates/tvorba/archiv/rocnik_certifikat_part.tex new file mode 100644 index 00000000..1f49e78b --- /dev/null +++ b/tvorba/templates/tvorba/archiv/rocnik_certifikat_part.tex @@ -0,0 +1,65 @@ +{% autoescape off %}{% load static %}{% load tex %}{% with lb='{' %} +\def\rocnik{{rocnik.rocnik|sloz}} +\def\rok{{lb}}{{rocnik.prvni_rok}}/{{rocnik.prvni_rok|add:"1"}}} + +\def\levypodpis{Mgr. Vladan Majerech, Dr.\\vedoucí KS M\&M} +\def\pravypodpis{doc. RNDr. Mirko Rokyta, CSc.\\děkan MFF UK} + + +\documentclass[landscape, 12pt]{article} + +\usepackage{geometry}\geometry{a4paper,left=2cm,right=2cm,top=2cm,bottom=2cm} +\setlength\parskip{2em} +\pagestyle{empty} +\usepackage{graphicx} +\usepackage[czech]{babel} + +\begin{document} + \centering + \Large + + {\Huge + \includegraphics[width=0.45\textwidth]{mff-uk-logo.pdf}\\[1em] + uděluje osvědčení úspěšného řešitele\\ + Korespondenčního semináře M\&M + \par} + + {\normalsize jméno účastn\ifresitelka ice\else íka\fi:} {\Huge \ucastnik}\\ + {\normalsize datum narození:} \narozeni{\normalsize, místo narození:} \mistonar + + Účastn\ifresitelka ice\else ík\fi\ v \rocnik. ročníku semináře (školní rok \rok) získal\ifresitelka a\fi\ \body,\\ + čímž se stal\ifresitelka a\fi\ úspěšným řešitelem korespondenčního semináře. + + \begin{minipage}[t]{0.25\textwidth} + { + \centering + \hrule + \vspace{4pt} + \normalsize\levypodpis + \par + } + \end{minipage} + \begin{minipage}[b]{0.3\textwidth} + \centering + \includegraphics[width=0.8\textwidth]{logomm-new.pdf} + \par + \end{minipage} + \begin{minipage}[t]{0.25\textwidth} + { + \centering + \hrule + \vspace{4pt} + \normalsize\pravypodpis + \par + } + \end{minipage} + + \vspace{1em} + + %{\vbox to 0pt{\hbox to \textwidth{\hfill\includegraphics[height=2.5em]{jcmf.pdf}}\vskip 0pt minus 1fill}\setlength\parskip{0pt}\noindent} + {\normalsize + Korespondenční seminář M\&M organizují převážně studenti Matematicko-fyzikální fakulty Univerzity Karlovy.\\ + % Organizaci semináře a vydávání časopisu podporuje Jednota českých matematiků a fyziků. + \par} +\end{document} +{% endwith %}{% endautoescape %} diff --git a/tvorba/urls.py b/tvorba/urls.py index 950de6cc..4811f08e 100644 --- a/tvorba/urls.py +++ b/tvorba/urls.py @@ -36,6 +36,11 @@ urlpatterns = [ org_required(views.resiteleRocnikuCsvExportView), name='tvorba_rocnik_resitele_csv' ), + path( + 'rocnik//certifikaty.tar.gz', + org_required(views.certifikatyExportView), + name='tvorba_rocnik_certifikaty' + ), path( 'rocnik//tituly.tex', org_required(views.TitulyViewRocnik), diff --git a/tvorba/views/__init__.py b/tvorba/views/__init__.py index 4cb769a6..2fe16378 100644 --- a/tvorba/views/__init__.py +++ b/tvorba/views/__init__.py @@ -13,8 +13,9 @@ from django.http import Http404 from django.db.models import Q, Sum, Count from django.views.generic.base import RedirectView from django.core.exceptions import PermissionDenied +from django.contrib.staticfiles.finders import find -from personalni.models import Resitel +from personalni.models import Resitel, Osoba from soustredeni.models import Konfera from tvorba.models import Problem, Cislo, Rocnik, Tema, Clanek, Deadline, Uloha from treenode.models import TemaVCisleNode, PohadkaNode @@ -34,6 +35,10 @@ from django.conf import settings import unicodedata import logging import time +import http +import tempfile +import shutil +import subprocess import personalni.views @@ -281,6 +286,50 @@ def resiteleRocnikuCsvExportView(request, rocnik): ) ) +def certifikatyExportView(request, rocnik): + rocnik = get_object_or_404(Rocnik, rocnik=rocnik) + id_a_body_resitelu: dict[int, int] = body_resitelu( + rocnik, + jen_verejne = False, + ) + resitele_a_body = [(Resitel.objects.get(id=id), body) for id, body in id_a_body_resitelu.items() if body > 100] + + with tempfile.TemporaryDirectory() as tempdir: + shutil.copy(find("tvorba/logomm-new.pdf"), tempdir) + shutil.copy(find("tvorba/mff-uk-logo.pdf"), tempdir) + tex = render(request, "tvorba/archiv/rocnik_certifikat_part.tex", { + "rocnik": rocnik, + }).content + with open(tempdir+"/certifikat.tex", "w") as texfile: + texfile.write(tex.decode()) + + ostatni_soubory = ["logomm-new.pdf", "mff-uk-logo.pdf", "certifikat.tex"] + + certifikaty = [] + for r, b in resitele_a_body: + tex = render(request, "tvorba/archiv/rocnik_certifikat.tex", { + "resitel": r, + "body": b, + "cele": b % 1 == 0, + "osloveni_zenske": r.osoba.osloveni == Osoba.OSLOVENI_ZENSKE, + }).content + + soubor = f"{r}.tex" + with open(f"{tempdir}/{soubor}", "w") as texfile: + texfile.write(tex.decode()) + certifikaty.append(soubor) + + with open(tempdir+"/certifikaty", "w") as skript: + for certifikat in certifikaty: + print(f"pdflatex '{certifikat}'", file=skript) + os.chmod(f"{tempdir}/certifikaty", 0o777) + + subprocess.call(["tar", "-czf", "certifikaty.tar.gz", *certifikaty, *ostatni_soubory, "certifikaty"], cwd=tempdir) + with open(tempdir+"/certifikaty.tar.gz", "rb") as pdffile: + response = HttpResponse(pdffile.read(), content_type='application/gzip') + return response + + # FIXME: Pozor, výš je ještě jeden ProblemView! #class ProblemView(generic.DetailView):