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