# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
#
+from errno import ENOENT
import os
import os.path
-import shutil
-import subprocess
-from tempfile import mkdtemp
-from StringIO import StringIO
from django.conf import settings
import logging
from django.http import HttpResponse
-from django.template.loader import render_to_string
logger = logging.getLogger(__name__)
:param dict add_files: a dictionary of additional files XeTeX will need
"""
+ from StringIO import StringIO
+ import shutil
+ from tempfile import mkdtemp
+ import subprocess
import Texml.processor
+ from django.template.loader import render_to_string
+
rendered = render_to_string(template, context)
texml = StringIO(rendered.encode('utf-8'))
- tempdir = mkdtemp(prefix = "render_to_pdf-")
+ tempdir = mkdtemp(prefix="render_to_pdf-")
tex_path = os.path.join(tempdir, "doc.tex")
with open(tex_path, 'w') as tex_file:
Texml.processor.process(texml, tex_file, encoding="utf-8")
shutil.rmtree(tempdir)
+def render_to_csv(output_path, template, context=None, add_files=None):
+ """Renders a TeXML document into a PDF file.
+
+ :param str output_path: is where the PDF file should go
+ :param str template: is a TeXML template path
+ :param context: is context for rendering the template
+ :param dict add_files: a dictionary of additional files XeTeX will need
+ """
+
+ from django.template.loader import render_to_string
+
+ try:
+ os.makedirs(os.path.dirname(output_path))
+ except:
+ pass
+
+ rendered = render_to_string(template, context)
+ with open(output_path, 'w') as csv_file:
+ csv_file.write(rendered.encode('utf-8'))
+
+
def read_chunks(f, size=8192):
chunk = f.read(size)
while chunk:
def generated_file_view(file_name, mime_type, send_name=None, signals=None):
file_path = os.path.join(settings.MEDIA_ROOT, file_name)
- file_url = os.path.join(settings.MEDIA_URL, file_name)
if send_name is None:
send_name = os.path.basename(file_name)
def signal_handler(*args, **kwargs):
- os.unlink(file_path)
+ try:
+ os.unlink(file_path)
+ except OSError as oe:
+ if oe.errno != ENOENT:
+ raise oe
if signals:
for signal in signals:
def decorator(func):
def view(request, *args, **kwargs):
- if not os.path.exists(file_path) or True:
+ if not os.path.exists(file_path):
func(file_path, *args, **kwargs)
if hasattr(send_name, "__call__"):
else:
name = send_name
- response = HttpResponse(mimetype=mime_type)
+ response = HttpResponse(content_type=mime_type)
response['Content-Disposition'] = 'attachment; filename=%s' % name
with open(file_path) as f:
for chunk in read_chunks(f):