From 9cdb5731017f24d119d8403c0b220f42412bd348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Luiz?= Date: Wed, 7 Dec 2016 22:29:47 -0200 Subject: [PATCH 1/4] make_absolute_paths don't depend anymore on STATIC_URL It now uses STATICFILES_FINDERS to resolve paths for static and media files. --- wkhtmltopdf/utils.py | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/wkhtmltopdf/utils.py b/wkhtmltopdf/utils.py index c871bd0..b169cc0 100644 --- a/wkhtmltopdf/utils.py +++ b/wkhtmltopdf/utils.py @@ -19,6 +19,7 @@ import django from django.conf import settings +from django.contrib.staticfiles import finders from django.template.context import Context, RequestContext from django.utils import six @@ -109,6 +110,7 @@ def wkhtmltopdf(pages, output=None, **kwargs): return check_output(ck_args, **ck_kwargs) + def convert_to_pdf(filename, header_filename=None, footer_filename=None, cmd_options=None): # Clobber header_html and footer_html only if filenames are # provided. These keys may be in self.cmd_options as hardcoded @@ -123,6 +125,7 @@ def convert_to_pdf(filename, header_filename=None, footer_filename=None, cmd_opt cmd_options['footer_html'] = footer_filename return wkhtmltopdf(pages=filename, **cmd_options) + class RenderedFile(object): """ Create a temporary file resource of the rendered template with context. @@ -148,6 +151,7 @@ def __del__(self): if self.temporary_file is not None: self.temporary_file.close() + def render_pdf_from_template(input_template, header_template, footer_template, context, request=None, cmd_options=None): # For basic usage. Performs all the actions necessary to create a single # page PDF from a single template and context. @@ -185,6 +189,7 @@ def render_pdf_from_template(input_template, header_template, footer_template, c footer_filename=footer_filename, cmd_options=cmd_options) + def content_disposition_filename(filename): """ Sanitize a file name to be used in the Content-Disposition HTTP @@ -228,34 +233,24 @@ def make_absolute_paths(content): """Convert all MEDIA files into a file://URL paths in order to correctly get it displayed in PDFs.""" overrides = [ - { - 'root': settings.MEDIA_ROOT, - 'url': settings.MEDIA_URL, - }, - { - 'root': settings.STATIC_ROOT, - 'url': settings.STATIC_URL, - } + settings.MEDIA_URL, + settings.STATIC_URL, ] - has_scheme = re.compile(r'^[^:/]+://') for x in overrides: - if not x['url'] or has_scheme.match(x['url']): - continue - - if not x['root'].endswith('/'): - x['root'] += '/' - occur_pattern = '''["|']({0}.*?)["|']''' - occurences = re.findall(occur_pattern.format(x['url']), content) + occurences = re.findall(occur_pattern.format(x), content) occurences = list(set(occurences)) # Remove dups + for occur in occurences: - content = content.replace(occur, - pathname2fileurl(x['root']) + - occur[len(x['url']):]) + filename = occur[len(x):] + pathname = finders.find(filename, all=False) + + content = content.replace(occur, pathname2fileurl(pathname)) return content + def render_to_temporary_file(template, context, request=None, mode='w+b', bufsize=-1, suffix='.html', prefix='tmp', dir=None, delete=True): From 28cd0835ed8f862d2afae21791c6e5d5c77cdf7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Luiz?= Date: Wed, 7 Dec 2016 22:33:42 -0200 Subject: [PATCH 2/4] Non existing files don't break anymore (again?) --- wkhtmltopdf/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wkhtmltopdf/utils.py b/wkhtmltopdf/utils.py index b169cc0..bb71b59 100644 --- a/wkhtmltopdf/utils.py +++ b/wkhtmltopdf/utils.py @@ -246,7 +246,8 @@ def make_absolute_paths(content): filename = occur[len(x):] pathname = finders.find(filename, all=False) - content = content.replace(occur, pathname2fileurl(pathname)) + if pathname: + content = content.replace(occur, pathname2fileurl(pathname)) return content From 79fac084fa90ff39ec1923f5ea8dffc375dcd9be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Luiz?= Date: Wed, 7 Dec 2016 22:49:42 -0200 Subject: [PATCH 3/4] Backs with has_scheme verification --- wkhtmltopdf/utils.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/wkhtmltopdf/utils.py b/wkhtmltopdf/utils.py index bb71b59..3f7813a 100644 --- a/wkhtmltopdf/utils.py +++ b/wkhtmltopdf/utils.py @@ -237,7 +237,12 @@ def make_absolute_paths(content): settings.STATIC_URL, ] + has_scheme = re.compile(r'^[^:/]+://') + for x in overrides: + if has_scheme.match(x): + continue + occur_pattern = '''["|']({0}.*?)["|']''' occurences = re.findall(occur_pattern.format(x), content) occurences = list(set(occurences)) # Remove dups From cdcde5650ddd86ed201a8cc88e44f43758af8446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Luiz?= Date: Sun, 26 Mar 2017 18:13:26 -0300 Subject: [PATCH 4/4] Fix tests for static files --- wkhtmltopdf/tests/run.py | 2 +- wkhtmltopdf/tests/templates/footer.html | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/wkhtmltopdf/tests/run.py b/wkhtmltopdf/tests/run.py index 4ff7f9e..2a6cda5 100644 --- a/wkhtmltopdf/tests/run.py +++ b/wkhtmltopdf/tests/run.py @@ -30,7 +30,7 @@ MEDIA_URL='/media/', STATIC_ROOT=os.path.join(DIRNAME, 'static'), STATIC_URL='/static/', - TEMPLATES = [ # For Django >= 1.10. Ignored in lower versions + TEMPLATES=[ # For Django >= 1.10. Ignored in lower versions { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': True, diff --git a/wkhtmltopdf/tests/templates/footer.html b/wkhtmltopdf/tests/templates/footer.html index 9deaf30..18ac4f5 100644 --- a/wkhtmltopdf/tests/templates/footer.html +++ b/wkhtmltopdf/tests/templates/footer.html @@ -1,4 +1,5 @@ {% load static %} - - + + +