diff options
author | Padraic Harley <padraic.harley@ecometrica.com> | 2015-12-18 19:33:32 +0000 |
---|---|---|
committer | Padraic Harley <padraic.harley@ecometrica.com> | 2015-12-18 19:33:40 +0000 |
commit | c51068cd1864d995e81ee5fd248b8a2027e56c35 (patch) | |
tree | 2513bea67f69056e74385f55f8f3e10d9dcbaabf /wkhtmltopdf | |
parent | 87be0aaafb59fca5540a300c8e6262fbe023fce5 (diff) | |
download | django-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.py | 20 | ||||
-rw-r--r-- | wkhtmltopdf/utils.py | 6 |
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()) |