Compare commits
	
		
			1 commit
		
	
	
		
			master
			...
			certifikat
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| a1c62bdf09 | 
					 9 changed files with 133 additions and 18 deletions
				
			
		|  | @ -91,7 +91,7 @@ TODO: tabulka není úplná. Pokud na něco narazíte, tak ji prosím doplňte. | ||||||
| 
 | 
 | ||||||
|    Ubuntu 22.10, ??, ``python3-venv``, ``python3-dev``, ``libpq-dev``, "Je potřeba zapnout zdroj ``universe`` a nainstalovat kompilátor C (``gcc``)?" |    Ubuntu 22.10, ??, ``python3-venv``, ``python3-dev``, ``libpq-dev``, "Je potřeba zapnout zdroj ``universe`` a nainstalovat kompilátor C (``gcc``)?" | ||||||
|    Linux Mint 21, ??, ``python3-venv``, ``python3-dev``, ``libpq-dev``, "" |    Linux Mint 21, ??, ``python3-venv``, ``python3-dev``, ``libpq-dev``, "" | ||||||
|    Archlinux 2022.11.01, AUR, vestavěný, vestavěné, ``postgresql-libs``, "Je potřeba céčkový kompilátor (``gcc``); nezapomenout vygenerovat locale ``cs_CZ.UTF-8``" |    Archlinux 2022.11.01, AUR, vestavěný, vestavěné, ``postgresql-libs``, "Je potřeba céčkový kompilátor (``gcc``)" | ||||||
|    openSUSE Leap 15.4, oficiální (``python39``), předinstalovaný?, ``python39-devel``, ??FIXME!!, "Výchozí verze pythonu je 3.6 a ta je moc stará, potřeba instalovat ``gcc``. Nevím jak sehnat pg_config." |    openSUSE Leap 15.4, oficiální (``python39``), předinstalovaný?, ``python39-devel``, ??FIXME!!, "Výchozí verze pythonu je 3.6 a ta je moc stará, potřeba instalovat ``gcc``. Nevím jak sehnat pg_config." | ||||||
|    Debian 11, "oficiální, výchozí", ??, ??, ??, "Určitě to tam rozběhat jde, protože Gimli. Nejspíš bude relativně podobné Ubuntu." |    Debian 11, "oficiální, výchozí", ??, ??, ??, "Určitě to tam rozběhat jde, protože Gimli. Nejspíš bude relativně podobné Ubuntu." | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								tvorba/static/tvorba/logomm-new.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								tvorba/static/tvorba/logomm-new.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								tvorba/static/tvorba/mff-uk-logo.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								tvorba/static/tvorba/mff-uk-logo.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -122,6 +122,7 @@ | ||||||
|     <p><a href="tituly.tex" download>Tituly (TeX, včetně neveřejných, všechny, nevhodné do mamtexu)</a></p> |     <p><a href="tituly.tex" download>Tituly (TeX, včetně neveřejných, všechny, nevhodné do mamtexu)</a></p> | ||||||
|     {# FIXME: Sice to sem asi nepatří sémanticky, ale bylo to nejjednodušší… #} |     {# FIXME: Sice to sem asi nepatří sémanticky, ale bylo to nejjednodušší… #} | ||||||
|     <p><a href='{% url 'tvorba_rocnik_resitele_csv' rocnik=rocnik.rocnik %}' download>CSV export řešitelů</a></p> |     <p><a href='{% url 'tvorba_rocnik_resitele_csv' rocnik=rocnik.rocnik %}' download>CSV export řešitelů</a></p> | ||||||
|  |     <p><a href='certifikaty.tar.gz' download>Certifikáty úspěšných řešitelů (doplňte místa [a data] narození a zkompilujte ./certifikaty)</a></p> | ||||||
|     <h2>Výsledková listina včetně neveřejných bodů</h2> |     <h2>Výsledková listina včetně neveřejných bodů</h2> | ||||||
|         {% include "vysledkovky/vysledkovka_rocnik.html" with vysledkovka=vysledkovka_neverejna %} |         {% include "vysledkovky/vysledkovka_rocnik.html" with vysledkovka=vysledkovka_neverejna %} | ||||||
|     </div> |     </div> | ||||||
|  |  | ||||||
							
								
								
									
										11
									
								
								tvorba/templates/tvorba/archiv/rocnik_certifikat.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								tvorba/templates/tvorba/archiv/rocnik_certifikat.tex
									
									
									
									
									
										Normal file
									
								
							|  | @ -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 %} | ||||||
							
								
								
									
										65
									
								
								tvorba/templates/tvorba/archiv/rocnik_certifikat_part.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								tvorba/templates/tvorba/archiv/rocnik_certifikat_part.tex
									
									
									
									
									
										Normal file
									
								
							|  | @ -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 %} | ||||||
