Add Book.ancestor m2m.
[wolnelektury.git] / apps / reporting / utils.py
index 919e2ed..8ecb9b0 100755 (executable)
@@ -2,16 +2,12 @@
 # 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__)
 
@@ -25,10 +21,16 @@ def render_to_pdf(output_path, template, context=None, add_files=None):
     :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")
@@ -57,6 +59,27 @@ def render_to_pdf(output_path, template, context=None, add_files=None):
         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:
@@ -66,12 +89,15 @@ def read_chunks(f, size=8192):
 
 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:
@@ -79,7 +105,7 @@ def generated_file_view(file_name, mime_type, send_name=None, signals=None):
 
     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__"):
@@ -87,7 +113,7 @@ def generated_file_view(file_name, mime_type, send_name=None, signals=None):
             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):