From af7fca488f8af4ea50fe3eada0abe8da3fa44f89 Mon Sep 17 00:00:00 2001 From: mlen108 Date: Tue, 13 Nov 2012 16:59:12 +0000 Subject: Fix images path in PDFs --- wkhtmltopdf/views.py | 56 +++++++++++++++------------------------------------- 1 file changed, 16 insertions(+), 40 deletions(-) (limited to 'wkhtmltopdf/views.py') diff --git a/wkhtmltopdf/views.py b/wkhtmltopdf/views.py index 210ff0a..8068135 100644 --- a/wkhtmltopdf/views.py +++ b/wkhtmltopdf/views.py @@ -9,8 +9,7 @@ from django.template.response import TemplateResponse from django.utils.encoding import smart_str from django.views.generic import TemplateView -from .utils import (content_disposition_filename, override_settings, - pathname2fileurl, wkhtmltopdf) +from .utils import content_disposition_filename, pathname2fileurl, wkhtmltopdf class PDFResponse(HttpResponse): @@ -64,26 +63,29 @@ class PDFTemplateResponse(TemplateResponse, PDFResponse): cmd_options = {} self.cmd_options = cmd_options - self.override_settings = override_settings - def render_to_temporary_file(self, template_name, mode='w+b', bufsize=-1, suffix='.html', prefix='tmp', dir=None, delete=True): template = self.resolve_template(template_name) - # Since many things require a sensible settings.MEDIA_URL and - # settings.STATIC_URL, including TEMPLATE_CONTEXT_PROCESSORS; - # the settings themselves need to be overridden when rendering. - # - # This allows django-wkhtmltopdf to play nicely with the - # staticfiles app, for instance. - with override_settings(**self.get_override_settings()): - context = self.resolve_context(self.context_data) - content = smart_str(template.render(context)) + context = self.resolve_context(self.context_data) + content = smart_str(template.render(context)) + + # mattl: + # convert all MEDIA_ROOT files into a file://URL paths + # in order to correctly get it displayed in PDFs + # disclaimer: I know it sucks, but I haz no time for better solution now + media_root = settings.MEDIA_ROOT + if not media_root.endswith('/'): + media_root += '/' + relative_path = '/site_media/media/' + for x in re.findall('''"({0}.*?)"'''.format(relative_path), content): + content = content.replace(x, pathname2fileurl(media_root) + x[len(relative_path):]) tempfile = NamedTemporaryFile(mode=mode, bufsize=bufsize, suffix=suffix, prefix=prefix, dir=dir, delete=delete) + try: tempfile.write(content) tempfile.flush() @@ -150,31 +152,6 @@ class PDFTemplateResponse(TemplateResponse, PDFResponse): for f in filter(None, (input_file, header_file, footer_file)): f.close() - def get_override_settings(self): - """Returns a dictionary of settings to override for response_class""" - overrides = { - 'MEDIA_ROOT': settings.MEDIA_ROOT, - 'MEDIA_URL': settings.MEDIA_URL, - 'STATIC_ROOT': settings.STATIC_ROOT, - 'STATIC_URL': settings.STATIC_URL, - } - if self.override_settings is not None: - overrides.update(self.override_settings) - - has_scheme = re.compile(r'^[^:/]+://') - - # If MEDIA_URL doesn't have a scheme, we transform it into a - # file:// URL based on MEDIA_ROOT. - urls = [('MEDIA_URL', 'MEDIA_ROOT'), - ('STATIC_URL', 'STATIC_ROOT')] - for url, root in urls: - if not has_scheme.match(overrides[url]): - overrides[url] = pathname2fileurl(overrides[root]) - if not overrides[url].endswith('/'): - overrides[url] += '/' - - return overrides - class PDFTemplateView(TemplateView): """Class-based view for HTML templates rendered to PDF.""" @@ -228,7 +205,6 @@ class PDFTemplateView(TemplateView): """ filename = response_kwargs.pop('filename', None) cmd_options = response_kwargs.pop('cmd_options', None) - override_settings = response_kwargs.pop('override_settings', None) if issubclass(self.response_class, PDFTemplateResponse): if filename is None: @@ -241,7 +217,7 @@ class PDFTemplateView(TemplateView): context=context, filename=filename, header_template=self.header_template, footer_template=self.footer_template, - cmd_options=cmd_options, override_settings=override_settings, + cmd_options=cmd_options, **response_kwargs ) else: -- cgit v1.2.3 From d68d686208163adda4789609bb335982c5d480c4 Mon Sep 17 00:00:00 2001 From: mlen108 Date: Tue, 13 Nov 2012 17:10:26 +0000 Subject: Use MEDIA_URL instead of hard-coded string. --- wkhtmltopdf/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'wkhtmltopdf/views.py') diff --git a/wkhtmltopdf/views.py b/wkhtmltopdf/views.py index 8068135..6fe402f 100644 --- a/wkhtmltopdf/views.py +++ b/wkhtmltopdf/views.py @@ -78,7 +78,7 @@ class PDFTemplateResponse(TemplateResponse, PDFResponse): media_root = settings.MEDIA_ROOT if not media_root.endswith('/'): media_root += '/' - relative_path = '/site_media/media/' + relative_path = settings.MEDIA_URL for x in re.findall('''"({0}.*?)"'''.format(relative_path), content): content = content.replace(x, pathname2fileurl(media_root) + x[len(relative_path):]) -- cgit v1.2.3 From 7399977bbc2d72a8b3a3aed2c2fedb7ab8451af3 Mon Sep 17 00:00:00 2001 From: mlen108 Date: Tue, 13 Nov 2012 17:20:45 +0000 Subject: Match single/double quotes. --- wkhtmltopdf/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'wkhtmltopdf/views.py') diff --git a/wkhtmltopdf/views.py b/wkhtmltopdf/views.py index 6fe402f..ac406a3 100644 --- a/wkhtmltopdf/views.py +++ b/wkhtmltopdf/views.py @@ -79,7 +79,7 @@ class PDFTemplateResponse(TemplateResponse, PDFResponse): if not media_root.endswith('/'): media_root += '/' relative_path = settings.MEDIA_URL - for x in re.findall('''"({0}.*?)"'''.format(relative_path), content): + for x in re.findall('''["|']({0}.*?)["|']'''.format(relative_path), content): content = content.replace(x, pathname2fileurl(media_root) + x[len(relative_path):]) tempfile = NamedTemporaryFile(mode=mode, bufsize=bufsize, -- cgit v1.2.3 From 2cc80138a7167c5a6adbb75d1b58fd56872077fd Mon Sep 17 00:00:00 2001 From: mlen108 Date: Wed, 14 Nov 2012 16:32:18 +0000 Subject: Fix paths for STATIC media files --- wkhtmltopdf/views.py | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) (limited to 'wkhtmltopdf/views.py') diff --git a/wkhtmltopdf/views.py b/wkhtmltopdf/views.py index ac406a3..9ff5395 100644 --- a/wkhtmltopdf/views.py +++ b/wkhtmltopdf/views.py @@ -71,16 +71,7 @@ class PDFTemplateResponse(TemplateResponse, PDFResponse): context = self.resolve_context(self.context_data) content = smart_str(template.render(context)) - # mattl: - # convert all MEDIA_ROOT files into a file://URL paths - # in order to correctly get it displayed in PDFs - # disclaimer: I know it sucks, but I haz no time for better solution now - media_root = settings.MEDIA_ROOT - if not media_root.endswith('/'): - media_root += '/' - relative_path = settings.MEDIA_URL - for x in re.findall('''["|']({0}.*?)["|']'''.format(relative_path), content): - content = content.replace(x, pathname2fileurl(media_root) + x[len(relative_path):]) + content = self.make_absolute_paths(content) tempfile = NamedTemporaryFile(mode=mode, bufsize=bufsize, suffix=suffix, prefix=prefix, @@ -152,6 +143,32 @@ class PDFTemplateResponse(TemplateResponse, PDFResponse): for f in filter(None, (input_file, header_file, footer_file)): f.close() + def make_absolute_paths(self, content): + """Convert all MEDIA files into a file://URL paths in order to correctly get it displayed in PDFs + + mattl's disclaimer: I know it sucks, but it works and I haz no time for better solution now + """ + + overrides = [ + { + 'root': settings.MEDIA_ROOT, + 'url': settings.MEDIA_URL, + }, + { + 'root': settings.STATIC_ROOT, + 'url': settings.STATIC_URL, + } + ] + has_scheme = re.compile(r'^[^:/]+://') + + for x in overrides: + if not has_scheme.match(x['url']): + if not x['root'].endswith('/'): + x['root'] += '/' + for occur in re.findall('''["|']({0}.*?)["|']'''.format(x['url']), content): + content = content.replace(occur, pathname2fileurl(x['root']) + occur[len(x['url']):]) + return content + class PDFTemplateView(TemplateView): """Class-based view for HTML templates rendered to PDF.""" -- cgit v1.2.3 From a73a7fc34fa54b015370e87c51a51a5278280791 Mon Sep 17 00:00:00 2001 From: mlen108 Date: Wed, 14 Nov 2012 16:34:27 +0000 Subject: Tidy up a bit --- wkhtmltopdf/views.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'wkhtmltopdf/views.py') diff --git a/wkhtmltopdf/views.py b/wkhtmltopdf/views.py index 9ff5395..4d0ccca 100644 --- a/wkhtmltopdf/views.py +++ b/wkhtmltopdf/views.py @@ -162,11 +162,15 @@ class PDFTemplateResponse(TemplateResponse, PDFResponse): has_scheme = re.compile(r'^[^:/]+://') for x in overrides: - if not has_scheme.match(x['url']): - if not x['root'].endswith('/'): - x['root'] += '/' - for occur in re.findall('''["|']({0}.*?)["|']'''.format(x['url']), content): - content = content.replace(occur, pathname2fileurl(x['root']) + occur[len(x['url']):]) + if has_scheme.match(x['url']): + continue + + if not x['root'].endswith('/'): + x['root'] += '/' + + for occur in re.findall('''["|']({0}.*?)["|']'''.format(x['url']), content): + content = content.replace(occur, pathname2fileurl(x['root']) + occur[len(x['url']):]) + return content -- cgit v1.2.3