|  | @ -12,22 +12,6 @@ POZOR! Kolize jmen! Dva řešitelé mají stejné makro! | ||||||
| {% autoescape off %} | {% autoescape off %} | ||||||
| {% load tex %} | {% load tex %} | ||||||
| 
 | 
 | ||||||
| \ExplSyntaxOn |  | ||||||
| \char_set_catcode_other:n{32}% Odsud dál do \char_set_catcode_space:n{32} nesmí být za žádnou cenu jiná mezera (tj. i zlom řádku) než ty mezi jménem a příjmením |  | ||||||
| \prop_const_from_keyval:Nn\g_tituly% |  | ||||||
| {% |  | ||||||
| {% for r in resitele %}{{r|sloz}}={% if r.titul == '' %}{}{% else %}{\titul{{r.titul|sloz}}}{% endif %},% |  | ||||||
| {% endfor %}}% |  | ||||||
| \char_set_catcode_space:n{32} |  | ||||||
| 
 |  | ||||||
| \DeclareDocumentCommand\Titul{mO{#1}}{% |  | ||||||
| \prop_if_in:NnTF\g_tituly{#1}% |  | ||||||
| {\prop_item:Nn\g_tituly{#1}}% |  | ||||||
| {\ClassError{mam}{Titul pro #1 nenalezen!}{}}% |  | ||||||
| #2% |  | ||||||
| } |  | ||||||
| \ExplSyntaxOff |  | ||||||
| 
 |  | ||||||
| {% for r in resitele %} | {% for r in resitele %} | ||||||
|   {% if r.titul == '' %} |   {% if r.titul == '' %} | ||||||
|   	{% spaceless %} |   	{% spaceless %} | ||||||
|  |  | ||||||
|  | @ -36,6 +36,11 @@ urlpatterns = [ | ||||||
| 		org_required(views.resiteleRocnikuCsvExportView), | 		org_required(views.resiteleRocnikuCsvExportView), | ||||||
| 		name='tvorba_rocnik_resitele_csv' | 		name='tvorba_rocnik_resitele_csv' | ||||||
| 	), | 	), | ||||||
|  | 	path( | ||||||
|  | 		'rocnik/<int:rocnik>/certifikaty.tar.gz', | ||||||
|  | 		org_required(views.certifikatyExportView), | ||||||
|  | 		name='tvorba_rocnik_certifikaty' | ||||||
|  | 	), | ||||||
| 	path( | 	path( | ||||||
| 		'rocnik/<int:rocnik>/tituly.tex', | 		'rocnik/<int:rocnik>/tituly.tex', | ||||||
| 		org_required(views.TitulyViewRocnik), | 		org_required(views.TitulyViewRocnik), | ||||||
|  |  | ||||||
|  | @ -13,8 +13,9 @@ from django.http import Http404 | ||||||
| from django.db.models import Q, Sum, Count | from django.db.models import Q, Sum, Count | ||||||
| from django.views.generic.base import RedirectView | from django.views.generic.base import RedirectView | ||||||
| from django.core.exceptions import PermissionDenied | 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 soustredeni.models import Konfera | ||||||
| from tvorba.models import Problem, Cislo, Rocnik, Tema, Clanek, Deadline, Uloha | from tvorba.models import Problem, Cislo, Rocnik, Tema, Clanek, Deadline, Uloha | ||||||
| from treenode.models import TemaVCisleNode, PohadkaNode | from treenode.models import TemaVCisleNode, PohadkaNode | ||||||
|  | @ -34,6 +35,10 @@ from django.conf import settings | ||||||
| import unicodedata | import unicodedata | ||||||
| import logging | import logging | ||||||
| import time | import time | ||||||
|  | import http | ||||||
|  | import tempfile | ||||||
|  | import shutil | ||||||
|  | import subprocess | ||||||
| 
 | 
 | ||||||
| import personalni.views | 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! | # FIXME: Pozor, výš je ještě jeden ProblemView! | ||||||
| #class ProblemView(generic.DetailView): | #class ProblemView(generic.DetailView): | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue