actesweb: work-around not latin15 encodable characters (fixes #30995)
This commit is contained in:
parent
a7ad6bda4b
commit
f2e7add34b
|
@ -29,7 +29,8 @@ Depends: ${python:Depends},
|
||||||
python-pyproj,
|
python-pyproj,
|
||||||
python-pil,
|
python-pil,
|
||||||
python-zeep,
|
python-zeep,
|
||||||
python-jsonschema
|
python-jsonschema,
|
||||||
|
python-unidecode
|
||||||
Recommends: python-soappy, python-phpserialize
|
Recommends: python-soappy, python-phpserialize
|
||||||
Description: Uniform access to multiple data sources and services (Python module)
|
Description: Uniform access to multiple data sources and services (Python module)
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ from django.utils.translation import ugettext_lazy as _
|
||||||
from passerelle.base.models import BaseResource
|
from passerelle.base.models import BaseResource
|
||||||
from passerelle.utils.api import endpoint
|
from passerelle.utils.api import endpoint
|
||||||
from passerelle.utils.jsonresponse import APIError
|
from passerelle.utils.jsonresponse import APIError
|
||||||
|
from passerelle.utils.conversion import ensure_encoding
|
||||||
|
|
||||||
|
|
||||||
@contextlib.contextmanager
|
@contextlib.contextmanager
|
||||||
|
@ -80,6 +81,9 @@ class ActesWeb(BaseResource):
|
||||||
else:
|
else:
|
||||||
os.makedirs(tmp_dir)
|
os.makedirs(tmp_dir)
|
||||||
|
|
||||||
|
# ensure demand_content can be encoded to latin15
|
||||||
|
demand_content = ensure_encoding(demand_content, 'iso-8859-15')
|
||||||
|
|
||||||
filename = '%s.DEM' % now().strftime('%Y-%m-%d_%H-%M-%S_%f')
|
filename = '%s.DEM' % now().strftime('%Y-%m-%d_%H-%M-%S_%f')
|
||||||
filepath = os.path.join(self.basepath, filename)
|
filepath = os.path.join(self.basepath, filename)
|
||||||
with named_tempfile(dir=tmp_dir, suffix='.DEM', delete=False) as tpf:
|
with named_tempfile(dir=tmp_dir, suffix='.DEM', delete=False) as tpf:
|
||||||
|
|
|
@ -14,9 +14,12 @@
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import re
|
||||||
|
import unicodedata
|
||||||
import warnings
|
import warnings
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
|
|
||||||
|
import unidecode
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
|
||||||
|
|
||||||
|
@ -37,3 +40,25 @@ def to_pdf(content):
|
||||||
out = StringIO()
|
out = StringIO()
|
||||||
image.save(out, format='PDF')
|
image.save(out, format='PDF')
|
||||||
return out.getvalue()
|
return out.getvalue()
|
||||||
|
|
||||||
|
|
||||||
|
# copied from
|
||||||
|
# https://stackoverflow.com/questions/10294032/python-replace-typographical-quotes-dashes-etc-with-their-ascii-counterparts
|
||||||
|
def char_filter(string):
|
||||||
|
'''Fallback to ASCII char if found'''
|
||||||
|
latin = re.compile('[a-zA-Z]+')
|
||||||
|
for char in unicodedata.normalize('NFC', string):
|
||||||
|
decoded = unidecode.unidecode(char)
|
||||||
|
if latin.match(decoded):
|
||||||
|
yield char
|
||||||
|
else:
|
||||||
|
yield decoded
|
||||||
|
|
||||||
|
|
||||||
|
def clean_string(string):
|
||||||
|
return "".join(char_filter(string))
|
||||||
|
|
||||||
|
|
||||||
|
def ensure_encoding(s, encoding):
|
||||||
|
s = clean_string(s)
|
||||||
|
return s.encode(encoding, 'replace').decode(encoding)
|
||||||
|
|
Loading…
Reference in New Issue