diff --git a/CHANGELOG.md b/CHANGELOG.md index 7892ddc..44c8125 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ Roadmap / TODO: - Support additionnal methods of api - Write tests +# 0.3.4 2018-11-26 + - DPD convert characters to ASCII (because issues on labels) + # 0.3.3 2018-02-19 - Geodis force ASCII conversion for EDI. diff --git a/VERSION b/VERSION index 1c09c74..42045ac 100755 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.3.3 +0.3.4 diff --git a/roulier/api.py b/roulier/api.py index 42b3e42..6ed83c1 100644 --- a/roulier/api.py +++ b/roulier/api.py @@ -35,6 +35,42 @@ def _normalize_coerce_zpl(self, value): val = val.replace("%c" % ctrl, "") return val + def _normalize_coerce_accents(self, value): + """Sanitize accents for some WS.""" + if not isinstance(value, basestring): + return value + sanitized = ( + value + # quick and dirty replacement + # of common accentued chars in french + # because some ws don't handle well utf8 + .replace(u"é", "e") + .replace(u"è", "e") + .replace(u"ë", "e") + .replace(u"ê", "e") + .replace(u"ô", "o") + .replace(u"ï", "i") + .replace(u"ö", "o") + .replace(u"à", "a") + .replace(u"â", "a") + .replace(u"ç", "c") + .replace(u"û", "u") + .replace(u"ù", "u") + .replace(u"É", "E") + .replace(u"È", "E") + .replace(u"Ë", "E") + .replace(u"Ê", "E") + .replace(u"Ô", "O") + .replace(u"Ï", "I") + .replace(u"Ö", "O") + .replace(u"À", "A") + .replace(u"Â", "A") + .replace(u"Ç", "C") + .replace(u"Û", "U") + .replace(u"Ù", "U") + ).encode('ascii', 'ignore') # cut remaining chars + return sanitized + class Api(object): """Define expected fields of carriers. diff --git a/roulier/carriers/dpd/dpd_api.py b/roulier/carriers/dpd/dpd_api.py index 44b41fd..8f2c8eb 100644 --- a/roulier/carriers/dpd/dpd_api.py +++ b/roulier/carriers/dpd/dpd_api.py @@ -71,10 +71,13 @@ def _address(self): def _to_address(self): schema = super(DpdApi, self)._to_address() - schema['firstName'] = {'default': '', 'description': """First name"""} + schema['firstName'] = {'default': '', 'description': """First name""", + 'coerce': 'accents'} schema['door1'] = {'default': '', 'description': """Door code 1"""} schema['door2'] = {'default': '', 'description': """Door code 2"""} schema['intercom'] = {'default': '', 'description': """Intercom"""} + for field in ['city', 'company', 'name', 'street1', 'street2']: + schema[field].update({ 'coerce': 'accents'}) return schema def _from_address(self): diff --git a/roulier/carriers/geodis/geodis_api_edi.py b/roulier/carriers/geodis/geodis_api_edi.py index 56af3f3..a15c713 100644 --- a/roulier/carriers/geodis/geodis_api_edi.py +++ b/roulier/carriers/geodis/geodis_api_edi.py @@ -102,9 +102,13 @@ def _shipments(self): } def _schemas(self): - return { + schemas = { 'service': self._service(), 'shipments': self._shipments(), 'agency_address': self._from_address(), 'from_address': self._from_address(), } + for schema in schemas: + for field in schemas[schema]: + schemas[schema][field].update({'coerce': 'accents'}) + return schemas diff --git a/roulier/carriers/geodis/geodis_transport_edi.py b/roulier/carriers/geodis/geodis_transport_edi.py index 2db8074..d67a13f 100644 --- a/roulier/carriers/geodis/geodis_transport_edi.py +++ b/roulier/carriers/geodis/geodis_transport_edi.py @@ -63,34 +63,6 @@ def sanitize(token): .replace("'", " ") .replace("+", " ") .replace(":", " ") - # quick and dirty replacement - # of common accentued chars in french - # because geodis don't handle well utf8 - # TODO: put it in api coerce - .replace(u"é", "e") - .replace(u"è", "e") - .replace(u"ë", "e") - .replace(u"ê", "e") - .replace(u"ô", "o") - .replace(u"ï", "i") - .replace(u"ö", "o") - .replace(u"à", "a") - .replace(u"â", "a") - .replace(u"ç", "c") - .replace(u"û", "u") - .replace(u"ù", "u") - .replace(u"É", "E") - .replace(u"È", "E") - .replace(u"Ë", "E") - .replace(u"Ê", "E") - .replace(u"Ô", "O") - .replace(u"Ï", "I") - .replace(u"Ö", "O") - .replace(u"À", "A") - .replace(u"Â", "A") - .replace(u"Ç", "C") - .replace(u"Û", "U") - .replace(u"Ù", "U") ).encode('ascii', 'ignore') # cut remaining chars return sanitized