aboutsummaryrefslogtreecommitdiffstats
path: root/wkhtmltopdf
diff options
context:
space:
mode:
authorPadraic Harley <padraic.harley@ecometrica.com>2015-12-18 19:33:32 +0000
committerPadraic Harley <padraic.harley@ecometrica.com>2015-12-18 19:33:40 +0000
commitc51068cd1864d995e81ee5fd248b8a2027e56c35 (patch)
tree2513bea67f69056e74385f55f8f3e10d9dcbaabf /wkhtmltopdf
parent87be0aaafb59fca5540a300c8e6262fbe023fce5 (diff)
downloaddjango-wkhtmltopdf-c51068cd1864d995e81ee5fd248b8a2027e56c35.tar.gz
django-wkhtmltopdf-c51068cd1864d995e81ee5fd248b8a2027e56c35.tar.bz2
django-wkhtmltopdf-c51068cd1864d995e81ee5fd248b8a2027e56c35.zip
Fix unidecode bytes error on python2
`bytes` takes no additional args in python2 unlike it's taking an encoding in python3. Unidecode returns a unicode string in python3 and a bytestring in python2 which, I believe, was the main cause of error #71. Now, regardless of whether unidecode is included, all strings passing through http_quote will be encoded to ascii which should fix both issues. Also included is a fix for a failing test when unidecode is used. Unidecode's `_unidecode` function ignores characters greater than 0xefff, which '\xe2\x99\xa5' (the heart symbol) is. This caused users with unidecode to fail '.pdf' was produced rather than the expected '?.pdf'.
Diffstat (limited to 'wkhtmltopdf')
-rw-r--r--wkhtmltopdf/tests/tests.py20
-rw-r--r--wkhtmltopdf/utils.py6
2 files changed, 20 insertions, 6 deletions
diff --git a/wkhtmltopdf/tests/tests.py b/wkhtmltopdf/tests/tests.py
index c15d88f..fc1545d 100644
--- a/wkhtmltopdf/tests/tests.py
+++ b/wkhtmltopdf/tests/tests.py
@@ -130,8 +130,14 @@ class TestViews(TestCase):
self.assertEqual(response['Content-Disposition'],
'attachment; filename="4\'5.pdf"')
response = PDFResponse(content=content, filename=u"♥.pdf")
- self.assertEqual(response['Content-Disposition'],
- 'attachment; filename="?.pdf"')
+ try:
+ import unidecode
+ except ImportError:
+ self.assertEqual(response['Content-Disposition'],
+ 'attachment; filename="?.pdf"')
+ else:
+ self.assertEqual(response['Content-Disposition'],
+ 'attachment; filename=".pdf"')
# Content as a direct output
response = PDFResponse(content=content, filename="nospace.pdf",
@@ -148,8 +154,14 @@ class TestViews(TestCase):
'inline; filename="4\'5.pdf"')
response = PDFResponse(content=content, filename=u"♥.pdf",
show_content_in_browser=True)
- self.assertEqual(response['Content-Disposition'],
- 'inline; filename="?.pdf"')
+ try:
+ import unidecode
+ except ImportError:
+ self.assertEqual(response['Content-Disposition'],
+ 'inline; filename="?.pdf"')
+ else:
+ self.assertEqual(response['Content-Disposition'],
+ 'inline; filename=".pdf"')
# Content-Type
response = PDFResponse(content=content,
diff --git a/wkhtmltopdf/utils.py b/wkhtmltopdf/utils.py
index 3d125bb..f002066 100644
--- a/wkhtmltopdf/utils.py
+++ b/wkhtmltopdf/utils.py
@@ -186,9 +186,11 @@ def http_quote(string):
if isinstance(string, six.text_type):
try:
import unidecode
- string = bytes(unidecode.unidecode(string), 'ascii')
except ImportError:
- string = string.encode('ascii', 'replace')
+ pass
+ else:
+ string = unidecode.unidecode(string)
+ string = string.encode('ascii', 'replace')
# Wrap in double-quotes for ; , and the like
string = string.replace(b'\\', b'\\\\').replace(b'"', b'\\"')
return '"{0!s}"'.format(string.decode())