From 05a710185c2608a43aadc35725f5fa43a864087d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Fri, 2 Aug 2024 23:36:12 +0200 Subject: [PATCH 1/7] =?UTF-8?q?P=C5=99ed=C4=9Bl=C3=A1n=C3=AD=20sousov?= =?UTF-8?q?=C3=BDch=20views=20do=20hodn=C4=9B=20inheritance=20stavu=20V?= =?UTF-8?q?=C3=ADm,=20=C5=BEe=20je=20toho=20tady=20trochu=20moc=20najednou?= =?UTF-8?q?,=20ale=20napadalo=20m=C4=9B=20to=20tak=20propleten=C4=9B?= =?UTF-8?q?=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- soustredeni/urls.py | 4 +- soustredeni/views.py | 99 +++++++++++++++++++++----------------------- various/views.py | 78 ++++++++++++++++++++++++++++++++-- 3 files changed, 124 insertions(+), 57 deletions(-) diff --git a/soustredeni/urls.py b/soustredeni/urls.py index 7ae79cdd..ccc3c493 100644 --- a/soustredeni/urls.py +++ b/soustredeni/urls.py @@ -26,12 +26,12 @@ urlpatterns = [ ), path( 'export_ucastniku', - org_required(views.soustredeniUcastniciExportView), + org_required(views.SoustredeniUcastniciExportView.as_view()), name='soustredeni_ucastnici_export' ), path( 'stvrzenky.pdf', - org_required(views.soustredeniStvrzenkyView), + org_required(views.SoustredeniStvrzenkyView.as_view()), name='soustredeni_ucastnici_stvrzenky' ), path( diff --git a/soustredeni/views.py b/soustredeni/views.py index a0e3fe13..bed2d02b 100644 --- a/soustredeni/views.py +++ b/soustredeni/views.py @@ -1,15 +1,11 @@ -from django.shortcuts import get_object_or_404, render +from django.shortcuts import get_object_or_404 from django.http import HttpResponse from django.views import generic from django.contrib.staticfiles.finders import find import csv -import tempfile -import shutil -import subprocess -from pathlib import Path -import http +import various.views from seminar.views import obalkyView from .models import Soustredeni, Soustredeni_Ucastnici @@ -34,70 +30,69 @@ class SoustredeniListView(generic.ListView): ) -def soustredeniObalkyView(request, soustredeni): - soustredeni = get_object_or_404(Soustredeni, id=soustredeni) - return obalkyView(request, soustredeni.ucastnici.all()) +class KonkretniSoustredeniMixin: + """ Přidá k View s parametrem `soustredeni` atribut `self.soustredeni` """ + def setup(self, request, *args, **kwargs): + super().setup(request, *args, **kwargs) + soustredeni_id = self.kwargs["soustredeni"] + self.soustredeni = get_object_or_404(Soustredeni, id=soustredeni_id) -class SoustredeniUcastniciBaseView(generic.ListView): +class SoustredeniUcastniciBaseView(KonkretniSoustredeniMixin, various.views.NeprazdnyListView): + """ + Slouží jako ListView účastníků soustředění + + háže inteligentní chybu při soustředění bez účastníků + """ model = Soustredeni_Ucastnici + if_prazdny_title = "K soustředění nejsou přidaní žádní účastníci" + if_prazdny_text = "K tebou zvolenému soustředění nejsou přidaní žádní účastníci, tedy není co zobrazit. Můžeš to zkusit změnit v adminu, případně se zeptej webařů :-)" def get_queryset(self): - soustredeni = get_object_or_404( - Soustredeni, - pk=self.kwargs["soustredeni"] - ) return Soustredeni_Ucastnici.objects.filter( - soustredeni=soustredeni).select_related('resitel') + soustredeni=self.soustredeni).select_related('resitel', 'resitel__osoba') + + +# FIXME předělat jako ostatní (vyžaduje předělání `obalkyView`) +def soustredeniObalkyView(request, soustredeni): + soustredeni = get_object_or_404(Soustredeni, id=soustredeni) + return obalkyView(request, soustredeni.ucastnici.all()) class SoustredeniMailyUcastnikuView(SoustredeniUcastniciBaseView): """ Seznam e-mailů řešitelů oddělených čárkami. """ - model = Soustredeni_Ucastnici template_name = 'soustredeni/maily_ucastniku.txt' class SoustredeniUcastniciView(SoustredeniUcastniciBaseView): """ HTML tabulka účastníků pro tisk. """ - model = Soustredeni_Ucastnici template_name = 'soustredeni/seznam_ucastniku.html' -def soustredeniUcastniciExportView(request, soustredeni): - soustredeni = get_object_or_404(Soustredeni, id=soustredeni) - ucastnici = soustredeni.ucastnici.all() - response = HttpResponse(content_type='text/csv') - response['Content-Disposition'] = 'attachment; filename="ucastnici.csv"' - - writer = csv.writer(response) - writer.writerow(["jmeno", "prijmeni", "rok_maturity", "telefon", "email", "ulice", "mesto", "psc","stat"]) - for u in ucastnici: - o = u.osoba - writer.writerow([o.jmeno, o.prijmeni, str(u.rok_maturity), o.telefon, o.email, o.ulice, o.mesto, o.psc, o.stat.name]) - return response - -def soustredeniStvrzenkyView(request, soustredeni): - soustredeni = get_object_or_404(Soustredeni, id=soustredeni) - ucastnici = soustredeni.ucastnici.all() - if ucastnici.count() == 0: - return HttpResponse( - render(request, 'universal.html', { - 'title': 'Není pro koho vyrobit stvrzenky.', - 'text': 'Právě ses pokusil/a vygenerovat stvrzenky pro prázdnou množinu lidí. Můžeš to zkusit změnit, případně se zeptej webařů :-)', - }), - status=http.HTTPStatus.NOT_FOUND, - ) - castka = Nastaveni.get_solo().cena_sous - tex = render(request, 'soustredeni/stvrzenky.tex', {'ucastnici': ucastnici, 'soustredeni': soustredeni, 'castka': castka}).content +class SoustredeniUcastniciExportView(SoustredeniUcastniciBaseView): + """ CSV tabulka účastníků. """ + def render(self, request, *args, **kwargs): + response = HttpResponse(content_type='text/csv') + response['Content-Disposition'] = 'attachment; filename="ucastnici.csv"' + + writer = csv.writer(response) + writer.writerow(["jmeno", "prijmeni", "rok_maturity", "telefon", "email", "ulice", "mesto", "psc","stat"]) + for u in self.object_list: + o = u.resitel.osoba + writer.writerow([o.jmeno, o.prijmeni, str(u.resitel.rok_maturity), o.telefon, o.email, o.ulice, o.mesto, o.psc, o.stat.name]) + return response + + +class SoustredeniStvrzenkyView(various.views.TeXResponseMixin, SoustredeniUcastniciBaseView): + template_name = 'soustredeni/stvrzenky.tex' + dalsi_potrebne_soubory = [find('images/logomm.pdf')] - with tempfile.TemporaryDirectory() as tempdirfn: - tempdir = Path(tempdirfn) - with open(tempdir / "stvrzenky.tex", "w") as texfile: - texfile.write(tex.decode()) + if_prazdny_title = "Není pro koho vyrobit stvrzenky." + if_prazdny_text = "Právě ses pokusil/a vygenerovat stvrzenky pro prázdnou množinu lidí. Můžeš to zkusit změnit, případně se zeptej webařů :-)" - shutil.copy(find('images/logomm.pdf'), tempdir) - subprocess.call(["pdflatex", "stvrzenky.tex"], cwd = tempdir, stdout=subprocess.DEVNULL) + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) - with open(tempdir / "stvrzenky.pdf", "rb") as pdffile: - response = HttpResponse(pdffile.read(), content_type='application/pdf') - return response + context["castka"] = Nastaveni.get_solo().cena_sous + context["soustredeni"] = self.soustredeni + context["ucastnici"] = self.object_list + return context diff --git a/various/views.py b/various/views.py index 96d9a29d..c4d72b2d 100644 --- a/various/views.py +++ b/various/views.py @@ -1,7 +1,14 @@ -from django.http import HttpResponseForbidden -from django.shortcuts import render +import http +import tempfile +import shutil +import subprocess + +from pathlib import Path -# Create your views here. +from django.http import HttpResponseForbidden, HttpResponse +from django.shortcuts import render +from django.views import generic +from django.template.loader import render_to_string def csrf_error(request, reason=""): @@ -11,3 +18,68 @@ def csrf_error(request, reason=""): {"url": request.META.get("HTTP_REFERER", None), "reason": reason}, status=HttpResponseForbidden.status_code, ) + + +class NeprazdnyListView(generic.ListView): + """ + Použití jako generic.ListView, jen při prázdném listu vyhodí M&M stránku + s titlem `self.if_prazdny_title` a textem `self.if_prazdny_text` + a způsob renderování (např. CSV) lze změnit přepsáním metody render. + """ + allow_empty = False + if_prazdny_title = "V seznamu nic není" + if_prazdny_text = "V seznamu nic není. Zkus to napravit v adminu, nebo se zeptej webařů." + + # Skoro copy-paste generic.list.ListView.get, + # protože nemůžu chytat 404, neboť může nastat i v get_context_data + def get(self, request, *args, **kwargs): + self.object_list = self.get_queryset() + + if self.get_paginate_by(self.object_list) is not None and hasattr( + self.object_list, "exists" + ): + is_empty = not self.object_list.exists() + else: + is_empty = not self.object_list + if is_empty: + return render(request, 'universal.html', { + 'title': self.if_prazdny_title, + 'text': self.if_prazdny_text, + }, + status=http.HTTPStatus.NOT_FOUND, + ) + + return self.render(request, *args, **kwargs) + + # Tohle jsem vyčlenil, aby šlo generovat i něco jiného než template + def render(self, request, *args, **kwargs): + context = self.get_context_data() + return self.render_to_response(context) + + +class TeXResponseMixin: + """ + Mixin pro TemplateView, aby výsledek projel TeXem a vrátil rovnou PDF. + Obrázky a jiné soubory lze přidat nastavením `dalsi_potrebne_soubory` + (např. na `[django.contrib.staticfiles.finders.find('bla')]`, + nebo jiný seznam absolutních cest). + """ + dalsi_potrebne_soubory = [] + tex = "pdflatex" + + def render_to_response(self, context, **response_kwargs): + zdrojak = render_to_string(self.get_template_names(), context) + + with tempfile.TemporaryDirectory() as tempdirfn: + tempdir = Path(tempdirfn) + with open(tempdir / "main.tex", "w") as texfile: + texfile.write(zdrojak) + for file in self.dalsi_potrebne_soubory: + shutil.copy(file, tempdir) + subprocess.call([self.tex, "main.tex"], cwd=tempdir, stdout=subprocess.DEVNULL) + + with open(tempdir / "main.pdf", "rb") as pdffile: + response = HttpResponse(pdffile.read(), content_type='application/pdf', **response_kwargs) + return response + + From d55199d6ae357c5fcf7564f5126e34aac41f1407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Fri, 2 Aug 2024 23:44:37 +0200 Subject: [PATCH 2/7] Achich ouvej, on je to Soustredeni_Ucastnici model --- soustredeni/templates/soustredeni/stvrzenky.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soustredeni/templates/soustredeni/stvrzenky.tex b/soustredeni/templates/soustredeni/stvrzenky.tex index 78752866..6a22fbaa 100644 --- a/soustredeni/templates/soustredeni/stvrzenky.tex +++ b/soustredeni/templates/soustredeni/stvrzenky.tex @@ -29,7 +29,7 @@ } {% for u in ucastnici %} - {% with o=u.osoba %} + {% with o=u.resitel.osoba %} \stvrzenka{{o.jmeno|sloz}}{{o.prijmeni|sloz}} {% endwith %} {% endfor %} From 47894ce335418e44c3d0372b3b45e2e3ca06f5c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Sun, 4 Aug 2024 17:01:44 +0200 Subject: [PATCH 3/7] =?UTF-8?q?P=C5=99esun=20csrf=5Ferror?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mamweb/settings_common.py | 2 +- various/views/__init__.py | 0 various/{views.py => views/csrf.py} | 0 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 various/views/__init__.py rename various/{views.py => views/csrf.py} (100%) diff --git a/mamweb/settings_common.py b/mamweb/settings_common.py index 92124364..1bffe8d7 100644 --- a/mamweb/settings_common.py +++ b/mamweb/settings_common.py @@ -54,7 +54,7 @@ SESSION_EXPIRE_AT_BROWSER_CLOSE = True DOBA_ODHLASENI_PRI_ZASKRTNUTI_NEODHLASOVAT = 365 * 24 * 3600 # rok # View pro chybu s CSRF tokenem (např. se sušenkami) -CSRF_FAILURE_VIEW = 'various.views.csrf_error' +CSRF_FAILURE_VIEW = 'various.views.csrf.csrf_error' # Modules configuration diff --git a/various/views/__init__.py b/various/views/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/various/views.py b/various/views/csrf.py similarity index 100% rename from various/views.py rename to various/views/csrf.py From be8c9810e4ef83a82aa4ccac06b9e9af269cb6c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Sun, 4 Aug 2024 17:51:26 +0200 Subject: [PATCH 4/7] =?UTF-8?q?Rozd=C4=9Blen=C3=AD=20varous.views,=20aby?= =?UTF-8?q?=20odpov=C3=ADdali=205f7ec853?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- soustredeni/views.py | 12 +++++-- various/views/csrf.py | 76 +-------------------------------------- various/views/generic.py | 77 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 78 deletions(-) create mode 100644 various/views/generic.py diff --git a/soustredeni/views.py b/soustredeni/views.py index bed2d02b..66490f16 100644 --- a/soustredeni/views.py +++ b/soustredeni/views.py @@ -5,7 +5,7 @@ from django.contrib.staticfiles.finders import find import csv -import various.views +import various.views.generic from seminar.views import obalkyView from .models import Soustredeni, Soustredeni_Ucastnici @@ -38,7 +38,10 @@ class KonkretniSoustredeniMixin: self.soustredeni = get_object_or_404(Soustredeni, id=soustredeni_id) -class SoustredeniUcastniciBaseView(KonkretniSoustredeniMixin, various.views.NeprazdnyListView): +class SoustredeniUcastniciBaseView( + KonkretniSoustredeniMixin, + various.views.generic.NeprazdnyListView, +): """ Slouží jako ListView účastníků soustředění + háže inteligentní chybu při soustředění bez účastníků @@ -82,7 +85,10 @@ class SoustredeniUcastniciExportView(SoustredeniUcastniciBaseView): return response -class SoustredeniStvrzenkyView(various.views.TeXResponseMixin, SoustredeniUcastniciBaseView): +class SoustredeniStvrzenkyView( + various.views.generic.TeXResponseMixin, + SoustredeniUcastniciBaseView, +): template_name = 'soustredeni/stvrzenky.tex' dalsi_potrebne_soubory = [find('images/logomm.pdf')] diff --git a/various/views/csrf.py b/various/views/csrf.py index c4d72b2d..e344ff26 100644 --- a/various/views/csrf.py +++ b/various/views/csrf.py @@ -1,14 +1,5 @@ -import http -import tempfile -import shutil -import subprocess - -from pathlib import Path - -from django.http import HttpResponseForbidden, HttpResponse +from django.http import HttpResponseForbidden from django.shortcuts import render -from django.views import generic -from django.template.loader import render_to_string def csrf_error(request, reason=""): @@ -18,68 +9,3 @@ def csrf_error(request, reason=""): {"url": request.META.get("HTTP_REFERER", None), "reason": reason}, status=HttpResponseForbidden.status_code, ) - - -class NeprazdnyListView(generic.ListView): - """ - Použití jako generic.ListView, jen při prázdném listu vyhodí M&M stránku - s titlem `self.if_prazdny_title` a textem `self.if_prazdny_text` - a způsob renderování (např. CSV) lze změnit přepsáním metody render. - """ - allow_empty = False - if_prazdny_title = "V seznamu nic není" - if_prazdny_text = "V seznamu nic není. Zkus to napravit v adminu, nebo se zeptej webařů." - - # Skoro copy-paste generic.list.ListView.get, - # protože nemůžu chytat 404, neboť může nastat i v get_context_data - def get(self, request, *args, **kwargs): - self.object_list = self.get_queryset() - - if self.get_paginate_by(self.object_list) is not None and hasattr( - self.object_list, "exists" - ): - is_empty = not self.object_list.exists() - else: - is_empty = not self.object_list - if is_empty: - return render(request, 'universal.html', { - 'title': self.if_prazdny_title, - 'text': self.if_prazdny_text, - }, - status=http.HTTPStatus.NOT_FOUND, - ) - - return self.render(request, *args, **kwargs) - - # Tohle jsem vyčlenil, aby šlo generovat i něco jiného než template - def render(self, request, *args, **kwargs): - context = self.get_context_data() - return self.render_to_response(context) - - -class TeXResponseMixin: - """ - Mixin pro TemplateView, aby výsledek projel TeXem a vrátil rovnou PDF. - Obrázky a jiné soubory lze přidat nastavením `dalsi_potrebne_soubory` - (např. na `[django.contrib.staticfiles.finders.find('bla')]`, - nebo jiný seznam absolutních cest). - """ - dalsi_potrebne_soubory = [] - tex = "pdflatex" - - def render_to_response(self, context, **response_kwargs): - zdrojak = render_to_string(self.get_template_names(), context) - - with tempfile.TemporaryDirectory() as tempdirfn: - tempdir = Path(tempdirfn) - with open(tempdir / "main.tex", "w") as texfile: - texfile.write(zdrojak) - for file in self.dalsi_potrebne_soubory: - shutil.copy(file, tempdir) - subprocess.call([self.tex, "main.tex"], cwd=tempdir, stdout=subprocess.DEVNULL) - - with open(tempdir / "main.pdf", "rb") as pdffile: - response = HttpResponse(pdffile.read(), content_type='application/pdf', **response_kwargs) - return response - - diff --git a/various/views/generic.py b/various/views/generic.py new file mode 100644 index 00000000..fe929716 --- /dev/null +++ b/various/views/generic.py @@ -0,0 +1,77 @@ +""" +Stejně jako je `django.views.generic` jsou zde generické Views +a pár mixinů, které upravují chování Views. +""" + +import http +import shutil +import subprocess +import tempfile + +from pathlib import Path + +from django.http import HttpResponse +from django.shortcuts import render +from django.template.loader import render_to_string +from django.views import generic + + +class NeprazdnyListView(generic.ListView): + """ + Použití jako generic.ListView, jen při prázdném listu vyhodí M&M stránku + s titlem `self.if_prazdny_title` a textem `self.if_prazdny_text` + a způsob renderování (např. CSV) lze změnit přepsáním metody render. + """ + allow_empty = False + if_prazdny_title = "V seznamu nic není" + if_prazdny_text = "V seznamu nic není. Zkus to napravit v adminu, nebo se zeptej webařů." + + # Skoro copy-paste generic.list.ListView.get, + # protože nemůžu chytat 404, neboť může nastat i v get_context_data + def get(self, request, *args, **kwargs): + self.object_list = self.get_queryset() + + if self.get_paginate_by(self.object_list) is not None and hasattr( + self.object_list, "exists" + ): + is_empty = not self.object_list.exists() + else: + is_empty = not self.object_list + if is_empty: + return render(request, 'universal.html', { + 'title': self.if_prazdny_title, + 'text': self.if_prazdny_text, + }, status=http.HTTPStatus.NOT_FOUND) + + return self.render(request, *args, **kwargs) + + # Tohle jsem vyčlenil, aby šlo generovat i něco jiného než template + def render(self, request, *args, **kwargs): + context = self.get_context_data() + return self.render_to_response(context) + + +class TeXResponseMixin: + """ + Mixin pro TemplateView, aby výsledek projel TeXem a vrátil rovnou PDF. + Obrázky a jiné soubory lze přidat nastavením `dalsi_potrebne_soubory` + (např. na `[django.contrib.staticfiles.finders.find('bla')]`, + nebo jiný seznam absolutních cest). + """ + dalsi_potrebne_soubory = [] + tex = "pdflatex" + + def render_to_response(self, context, **response_kwargs): + zdrojak = render_to_string(self.get_template_names(), context) + + with tempfile.TemporaryDirectory() as tempdirfn: + tempdir = Path(tempdirfn) + with open(tempdir / "main.tex", "w") as texfile: + texfile.write(zdrojak) + for file in self.dalsi_potrebne_soubory: + shutil.copy(file, tempdir) + subprocess.call([self.tex, "main.tex"], cwd=tempdir, stdout=subprocess.DEVNULL) + + with open(tempdir / "main.pdf", "rb") as pdffile: + response = HttpResponse(pdffile.read(), content_type='application/pdf', **response_kwargs) + return response From 11eb3c3665bc612d6a7285767b9130f12030a77f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Thu, 24 Oct 2024 11:51:28 +0200 Subject: [PATCH 5/7] =?UTF-8?q?Pohrobek=20splitu=20semin=C3=A1=C5=99e=20(p?= =?UTF-8?q?=C5=99edchoz=C3=ADho=20merge)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- soustredeni/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soustredeni/views.py b/soustredeni/views.py index 5da53d03..c91da036 100644 --- a/soustredeni/views.py +++ b/soustredeni/views.py @@ -6,7 +6,7 @@ from django.contrib.staticfiles.finders import find import csv import various.views.generic -from seminar.views import obalkyView +from personalni.views import obalkyView from .models import Soustredeni, Soustredeni_Ucastnici from various.models import Nastaveni From f01a808ac20835fa1db391480cb55c6a7c9bcaef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Tue, 12 Nov 2024 19:29:17 +0100 Subject: [PATCH 6/7] =?UTF-8?q?Koment=C3=A1=C5=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- various/views/generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/various/views/generic.py b/various/views/generic.py index 30342886..eac8c43a 100644 --- a/various/views/generic.py +++ b/various/views/generic.py @@ -52,7 +52,7 @@ class NeprazdnyListView(generic.ListView): s titlem `self.if_prazdny_title` a textem `self.if_prazdny_text` a způsob renderování (např. CSV) lze změnit přepsáním metody render. """ - allow_empty = False + allow_empty = False # Interní djangová věc if_prazdny_title = "V seznamu nic není" if_prazdny_text = "V seznamu nic není. Zkus to napravit v adminu, nebo se zeptej webařů." From 7e8092c30c074663e481d77f878d9e0cfbb02ae6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Tue, 12 Nov 2024 19:32:19 +0100 Subject: [PATCH 7/7] tex -> tex_prikaz --- various/views/generic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/various/views/generic.py b/various/views/generic.py index eac8c43a..98c6b880 100644 --- a/various/views/generic.py +++ b/various/views/generic.py @@ -89,7 +89,7 @@ class TeXResponseMixin: nebo jiný seznam absolutních cest). """ dalsi_potrebne_soubory = [] - tex = "pdflatex" + tex_prikaz = "pdflatex" def render_to_response(self, context, **response_kwargs): zdrojak = render_to_string(self.get_template_names(), context) @@ -100,7 +100,7 @@ class TeXResponseMixin: texfile.write(zdrojak) for file in self.dalsi_potrebne_soubory: shutil.copy(file, tempdir) - subprocess.call([self.tex, "main.tex"], cwd=tempdir, stdout=subprocess.DEVNULL) + subprocess.call([self.tex_prikaz, "main.tex"], cwd=tempdir, stdout=subprocess.DEVNULL) with open(tempdir / "main.pdf", "rb") as pdffile: response = HttpResponse(pdffile.read(), content_type='application/pdf', **response_kwargs)