From 1ef81459f5c69a221ed5fa57f21068a540ddd39c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Laur=C3=A9line=20Gu=C3=A9rin?= <zebuline@entrouvert.com>
Date: Thu, 17 Mar 2022 16:54:24 +0100
Subject: [PATCH 07/65] misc: fix redundant-u-string-prefix pylint error
 (#62099)

---
 passerelle/apps/actesweb/models.py           |   2 +-
 passerelle/apps/airquality/models.py         |   2 +-
 passerelle/apps/api_entreprise/models.py     |   6 +-
 passerelle/apps/api_particulier/models.py    |   6 +-
 passerelle/apps/arpege_ecp/models.py         |  16 +--
 passerelle/apps/astre_rest/models.py         |   2 +-
 passerelle/apps/astregs/models.py            |   2 +-
 passerelle/apps/atos_genesys/models.py       |   8 +-
 passerelle/apps/cartads_cs/models.py         |   4 +-
 passerelle/apps/choosit/models.py            |  16 +--
 passerelle/apps/cityweb/models.py            |   2 +-
 passerelle/apps/csvdatasource/models.py      |  10 +-
 passerelle/apps/family/models.py             |   2 +-
 passerelle/apps/gesbac/models.py             |   2 +-
 passerelle/apps/maelis/models.py             |   2 +-
 passerelle/apps/mdel/models.py               |   2 +-
 passerelle/apps/opengis/models.py            |   6 +-
 passerelle/apps/sp_fr/models.py              |  30 ++---
 passerelle/apps/vivaticket/models.py         |   2 +-
 passerelle/base/models.py                    |  10 +-
 passerelle/base/views.py                     |   4 +-
 passerelle/contrib/dpark/models.py           |   4 +-
 passerelle/contrib/esirius_swi/models.py     |   2 +-
 passerelle/contrib/greco/models.py           |   2 +-
 passerelle/contrib/mdph13/models.py          |  12 +-
 passerelle/contrib/solis_apa/conciliation.py |   4 +-
 passerelle/contrib/solis_apa/models.py       |  56 +++++-----
 passerelle/contrib/solis_apa/suivi.py        |   4 +-
 passerelle/contrib/teamnet_axel/models.py    |   4 +-
 passerelle/contrib/toulouse_axel/models.py   |   2 +-
 passerelle/sms/models.py                     |   4 +-
 passerelle/utils/conversion.py               |   2 +-
 passerelle/utils/xml.py                      |   2 +-
 tests/conftest.py                            |   2 +-
 tests/test_api_entreprise.py                 |   2 +-
 tests/test_api_particulier.py                |   2 +-
 tests/test_arpege_ecp.py                     |   2 +-
 tests/test_atal.py                           |   2 +-
 tests/test_atos_genesys.py                   |  50 ++++-----
 tests/test_availability.py                   |   2 +-
 tests/test_base_adresse.py                   |  38 +++----
 tests/test_cartads_cs.py                     |  96 ++++++++--------
 tests/test_csv_datasource.py                 |   4 +-
 tests/test_dpark.py                          |  42 +++----
 tests/test_feeds.py                          |   2 +-
 tests/test_gdema.py                          |  14 +--
 tests/test_generic_endpoint.py               |   6 +-
 tests/test_grenoble_gru.py                   |  10 +-
 tests/test_iws.py                            |   4 +-
 tests/test_lille_kimoce.py                   |   2 +-
 tests/test_okina.py                          |  18 +--
 tests/test_opendatasoft.py                   |   8 +-
 tests/test_opengis.py                        |   2 +-
 tests/test_photon.py                         |   2 +-
 tests/test_planitech.py                      | 110 +++++++++----------
 tests/test_proxylogger.py                    |  28 ++---
 tests/test_requests.py                       |   8 +-
 tests/test_signature.py                      |   4 +-
 tests/test_soap.py                           |   2 +-
 tests/test_solis.py                          |  10 +-
 tests/test_strasbourg_eu.py                  |  22 ++--
 tests/test_teamnet_axel.py                   |   2 +-
 tests/test_toulouse_axel.py                  |   2 +-
 tests/wcs/conftest.py                        |   4 +-
 tests/wcs/test_conftest.py                   |   2 +-
 tests/wcs/test_sp_fr.py                      |   4 +-
 66 files changed, 370 insertions(+), 372 deletions(-)

diff --git a/passerelle/apps/actesweb/models.py b/passerelle/apps/actesweb/models.py
index b3a66ac1..61c6cbeb 100644
--- a/passerelle/apps/actesweb/models.py
+++ b/passerelle/apps/actesweb/models.py
@@ -44,7 +44,7 @@ class ActesWeb(BaseResource):
     category = _('Civil Status Connectors')
 
     class Meta:
-        verbose_name = u"ActesWeb - Demande d'acte d'état civil"
+        verbose_name = "ActesWeb - Demande d'acte d'état civil"
 
     @property
     def basepath(self):
diff --git a/passerelle/apps/airquality/models.py b/passerelle/apps/airquality/models.py
index 6371a7e2..eae5cec8 100644
--- a/passerelle/apps/airquality/models.py
+++ b/passerelle/apps/airquality/models.py
@@ -29,7 +29,7 @@ from passerelle.utils.jsonresponse import APIError
 class AirQuality(BaseResource):
     category = _('Misc')
     api_description = _(
-        u'''
+        '''
         This API provides a unique format for the air quality data of various places.
         (But only supports the Rhône-Alpes region for now).
         '''
diff --git a/passerelle/apps/api_entreprise/models.py b/passerelle/apps/api_entreprise/models.py
index 53886d98..991e9c49 100644
--- a/passerelle/apps/api_entreprise/models.py
+++ b/passerelle/apps/api_entreprise/models.py
@@ -101,13 +101,13 @@ class APIEntreprise(BaseResource):
         try:
             response = self.requests.get(url, data=params, cache_duration=300)
         except requests.RequestException as e:
-            raise APIError(u'API-entreprise connection error: %s' % exception_to_text(e), data=[])
+            raise APIError('API-entreprise connection error: %s' % exception_to_text(e), data=[])
         try:
             data = response.json()
         except ValueError as e:
             content = response.text[:1000]
             raise APIError(
-                u'API-entreprise returned non-JSON content with status %s: %s'
+                'API-entreprise returned non-JSON content with status %s: %s'
                 % (response.status_code, content),
                 data={
                     'status_code': response.status_code,
@@ -122,7 +122,7 @@ class APIEntreprise(BaseResource):
                     'err_desc': data.get('message', 'not-found'),
                 }
             raise APIError(
-                u'API-entreprise returned a non 200 status %s: %s' % (response.status_code, data),
+                'API-entreprise returned a non 200 status %s: %s' % (response.status_code, data),
                 data={
                     'status_code': response.status_code,
                     'content': data,
diff --git a/passerelle/apps/api_particulier/models.py b/passerelle/apps/api_particulier/models.py
index 08111468..a11f19cb 100644
--- a/passerelle/apps/api_particulier/models.py
+++ b/passerelle/apps/api_particulier/models.py
@@ -92,7 +92,7 @@ class APIParticulier(BaseResource):
             response = self.requests.get(url, headers=headers, timeout=5, **kwargs)
         except requests.RequestException as e:
             raise APIError(
-                u'API-particulier platform "%s" connection error: %s' % (self.platform, exception_to_text(e)),
+                'API-particulier platform "%s" connection error: %s' % (self.platform, exception_to_text(e)),
                 log_error=True,
                 data={
                     'code': 'connection-error',
@@ -105,7 +105,7 @@ class APIParticulier(BaseResource):
         except JSONDecodeError as e:
             content = repr(response.content[:1000])
             raise APIError(
-                u'API-particulier platform "%s" returned non-JSON content with status %s: %s'
+                'API-particulier platform "%s" returned non-JSON content with status %s: %s'
                 % (self.platform, response.status_code, content),
                 log_error=True,
                 data={
@@ -135,7 +135,7 @@ class APIParticulier(BaseResource):
                     }
                 raise APIError(message, data=error_data)
             raise APIError(
-                u'API-particulier platform "%s" returned a non 200 status %s: %s'
+                'API-particulier platform "%s" returned a non 200 status %s: %s'
                 % (self.platform, response.status_code, data),
                 log_error=True,
                 data={
diff --git a/passerelle/apps/arpege_ecp/models.py b/passerelle/apps/arpege_ecp/models.py
index fd54d011..bf0823b8 100644
--- a/passerelle/apps/arpege_ecp/models.py
+++ b/passerelle/apps/arpege_ecp/models.py
@@ -59,18 +59,18 @@ class ArpegeECP(BaseResource):
             )
             response.raise_for_status()
         except RequestException as e:
-            raise APIError(u'Arpege server is down: %s' % e)
+            raise APIError('Arpege server is down: %s' % e)
         try:
             result = response.json()
         except ValueError:
-            raise APIError(u'Arpege server is down: no JSON content returned, %r' % response.content[:1000])
+            raise APIError('Arpege server is down: no JSON content returned, %r' % response.content[:1000])
         if result.get('Data'):
             if 'AccessToken' not in result['Data']:
-                raise APIError(u'Error on LoginParSubOIDC: missing Data/AccessToken')
+                raise APIError('Error on LoginParSubOIDC: missing Data/AccessToken')
             if not isinstance(result['Data']['AccessToken'], six.string_types):
-                raise APIError(u'Error on LoginParSubOIDC: Data/AccessToken is not string')
+                raise APIError('Error on LoginParSubOIDC: Data/AccessToken is not string')
             return result['Data']['AccessToken']
-        raise APIError(u'%s (%s)' % (result.get('LibErreur'), result.get('CodErreur')))
+        raise APIError('%s (%s)' % (result.get('LibErreur'), result.get('CodErreur')))
 
     @endpoint(
         name='api',
@@ -87,12 +87,12 @@ class ArpegeECP(BaseResource):
             response = self.requests.get(url, params=params, auth=auth)
             response.raise_for_status()
         except RequestException as e:
-            raise APIError(u'Arpege server is down: %s' % e)
+            raise APIError('Arpege server is down: %s' % e)
         data = []
         try:
             result = response.json()
         except ValueError:
-            raise APIError(u'No JSON content returned: %r' % response.content[:1000])
+            raise APIError('No JSON content returned: %r' % response.content[:1000])
         if not result.get('Data'):
             raise APIError("%s (%s)" % (result.get('LibErreur'), result.get('CodErreur')))
         for demand in result['Data']['results']:
@@ -101,7 +101,7 @@ class ArpegeECP(BaseResource):
                 receipt_time = parse_time(data_administratives['heure_depot'])
                 receipt_date = parse_date(data_administratives['date_depot'])
             except (KeyError, TypeError) as e:
-                raise APIError(u'Arpege error: %s %r' % (e, json.dumps(demand)[:1000]))
+                raise APIError('Arpege error: %s %r' % (e, json.dumps(demand)[:1000]))
             d = {
                 'url': demand['url'],
                 'title': data_administratives.get('LibelleQualificationTypeDemande'),
diff --git a/passerelle/apps/astre_rest/models.py b/passerelle/apps/astre_rest/models.py
index 6481cd80..cf37ebb5 100644
--- a/passerelle/apps/astre_rest/models.py
+++ b/passerelle/apps/astre_rest/models.py
@@ -179,7 +179,7 @@ class AstreREST(BaseResource):
     category = _('Business Process Connectors')
 
     class Meta:
-        verbose_name = u'Astre REST'
+        verbose_name = 'Astre REST'
 
     def check_status(self):
         self._astre_call('astre/webservices/gf/documents/referentiel/typedocument/list/json')
diff --git a/passerelle/apps/astregs/models.py b/passerelle/apps/astregs/models.py
index 6e78d41b..b249bc4c 100644
--- a/passerelle/apps/astregs/models.py
+++ b/passerelle/apps/astregs/models.py
@@ -447,7 +447,7 @@ class AstreGS(BaseResource):
     log_requests_errors = False
 
     class Meta:
-        verbose_name = u'AstresGS'
+        verbose_name = 'AstresGS'
 
     def check_status(self):
         response = self.requests.get(self.wsdl_base_url)
diff --git a/passerelle/apps/atos_genesys/models.py b/passerelle/apps/atos_genesys/models.py
index 40547efe..bec73049 100644
--- a/passerelle/apps/atos_genesys/models.py
+++ b/passerelle/apps/atos_genesys/models.py
@@ -150,7 +150,7 @@ class Resource(BaseResource, HTTPResource):
         parameters={
             'category': {
                 'description': _('Category of codification'),
-                'example_value': u'MOT_APA',
+                'example_value': 'MOT_APA',
             }
         },
     )
@@ -283,7 +283,7 @@ class Resource(BaseResource, HTTPResource):
         # create CIVILITE
         for identification in d.get('IDENTIFICATION', []):
             sexe = identification.get('SEXE', '')
-            identification['CIVILITE'] = {'M': u'Monsieur', 'F': u'Madame'}.get(sexe, '')
+            identification['CIVILITE'] = {'M': 'Monsieur', 'F': 'Madame'}.get(sexe, '')
         return d
 
     @endpoint(
@@ -327,7 +327,7 @@ class Resource(BaseResource, HTTPResource):
             data.append(
                 {
                     'id': str(link.id),
-                    'text': u' '.join(text_parts),
+                    'text': ' '.join(text_parts),
                     'id_per': link.id_per,
                     'dossier': dossier,
                 }
@@ -430,7 +430,7 @@ class Resource(BaseResource, HTTPResource):
                 cmu_nais = to_ascii(identification.get('CMU_NAIS', '')).lower()
                 if cmu_nais and commune_naissance != cmu_nais:
                     self.logger.debug(
-                        u'id_per %s: CMU_NAIS(%s) does not match commune_naissance(%s)',
+                        'id_per %s: CMU_NAIS(%s) does not match commune_naissance(%s)',
                         id_per,
                         cmu_nais,
                         commune_naissance,
diff --git a/passerelle/apps/cartads_cs/models.py b/passerelle/apps/cartads_cs/models.py
index 742cf72f..627f6704 100644
--- a/passerelle/apps/cartads_cs/models.py
+++ b/passerelle/apps/cartads_cs/models.py
@@ -247,10 +247,10 @@ class AbstractCartaDSCS(BaseResource):
                 def format_cerfa_label(x):
                     try:
                         if x['Description']:
-                            return u'%(Nom)s: %(Description)s' % x
+                            return '%(Nom)s: %(Description)s' % x
                     except KeyError:
                         pass
-                    return u'%(Nom)s' % x
+                    return '%(Nom)s' % x
 
                 data_cache, dummy = CartaDSDataCache.objects.get_or_create(
                     data_type='liste_pdf',
diff --git a/passerelle/apps/choosit/models.py b/passerelle/apps/choosit/models.py
index 587df931..3af0c1cd 100644
--- a/passerelle/apps/choosit/models.py
+++ b/passerelle/apps/choosit/models.py
@@ -24,8 +24,8 @@ class ChoositSMSGateway(SMSResource):
                     'err': 1,
                     'err_desc': 'Choosit error: some destinations failed',
                     'data': [
-                        [u'0033688888888', u'Choosit error: bad JSON response'],
-                        [u'0033677777777', u'Choosit error: bad JSON response'],
+                        ['0033688888888', 'Choosit error: bad JSON response'],
+                        ['0033677777777', 'Choosit error: bad JSON response'],
                     ],
                 },
             },
@@ -37,21 +37,21 @@ class ChoositSMSGateway(SMSResource):
                     'err': 1,
                     'err_desc': 'Choosit error: some destinations failed',
                     'data': [
-                        [u'0033688888888', u'Choosit error: not ok'],
-                        [u'0033677777777', u'Choosit error: not ok'],
+                        ['0033688888888', 'Choosit error: not ok'],
+                        ['0033677777777', 'Choosit error: not ok'],
                     ],
                 },
             },
             {
                 'response': {
-                    'result': u'Envoi terminé',
+                    'result': 'Envoi terminé',
                     'sms_id': 1234,
                 },
                 'result': {
                     'err': 0,
                     'data': [
-                        [u'0033688888888', {'result': u'Envoi terminé', 'sms_id': 1234}],
-                        [u'0033677777777', {'result': u'Envoi terminé', 'sms_id': 1234}],
+                        ['0033688888888', {'result': 'Envoi terminé', 'sms_id': 1234}],
+                        ['0033677777777', {'result': 'Envoi terminé', 'sms_id': 1234}],
                     ],
                 },
             },
@@ -92,7 +92,7 @@ class ChoositSMSGateway(SMSResource):
                     if not isinstance(output, dict):
                         results.append('Choosit error: JSON response is not a dict %r' % output)
                     elif 'error' in output:
-                        results.append(u'Choosit error: %s' % output['error'])
+                        results.append('Choosit error: %s' % output['error'])
                     else:
                         results.append(output)
         if any(isinstance(result, string_types) for result in results):
diff --git a/passerelle/apps/cityweb/models.py b/passerelle/apps/cityweb/models.py
index 74548bce..7dd02a9d 100644
--- a/passerelle/apps/cityweb/models.py
+++ b/passerelle/apps/cityweb/models.py
@@ -39,7 +39,7 @@ class CityWeb(BaseResource):
     category = _('Civil Status Connectors')
 
     class Meta:
-        verbose_name = u"CityWeb - Demande d'acte d'état civil"
+        verbose_name = "CityWeb - Demande d'acte d'état civil"
 
     @classmethod
     def get_verbose_name(cls):
diff --git a/passerelle/apps/csvdatasource/models.py b/passerelle/apps/csvdatasource/models.py
index a2d6cce9..68f95bcb 100644
--- a/passerelle/apps/csvdatasource/models.py
+++ b/passerelle/apps/csvdatasource/models.py
@@ -315,7 +315,7 @@ class CsvDataSource(BaseResource):
         try:
             query = Query.objects.get(resource=self.id, slug=query_name)
         except Query.DoesNotExist:
-            raise APIError(u'no such query')
+            raise APIError('no such query')
         return self.execute_query(request, query, query_params=kwargs)
 
     def execute_query(self, request, query, query_params=None):
@@ -337,7 +337,7 @@ class CsvDataSource(BaseResource):
                         data['name'] = titles[i]
                     else:
                         data['idx'] = i
-                    raise APIError(u'invalid %s expression' % kind, data=data)
+                    raise APIError('invalid %s expression' % kind, data=data)
                 codes.append((code, expr))
             for row in data:
                 new_row = []
@@ -356,7 +356,7 @@ class CsvDataSource(BaseResource):
                             data['name'] = titles[i]
                         else:
                             data['idx'] = i
-                        raise APIError(u'invalid %s expression' % kind, data=data)
+                        raise APIError('invalid %s expression' % kind, data=data)
                     new_row.append(result)
                 yield new_row, row
 
@@ -383,7 +383,7 @@ class CsvDataSource(BaseResource):
                     hash(new_row)
                 except TypeError:
                     raise APIError(
-                        u'distinct value is unhashable',
+                        'distinct value is unhashable',
                         data={
                             'row': repr(row),
                             'distinct': repr(new_row),
@@ -402,7 +402,7 @@ class CsvDataSource(BaseResource):
             for mapping in projection:
                 name, expr = mapping.split(':', 1)
                 if not identifier_re.match(name):
-                    raise APIError(u'invalid projection name', data=name)
+                    raise APIError('invalid projection name', data=name)
                 titles.append(name)
                 expressions.append(expr)
             new_data = []
diff --git a/passerelle/apps/family/models.py b/passerelle/apps/family/models.py
index 05a58e95..17493086 100644
--- a/passerelle/apps/family/models.py
+++ b/passerelle/apps/family/models.py
@@ -470,7 +470,7 @@ class Person(models.Model):
 
     @property
     def fullname(self):
-        return u'%s %s' % (self.first_name, self.last_name)
+        return '%s %s' % (self.first_name, self.last_name)
 
     def __str__(self):
         return self.fullname
diff --git a/passerelle/apps/gesbac/models.py b/passerelle/apps/gesbac/models.py
index 86038efc..e6688ff6 100644
--- a/passerelle/apps/gesbac/models.py
+++ b/passerelle/apps/gesbac/models.py
@@ -224,7 +224,7 @@ class Gesbac(BaseResource):
     category = _('Business Process Connectors')
 
     class Meta:
-        verbose_name = u'Gesbac'
+        verbose_name = 'Gesbac'
 
     def check_status(self):
         with self.outcoming_sftp.client() as out_sftp:
diff --git a/passerelle/apps/maelis/models.py b/passerelle/apps/maelis/models.py
index 97f2bac8..b8101b81 100644
--- a/passerelle/apps/maelis/models.py
+++ b/passerelle/apps/maelis/models.py
@@ -97,7 +97,7 @@ class Maelis(BaseResource):
     category = _('Business Process Connectors')
 
     class Meta:
-        verbose_name = u'Maélis'
+        verbose_name = 'Maélis'
 
     @classmethod
     def get_verbose_name(cls):
diff --git a/passerelle/apps/mdel/models.py b/passerelle/apps/mdel/models.py
index 1366b6bd..178c4405 100644
--- a/passerelle/apps/mdel/models.py
+++ b/passerelle/apps/mdel/models.py
@@ -350,7 +350,7 @@ class Demand(models.Model):
 
             # Set aec_nature if aec_type_raw == DECES
             if formdata.get('aec_type_raw') == 'DECES' and not formdata.get('aec_nature_raw'):
-                formdata['aec_nature'] = u'Copie integrale'
+                formdata['aec_nature'] = 'Copie integrale'
                 formdata['aec_nature_raw'] = 'COPIE-INTEGRALE'
 
             # Set motif_demand if none
diff --git a/passerelle/apps/opengis/models.py b/passerelle/apps/opengis/models.py
index caf92dbe..5573eabb 100644
--- a/passerelle/apps/opengis/models.py
+++ b/passerelle/apps/opengis/models.py
@@ -221,9 +221,7 @@ class OpenGIS(BaseResource):
         except ValueError:
             self.handle_opengis_error(response)
             # if handle_opengis_error did not raise an error, we raise a generic one
-            raise APIError(
-                u'OpenGIS Error: unparsable error', data={'content': repr(response.content[:1024])}
-            )
+            raise APIError('OpenGIS Error: unparsable error', data={'content': repr(response.content[:1024])})
         for feature in response['features']:
             feature['text'] = feature['properties'].get(property_name)
             data.append(feature)
@@ -245,7 +243,7 @@ class OpenGIS(BaseResource):
             return None
         content = exception_text.text
         content = html.unescape(content)
-        raise APIError(u'OpenGIS Error: %s' % exception_code or 'unknown code', data={'text': content})
+        raise APIError('OpenGIS Error: %s' % exception_code or 'unknown code', data={'text': content})
 
     def convert_coordinates(self, lon, lat, reverse=False):
         lon, lat = float(lon), float(lat)
diff --git a/passerelle/apps/sp_fr/models.py b/passerelle/apps/sp_fr/models.py
index e298c21a..399bee07 100644
--- a/passerelle/apps/sp_fr/models.py
+++ b/passerelle/apps/sp_fr/models.py
@@ -335,12 +335,12 @@ class Resource(BaseResource):
             with self.resource.output_sftp.client() as client:
                 with client.open(self.request.response_zip_filename, mode='w') as fd:
                     self.request.build_response_zip(
-                        fd, etat='100', commentaire=u'Demande transmise à la collectivité'
+                        fd, etat='100', commentaire='Demande transmise à la collectivité'
                     )
             with self.resource.input_sftp.client() as client:
                 with client.open('DONE/' + self.request.response_zip_filename, mode='w') as fd:
                     self.request.build_response_zip(
-                        fd, etat='100', commentaire=u'Demande transmise à la collectivité'
+                        fd, etat='100', commentaire='Demande transmise à la collectivité'
                     )
 
         def get_data(self, data, name):
@@ -355,11 +355,11 @@ class Resource(BaseResource):
             numero_permis_construire = get('doc_declarant_designation_permis_numero_permis_construire')
             numero_permis_amenager = get('doc_declarant_designation_permis_numero_permis_amenager')
             data['type_permis'] = (
-                u'Un permis de construire' if numero_permis_construire else u'Un permis d\'aménager'
+                'Un permis de construire' if numero_permis_construire else 'Un permis d\'aménager'
             )
             data['numero_permis'] = numero_permis_construire or numero_permis_amenager
             particulier = get('doc_declarant_identite_type_personne').strip().lower() == 'true'
-            data['type_declarant'] = u'Un particulier' if particulier else u'Une personne morale'
+            data['type_declarant'] = 'Un particulier' if particulier else 'Une personne morale'
             if particulier:
                 data['nom'] = get('doc_declarant_identite_personne_physique_nom')
                 data['prenoms'] = get('doc_declarant_identite_personne_physique_prenom')
@@ -382,9 +382,9 @@ class Resource(BaseResource):
                     get('doc_declarant_identite_personne_morale_representant_personne_morale_civilite'), ''
                 )
             data['portee'] = (
-                u'Pour la totalité des travaux'
+                'Pour la totalité des travaux'
                 if get('doc_ouverture_chantier_totalite_travaux').lower().strip() == 'true'
-                else u'Pour une tranche des travaux'
+                else 'Pour une tranche des travaux'
             )
 
         def update_data_recensementCitoyen(self, data):
@@ -397,9 +397,9 @@ class Resource(BaseResource):
             data['motif'] = {'RECENSEMENT': '1', 'EXEMPTION': '2'}[motif]
             if data['motif'] == '2':
                 data['motif_exempte'] = (
-                    u"Titulaire d'une carte d'invalidité de 80% minimum"
+                    "Titulaire d'une carte d'invalidité de 80% minimum"
                     if get('recensementcitoyen_formalite_formalitemotifcode_2') == 'INFIRME'
-                    else u"Autre situation"
+                    else "Autre situation"
                 )
             data['justificatif_exemption'] = get('pj_je')
             data['double_nationalite'] = 'Oui' if get('recensementcitoyen_personne_nationalite') else 'Non'
@@ -421,16 +421,16 @@ class Resource(BaseResource):
             data['justificatif_identite'] = get('pj_ji')
             situation_matrimoniale = get('recensementcitoyen_personne_situationfamille_situationmatrimoniale')
             data['situation_familiale'] = {
-                u'Célibataire': u'Célibataire',
-                u'Marié': u'Marié(e)',
-            }.get(situation_matrimoniale, u'Autres')
-            if data['situation_familiale'] == u'Autres':
+                'Célibataire': 'Célibataire',
+                'Marié': 'Marié(e)',
+            }.get(situation_matrimoniale, 'Autres')
+            if data['situation_familiale'] == 'Autres':
                 data['situation_familiale_precision'] = situation_matrimoniale
             pupille = get('recensementcitoyen_personne_situationfamille_pupille')
             data['pupille'] = 'Oui' if pupille else 'Non'
             data['pupille_categorie'] = {
-                'NATION': u"Pupille de la nation",
-                'ETAT': u"Pupille de l'État",
+                'NATION': "Pupille de la nation",
+                'ETAT': "Pupille de l'État",
             }.get(pupille)
             for idx in ['', '_1', '_2']:
                 code = get('recensementcitoyen_personne_methodecontact%s_canalcode' % idx)
@@ -774,7 +774,7 @@ class Request(models.Model):
             './/{%(mdel)s}MotDePasse' % ns
         ).text
         response.find('.//{%(pec)s}Etat' % ns).text = '100'
-        response.find('.//{%(pec)s}Commentaire' % ns).text = u'Dossier transmis à la collectivité'
+        response.find('.//{%(pec)s}Commentaire' % ns).text = 'Dossier transmis à la collectivité'
         return response
 
     def build_response_zip(self, fd_or_filename, etat, commentaire):
diff --git a/passerelle/apps/vivaticket/models.py b/passerelle/apps/vivaticket/models.py
index 75c8402a..71ec0735 100644
--- a/passerelle/apps/vivaticket/models.py
+++ b/passerelle/apps/vivaticket/models.py
@@ -146,7 +146,7 @@ class VivaTicket(BaseResource):
     log_requests_errors = False
 
     class Meta:
-        verbose_name = u'VivaTicket'
+        verbose_name = 'VivaTicket'
 
     @classmethod
     def get_verbose_name(cls):
diff --git a/passerelle/base/models.py b/passerelle/base/models.py
index f1f79acf..3b0675c2 100644
--- a/passerelle/base/models.py
+++ b/passerelle/base/models.py
@@ -85,7 +85,7 @@ class ApiUser(models.Model):
     )
 
     def __str__(self):
-        return u'%s <%s>' % (self.fullname, self.username)
+        return '%s <%s>' % (self.fullname, self.username)
 
     def clean(self):
         if self.keytype and not self.key:
@@ -513,17 +513,17 @@ class BaseResource(models.Model):
             if status == 'down' and not self.down():  # new downtime
                 if availability_parameters.has_zero_delay():
                     self.logger.error(
-                        u'connector "%s" (%s) is now down: %s', self, self.__class__.__name__, message
+                        'connector "%s" (%s) is now down: %s', self, self.__class__.__name__, message
                     )
                 else:
                     self.logger.warning(
-                        u'connector "%s" (%s) is now down: %s', self, self.__class__.__name__, message
+                        'connector "%s" (%s) is now down: %s', self, self.__class__.__name__, message
                     )
             ResourceStatus(
                 resource_type=resource_type, resource_pk=self.pk, status=status, message=message
             ).save()
             if status == 'up' and current_status:
-                self.logger.info(u'connector "%s" (%s) is back up', self, self.__class__.__name__)
+                self.logger.info('connector "%s" (%s) is back up', self, self.__class__.__name__)
         elif status == 'down':
             # check last_notification_downtime and current downtime to see if it matches a new notification delay
             last_notification_timestamp = (
@@ -550,7 +550,7 @@ class BaseResource(models.Model):
                         else:
                             human_duration = 'for %d minutes' % downtime
                         self.logger.error(
-                            u'connector "%s" (%s) has been down %s: %s',
+                            'connector "%s" (%s) has been down %s: %s',
                             self,
                             self.__class__.__name__,
                             human_duration,
diff --git a/passerelle/base/views.py b/passerelle/base/views.py
index 35d56f8e..52181f35 100644
--- a/passerelle/base/views.py
+++ b/passerelle/base/views.py
@@ -218,12 +218,12 @@ class ManageAvailabilityView(UpdateView):
 
         # log changes to notification delays
         if 'notification_delays' in form.changed_data:
-            resource.logger.info(u'availability checks delays set to %s', form.instance.notification_delays)
+            resource.logger.info('availability checks delays set to %s', form.instance.notification_delays)
 
         # log changes to run_check, if enabled immediately check for availability
         if 'run_check' in form.changed_data:
             resource.logger.info(
-                u'availability checks %s', 'enabled' if form.instance.run_check else 'disabled'
+                'availability checks %s', 'enabled' if form.instance.run_check else 'disabled'
             )
             if form.instance.run_check:
                 resource.availability()
diff --git a/passerelle/contrib/dpark/models.py b/passerelle/contrib/dpark/models.py
index e05cfe7d..5770c97c 100644
--- a/passerelle/contrib/dpark/models.py
+++ b/passerelle/contrib/dpark/models.py
@@ -259,7 +259,7 @@ class DPark(BaseResource):
             }
             if code_retour in errors:
                 return Error(errors[code_retour], msg=msg_retour)
-            return Error('other-error', msg=u'code="%s" msg="%s"' % (code_retour, msg_retour))
+            return Error('other-error', msg='code="%s" msg="%s"' % (code_retour, msg_retour))
 
     @endpoint(perm='can_access', description=_('Check service availibity'))
     def ping(self, request, *args, **kwargs):
@@ -554,7 +554,7 @@ class DPark(BaseResource):
             try:
                 pdf_content = to_pdf(file_raw_content)
             except ValueError as e:
-                errors.append(u'<%s> cannot be converted to PDF: %s' % (key, e))
+                errors.append('<%s> cannot be converted to PDF: %s' % (key, e))
                 continue
             filename = value['filename']
             if not filename.lower().endswith('.pdf'):
diff --git a/passerelle/contrib/esirius_swi/models.py b/passerelle/contrib/esirius_swi/models.py
index 7cde1c7a..94be7150 100644
--- a/passerelle/contrib/esirius_swi/models.py
+++ b/passerelle/contrib/esirius_swi/models.py
@@ -34,7 +34,7 @@ class ESiriusSwi(BaseResource):
     category = _('Business Process Connectors')
 
     class Meta:
-        verbose_name = u'eSirius sitewaitingindicator'
+        verbose_name = 'eSirius sitewaitingindicator'
 
     @classmethod
     def get_verbose_name(cls):
diff --git a/passerelle/contrib/greco/models.py b/passerelle/contrib/greco/models.py
index 8879700b..a6d398c7 100644
--- a/passerelle/contrib/greco/models.py
+++ b/passerelle/contrib/greco/models.py
@@ -35,7 +35,7 @@ from passerelle.utils.api import APIError, endpoint
 from .formdata import CREATION_SCHEMA, FormData, list_schema_fields
 
 # taken from https://lsimons.wordpress.com/2011/03/17/stripping-illegal-characters-out-of-xml-in-python/
-_illegal_xml_chars_RE = re.compile(u'[\x00-\x08\x0b\x0c\x0e-\x1F\uD800-\uDFFF\uFFFE\uFFFF]')
+_illegal_xml_chars_RE = re.compile('[\x00-\x08\x0b\x0c\x0e-\x1F\uD800-\uDFFF\uFFFE\uFFFF]')
 
 
 def escape_xml_illegal_chars(val, replacement='?'):
diff --git a/passerelle/contrib/mdph13/models.py b/passerelle/contrib/mdph13/models.py
index 13414564..d5e1233a 100644
--- a/passerelle/contrib/mdph13/models.py
+++ b/passerelle/contrib/mdph13/models.py
@@ -114,7 +114,7 @@ class MDPH13Resource(BaseResource, HTTPResource):
             for person in entourage:
                 if not isinstance(person, dict):
                     raise APIError('entourage-content-must-be-dicts', data=content)
-                if person.get('role') in [u'Père', u'Mère']:
+                if person.get('role') in ['Père', 'Mère']:
                     new_entourage.setdefault('parents', []).append(person)
                 else:
                     new_entourage.setdefault('aidants', []).append(person)
@@ -131,9 +131,9 @@ class MDPH13Resource(BaseResource, HTTPResource):
                 raise APIError('demandes-content-must-be-dicts', data=content)
             new_demandes = {}
             typologies = {
-                u'demande en cours': 'en_cours',
-                u'traitée et expédiée': 'historique',
-                u'traitée non expédiée': 'historique',
+                'demande en cours': 'en_cours',
+                'traitée et expédiée': 'historique',
+                'traitée non expédiée': 'historique',
             }
             if not all(isinstance(demande.get('typologie'), six.text_type) for demande in demandes):
                 raise APIError('typologie-must-be-a-string', data=content)
@@ -364,11 +364,11 @@ class Link(models.Model):
             parts.append(prenom)
         if nom:
             parts.append(nom)
-        parts.append(u'#%s' % numero)
+        parts.append('#%s' % numero)
         return ' '.join(parts)
 
     def __str__(self):
-        return self.display_name or u'#%s' % self.file_number
+        return self.display_name or '#%s' % self.file_number
 
     class Meta:
         unique_together = (
diff --git a/passerelle/contrib/solis_apa/conciliation.py b/passerelle/contrib/solis_apa/conciliation.py
index ace293e5..6467474d 100644
--- a/passerelle/contrib/solis_apa/conciliation.py
+++ b/passerelle/contrib/solis_apa/conciliation.py
@@ -208,7 +208,7 @@ def conciliation_payload(config, **data):
             )
     criterium = []
     for xpath, local in config['input'].items():
-        criterium.append({'key': xpath, 'value': data.get(local, u'')})
+        criterium.append({'key': xpath, 'value': data.get(local, '')})
     returndata = []
     for xpath in config['output']:
         returndata.append(xpath)
@@ -235,5 +235,5 @@ def conciliation_output2dict(config, entity):
         x = entity
         for k in xpath.split('/'):
             x = x.get(k, {})
-        d[xpath] = x or u''
+        d[xpath] = x or ''
     return d
diff --git a/passerelle/contrib/solis_apa/models.py b/passerelle/contrib/solis_apa/models.py
index ed77b614..4f8c0605 100644
--- a/passerelle/contrib/solis_apa/models.py
+++ b/passerelle/contrib/solis_apa/models.py
@@ -164,11 +164,11 @@ class SolisAPA(BaseResource):
         ret = []
 
         for v in villes:
-            # {u'Attributes': {u'Attribute': {u'id': u'stdr.commune.cp_lieu',
-            # u'value': 14210}}, u'Keys': {u'Key': [{u'id':
-            # u'stdr.commune.code_a_com', u'value': 771}, {u'id':
-            # u'stdr.commune.code_dep', u'value': 14}]}, u'id':
-            # u'commune-14-771', u'value': u'NEUILLY LE MALHERBE'},
+            # {'Attributes': {'Attribute': {'id': 'stdr.commune.cp_lieu',
+            # 'value': 14210}}, 'Keys': {'Key': [{'id':
+            # 'stdr.commune.code_a_com', 'value': 771}, {'id':
+            # 'stdr.commune.code_dep', 'value': 14}]}, 'id':
+            # 'commune-14-771', 'value': 'NEUILLY LE MALHERBE'},
             #
             # However, the lack of some informations has already been observed,
             # so there are some test/continue here
@@ -204,14 +204,14 @@ class SolisAPA(BaseResource):
         lieux = call.get('results')
         ret = []
         for l in lieux:
-            # '@affinity': u'5',
-            # 'CodeDepartement/@V': u'',
-            # 'CodeLieu/@V': u'0110',
-            # 'CodePostal/@V': u'14000',
-            # 'Commune/NomCom/@V': u'CAEN',
-            # 'Commune/PK/CodeCommune/@V': u'118',
-            # 'NatureLieu/@Lc': u'RUE',
-            # 'NomLieu/@V': u'DU BEAU SITE'
+            # '@affinity': '5',
+            # 'CodeDepartement/@V': '',
+            # 'CodeLieu/@V': '0110',
+            # 'CodePostal/@V': '14000',
+            # 'Commune/NomCom/@V': 'CAEN',
+            # 'Commune/PK/CodeCommune/@V': '118',
+            # 'NatureLieu/@Lc': 'RUE',
+            # 'NomLieu/@V': 'DU BEAU SITE'
             for k, v in l.items():
                 l[k] = v.strip()
             ret.append(
@@ -232,26 +232,26 @@ class SolisAPA(BaseResource):
         individus = call.get('results')
         ret = []
         for i in individus:
-            # i = {'@affinity': u'3',
-            #  'Dossier/Adresse/Commune/NomCom/@V': u'ST JULIEN EN GENEVOIS',
-            #  'Dossier/Adresse/ComplementLieu/@V': u'ROUTE DE THOIRY',
-            #  'Dossier/Adresse/CpLieu/@V': u'74160',
-            #  'Dossier/Adresse/NatureLieu/@Lc': u'',
-            #  'Dossier/Adresse/NomLieu/@V': u'.',
-            #  'Dossier/Adresse/NumeroLieu/@V': u'39',
-            #  'Dossier/PK/IndexDossier/@V': u'162438',
-            #  'EtatCivil/DateNaissance/@V': u'1933-08-28',
-            #  'EtatCivil/Nom/@V': u'DUPONT',
-            #  'EtatCivil/NomJeuneFille/@V': u'BUATHIER',
-            #  'EtatCivil/Prenom/@V': u'JEANNE',
-            #  'PK/IndexIndividu/@V': u'208359'},
+            # i = {'@affinity': '3',
+            #  'Dossier/Adresse/Commune/NomCom/@V': 'ST JULIEN EN GENEVOIS',
+            #  'Dossier/Adresse/ComplementLieu/@V': 'ROUTE DE THOIRY',
+            #  'Dossier/Adresse/CpLieu/@V': '74160',
+            #  'Dossier/Adresse/NatureLieu/@Lc': '',
+            #  'Dossier/Adresse/NomLieu/@V': '.',
+            #  'Dossier/Adresse/NumeroLieu/@V': '39',
+            #  'Dossier/PK/IndexDossier/@V': '162438',
+            #  'EtatCivil/DateNaissance/@V': '1933-08-28',
+            #  'EtatCivil/Nom/@V': 'DUPONT',
+            #  'EtatCivil/NomJeuneFille/@V': 'BUATHIER',
+            #  'EtatCivil/Prenom/@V': 'JEANNE',
+            #  'PK/IndexIndividu/@V': '208359'},
             for k, v in i.items():
                 i[k] = v.strip()
             njf = i['EtatCivil/NomJeuneFille/@V']
             if njf:
-                i['EtatCivil/NomJeuneFille/@V'] = u' (%s)' % njf
+                i['EtatCivil/NomJeuneFille/@V'] = ' (%s)' % njf
             if not i['EtatCivil/DateNaissance/@V']:
-                i['EtatCivil/DateNaissance/@V'] = u'date de naissance inconnue'
+                i['EtatCivil/DateNaissance/@V'] = 'date de naissance inconnue'
             ret.append(
                 {
                     'id': '%(PK/IndexIndividu/@V)s' % i,
diff --git a/passerelle/contrib/solis_apa/suivi.py b/passerelle/contrib/solis_apa/suivi.py
index 195ac2a5..9538d60c 100644
--- a/passerelle/contrib/solis_apa/suivi.py
+++ b/passerelle/contrib/solis_apa/suivi.py
@@ -84,8 +84,8 @@ def suivi_visite_output(data):
                     intervenant['nom'] = _intervenant['Nom']['@V']
                     intervenant['prenom'] = _intervenant['Prenom']['@V']
                     coords = _intervenant.get('Coordonnees', {})
-                    intervenant['email'] = coords.get('Email', {}).get('@V', u'')
-                    intervenant['telephone'] = coords.get('Telephone', {}).get('@V', u'')
+                    intervenant['email'] = coords.get('Email', {}).get('@V', '')
+                    intervenant['telephone'] = coords.get('Telephone', {}).get('@V', '')
                     intervenants.append(intervenant)
             info['visite_intervenants'] = intervenants
             select = {}
diff --git a/passerelle/contrib/teamnet_axel/models.py b/passerelle/contrib/teamnet_axel/models.py
index 06b07706..dca590ea 100644
--- a/passerelle/contrib/teamnet_axel/models.py
+++ b/passerelle/contrib/teamnet_axel/models.py
@@ -88,9 +88,9 @@ class TeamnetAxel(BaseResource):
         streamId = operation
         xmlParams = smart_text(ET.tostring(portail, encoding='UTF-8'))
         user = ''
-        logger.debug(u'getData(streamId=%s, xmlParams=%s, user=%s)', streamId, xmlParams, user)
+        logger.debug('getData(streamId=%s, xmlParams=%s, user=%s)', streamId, xmlParams, user)
         result = soap.get_client(self).service.getData(streamId, smart_text(xmlParams), user)
-        logger.debug(u'getData(%s) result: %s', streamId, smart_text(result))
+        logger.debug('getData(%s) result: %s', streamId, smart_text(result))
         xml_result = ET.fromstring(result)
         if xml_result.find('RESULTAT/STATUS').text != 'OK':
             msg = xml_result.find('RESULTAT/COMMENTAIRES').text
diff --git a/passerelle/contrib/toulouse_axel/models.py b/passerelle/contrib/toulouse_axel/models.py
index c1797923..1194e35d 100644
--- a/passerelle/contrib/toulouse_axel/models.py
+++ b/passerelle/contrib/toulouse_axel/models.py
@@ -1052,7 +1052,7 @@ class ToulouseAxel(BaseResource):
             activity['id'] = activity['IDACTIVITE']
             start_date = datetime.datetime.strptime(activity['DATEENTREE'], axel.json_date_format)
             end_date = datetime.datetime.strptime(activity['DATESORTIE'], axel.json_date_format)
-            activity['text'] = u'{} (inscription du {} au {})'.format(
+            activity['text'] = '{} (inscription du {} au {})'.format(
                 activity['LIBELLEACTIVITE'],
                 start_date.strftime(axel.xml_date_format),
                 end_date.strftime(axel.xml_date_format),
diff --git a/passerelle/sms/models.py b/passerelle/sms/models.py
index 64cf5768..902a9069 100644
--- a/passerelle/sms/models.py
+++ b/passerelle/sms/models.py
@@ -68,13 +68,13 @@ class SMSResource(BaseResource):
     default_country_code = models.CharField(
         verbose_name=_('Default country code'),
         max_length=3,
-        default=u'33',
+        default='33',
         validators=[RegexValidator('^[0-9]*$', _('The country must only contain numbers'))],
     )
     default_trunk_prefix = models.CharField(
         verbose_name=_('Default trunk prefix'),
         max_length=2,
-        default=u'0',
+        default='0',
         validators=[RegexValidator('^[0-9]*$', _('The trunk prefix must only contain numbers'))],
     )  # Yeah France first !
     max_message_length = models.IntegerField(
diff --git a/passerelle/utils/conversion.py b/passerelle/utils/conversion.py
index 2666a29f..2a8671bd 100644
--- a/passerelle/utils/conversion.py
+++ b/passerelle/utils/conversion.py
@@ -92,7 +92,7 @@ def exception_to_text(e):
             content = '<exception-while-rendering-args>'
     except AttributeError:
         content = ''
-    return u'%s(%s)' % (e.__class__.__name__, content)
+    return '%s(%s)' % (e.__class__.__name__, content)
 
 
 def normalize(s):
diff --git a/passerelle/utils/xml.py b/passerelle/utils/xml.py
index d6d7e57b..62e80c40 100644
--- a/passerelle/utils/xml.py
+++ b/passerelle/utils/xml.py
@@ -47,7 +47,7 @@ def text_content(node):
                 s.append(child.tail)
         return s
 
-    return u''.join(helper(node))
+    return ''.join(helper(node))
 
 
 def to_json(root):
diff --git a/tests/conftest.py b/tests/conftest.py
index 0b5ca739..532da80e 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -165,7 +165,7 @@ def relax_openssl(tmpdir):
     openssl_cnf_path = tmpdir / 'openssl.cnf'
     with openssl_cnf_path.open('w') as fd:
         fd.write(
-            u'''
+            '''
 [default_conf]
 ssl_conf = ssl_sect
 
diff --git a/tests/test_api_entreprise.py b/tests/test_api_entreprise.py
index b55fff96..8ce36fa8 100644
--- a/tests/test_api_entreprise.py
+++ b/tests/test_api_entreprise.py
@@ -315,7 +315,7 @@ def api_entreprise_error_not_json(url, request):
 
 @urlmatch(netloc='^entreprise.api.gouv.fr$')
 def api_entreprise_error_not_found(url, request):
-    return response(404, {'error': 'not_found', 'message': u'Page not found'}, request=request)
+    return response(404, {'error': 'not_found', 'message': 'Page not found'}, request=request)
 
 
 @pytest.yield_fixture
diff --git a/tests/test_api_particulier.py b/tests/test_api_particulier.py
index 55e05c9f..f8fef890 100644
--- a/tests/test_api_particulier.py
+++ b/tests/test_api_particulier.py
@@ -125,7 +125,7 @@ def api_particulier_error_not_found(url, request):
         404,
         {
             'error': 'not_found',
-            'message': u'Les paramètres fournis sont incorrects ou ne correspondent pas à un avis',
+            'message': 'Les paramètres fournis sont incorrects ou ne correspondent pas à un avis',
         },
         request=request,
     )
diff --git a/tests/test_arpege_ecp.py b/tests/test_arpege_ecp.py
index 3b70e173..aafda313 100644
--- a/tests/test_arpege_ecp.py
+++ b/tests/test_arpege_ecp.py
@@ -72,7 +72,7 @@ def connector(db):
 def test_check_status(mocked_get, connector):
     mocked_get.return_value = tests.utils.FakedResponse(content=FAKE_HELLO_RESPONSE, status_code=200)
     resp = connector.check_status()
-    assert resp['data'] == u'InteropAPI v1 (c) Arpège 2017'
+    assert resp['data'] == 'InteropAPI v1 (c) Arpège 2017'
 
 
 @mock.patch('passerelle.utils.Request.get')
diff --git a/tests/test_atal.py b/tests/test_atal.py
index 778d97e8..09fa1958 100644
--- a/tests/test_atal.py
+++ b/tests/test_atal.py
@@ -85,7 +85,7 @@ def test_get_type_de_voie(app, connector, monkeypatch):
 
 
 def test_get_types_equipement(app, connector, monkeypatch):
-    return_value = u"""<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+    return_value = """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
     <types>
         <type id="2" label="Espaces Verts"></type>
         <type id="4" label="Voirie">
diff --git a/tests/test_atos_genesys.py b/tests/test_atos_genesys.py
index 90737854..09933d3f 100644
--- a/tests/test_atos_genesys.py
+++ b/tests/test_atos_genesys.py
@@ -168,7 +168,7 @@ def test_ws_dossiers(app, genesys):
         assert response.json['data'][0]['id_per'] == '1234'
         assert response.json['data'][0]['dossier']
         assert response.json['data'][0]['id'] == str(link.id)
-        assert response.json['data'][0]['text'] == u'%s - John DOE' % link.id_per
+        assert response.json['data'][0]['text'] == '%s - John DOE' % link.id_per
         assert response.json['data'][0]['dossier']['IDENTIFICATION'][0]['CIVILITE'] == 'Madame'
         assert len(response.json['data'][0]['dossier']['DEMANDES']) == 1
         assert len(response.json['data'][0]['dossier']['DEMANDES']['AD']) == 1
@@ -193,11 +193,11 @@ def test_ws_dossiers(app, genesys):
         assert response.json['data'][0]['id_per'] == '1234'
         assert response.json['data'][0]['dossier']
         assert response.json['data'][0]['id'] == str(link.id)
-        assert response.json['data'][0]['text'] == u'%s - John DOE' % link.id_per
+        assert response.json['data'][0]['text'] == '%s - John DOE' % link.id_per
         assert response.json['data'][1]['id_per'] == '4567'
         assert response.json['data'][1]['dossier']
         assert response.json['data'][1]['id'] == str(link2.id)
-        assert response.json['data'][1]['text'] == u'%s - John DOE' % link2.id_per
+        assert response.json['data'][1]['text'] == '%s - John DOE' % link2.id_per
 
     with tests.utils.mock_url(FAKE_URL, RESPONSE_SELECT_USAGER):
         response = app.get(
@@ -215,7 +215,7 @@ def test_ws_dossiers(app, genesys):
         assert response.json['data']['id_per'] == '4567'
         assert response.json['data']['dossier']
         assert response.json['data']['id'] == str(link2.id)
-        assert response.json['data']['text'] == u'%s - John DOE' % link2.id_per
+        assert response.json['data']['text'] == '%s - John DOE' % link2.id_per
 
 
 def test_row_locked_cache(genesys, freezer):
@@ -332,31 +332,31 @@ def test_ws_search(app, genesys):
     data = response.json['data']
     assert data == [
         {
-            u'id': u'tel1',
-            u'id_per': u'1234',
-            u'nom': u'DOE',
-            u'nom_naissance': u'TEST',
-            u'phone': u'0655555555',
-            u'prenom': u'John',
-            u'text': u'par SMS vers 06*****555',
+            'id': 'tel1',
+            'id_per': '1234',
+            'nom': 'DOE',
+            'nom_naissance': 'TEST',
+            'phone': '0655555555',
+            'prenom': 'John',
+            'text': 'par SMS vers 06*****555',
         },
         {
-            u'id': u'tel2',
-            u'id_per': u'1234',
-            u'nom': u'DOE',
-            u'nom_naissance': u'TEST',
-            u'phone': u'0644444444',
-            u'prenom': u'John',
-            u'text': u'par SMS vers 06*****444',
+            'id': 'tel2',
+            'id_per': '1234',
+            'nom': 'DOE',
+            'nom_naissance': 'TEST',
+            'phone': '0644444444',
+            'prenom': 'John',
+            'text': 'par SMS vers 06*****444',
         },
         {
-            u'email': u'test@sirus.fr',
-            u'id': u'email1',
-            u'id_per': u'1234',
-            u'nom': u'DOE',
-            u'nom_naissance': u'TEST',
-            u'prenom': u'John',
-            u'text': u'par courriel vers te***@***.fr',
+            'email': 'test@sirus.fr',
+            'id': 'email1',
+            'id_per': '1234',
+            'nom': 'DOE',
+            'nom_naissance': 'TEST',
+            'prenom': 'John',
+            'text': 'par courriel vers te***@***.fr',
         },
     ]
 
diff --git a/tests/test_availability.py b/tests/test_availability.py
index e41aa602..6126ec94 100644
--- a/tests/test_availability.py
+++ b/tests/test_availability.py
@@ -6,7 +6,7 @@ from httmock import HTTMock, all_requests
 import tests.utils
 from passerelle.apps.feeds.models import Feed
 
-FEED_EXAMPLE = u"""<?xml version="1.0" encoding="UTF-8"?>
+FEED_EXAMPLE = """<?xml version="1.0" encoding="UTF-8"?>
 <feed xmlns="http://www.w3.org/2005/Atom" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/">
   <title>Actualités de Strasbourg</title>
   <link rel="alternate" href="http://www.strasbourg.eu/fr/actualites/-/asset_publisher/lG7u/rss" />
diff --git a/tests/test_base_adresse.py b/tests/test_base_adresse.py
index 1fd6fe11..a0b6b111 100644
--- a/tests/test_base_adresse.py
+++ b/tests/test_base_adresse.py
@@ -123,11 +123,11 @@ def base_adresse_coordinates(db):
 def street(db):
     return StreetModel.objects.create(
         ban_id='73001_0000',
-        city=u'Chambéry',
-        name=u'Une rüê très äccentuéè',
-        zipcode=u'73000',
-        type=u'street',
-        citycode=u'73001',
+        city='Chambéry',
+        name='Une rüê très äccentuéè',
+        zipcode='73000',
+        type='street',
+        citycode='73001',
         resource=BaseAdresse.objects.first(),
     )
 
@@ -135,21 +135,21 @@ def street(db):
 @pytest.fixture
 def region(db):
     return RegionModel.objects.create(
-        name=u'Auvergne-Rhône-Alpes', code='84', resource=BaseAdresse.objects.first()
+        name='Auvergne-Rhône-Alpes', code='84', resource=BaseAdresse.objects.first()
     )
 
 
 @pytest.fixture
 def department(db, region):
     return DepartmentModel.objects.create(
-        name=u'Savoie', code='73', region=region, resource=BaseAdresse.objects.first()
+        name='Savoie', code='73', region=region, resource=BaseAdresse.objects.first()
     )
 
 
 @pytest.fixture
 def city(db, region, department):
     return CityModel.objects.create(
-        name=u'Chambéry',
+        name='Chambéry',
         code='73065',
         zipcode='73000',
         population=42000,
@@ -162,7 +162,7 @@ def city(db, region, department):
 @pytest.fixture
 def miquelon(db):
     return CityModel.objects.create(
-        name=u'Miquelon-Langlade',
+        name='Miquelon-Langlade',
         code='97501',
         zipcode='97500',
         population=42,
@@ -244,7 +244,7 @@ def test_base_adresse_search_qs_parameters_error(app, base_adresse, mock_api_adr
     resp = app.get('/base-adresse/%s/search' % base_adresse.slug, status=400)
     assert resp.json['err'] == 1
     assert resp.json['err_class'] == 'passerelle.views.WrongParameter'
-    assert resp.json['err_desc'] == u"missing parameters: 'q'."
+    assert resp.json['err_desc'] == "missing parameters: 'q'."
     # json-api serializer
     resp = app.get('/base-adresse/%s/streets?zipcode=13400&coin=zz' % base_adresse.slug, status=400)
     assert resp.json['err'] == 1
@@ -358,8 +358,8 @@ def test_base_adresse_streets_get_by_id(app, base_adresse, street):
         # create additional streets
         other_street = StreetModel.objects.create(
             ban_id='%d_000T' % (73001 + i),
-            city=u'Chambéry',
-            name=u'Une rue différente',
+            city='Chambéry',
+            name='Une rue différente',
             zipcode=str(73001 + i),
             type='street',
             citycode=str(73001 + i),
@@ -394,8 +394,8 @@ def test_base_adresse_streets_get_by_id(app, base_adresse, street):
 def test_base_adresse_streets_get_by_codes(app, base_adresse, street):
     for i in range(20):
         StreetModel.objects.create(
-            city=u'Paris %d' % i,
-            name=u'La rue %d' % i,
+            city='Paris %d' % i,
+            name='La rue %d' % i,
             zipcode=str(75000 + i * 10),
             type='street',
             citycode=str(75000 + i * 11),
@@ -588,10 +588,10 @@ def test_base_adresse_cities_dash_in_q(app, base_adresse, miquelon):
 
 
 def test_base_adresse_cities_region_department(app, base_adresse, miquelon, city):
-    reg = RegionModel.objects.create(name=u'IdF', code='11', resource=base_adresse)
-    dep = DepartmentModel.objects.create(name=u'Paris', code='75', region=reg, resource=base_adresse)
+    reg = RegionModel.objects.create(name='IdF', code='11', resource=base_adresse)
+    dep = DepartmentModel.objects.create(name='Paris', code='75', region=reg, resource=base_adresse)
     CityModel.objects.create(
-        name=u'Paris',
+        name='Paris',
         code='75056',
         zipcode='75014',
         population=2000000,
@@ -669,8 +669,8 @@ def test_base_adresse_departments(app, base_adresse, department, region):
 
 
 def test_base_adresse_departments_region(app, base_adresse, department):
-    reg = RegionModel.objects.create(name=u'IdF', code='11', resource=base_adresse)
-    DepartmentModel.objects.create(name=u'Paris', code='75', region=reg, resource=base_adresse)
+    reg = RegionModel.objects.create(name='IdF', code='11', resource=base_adresse)
+    DepartmentModel.objects.create(name='Paris', code='75', region=reg, resource=base_adresse)
 
     resp = app.get('/base-adresse/%s/departments?region_code=84' % base_adresse.slug)
     result = resp.json['data']
diff --git a/tests/test_cartads_cs.py b/tests/test_cartads_cs.py
index ab5556d8..89121d14 100644
--- a/tests/test_cartads_cs.py
+++ b/tests/test_cartads_cs.py
@@ -73,7 +73,7 @@ class FakeService:
             },
             {
                 'IdPiece': 62,
-                'Libelle': u'Plan de masse des constructions à démolir',
+                'Libelle': 'Plan de masse des constructions à démolir',
                 'Descriptif': 'Un plan de masse des constructions...',
                 'CodePiece': 'PCA1',
                 'Reglementaire': False,
@@ -130,28 +130,28 @@ class FakeService:
         return [
             OrderedDict(
                 [
-                    (u'CodePiece', 'PC07'),
-                    (u'DateDemande', datetime.datetime(2019, 4, 15, 0, 0)),
-                    (u'DatePresentation', None),
-                    (u'DateReception', None),
-                    (u'Descriptif', u"Un document graphique..."),
-                    (u'IdDosPiece', 133837),
-                    (u'IdPiece', 58),
-                    (u'LibellePiece', u"Document graphique permettant..."),
-                    (u'NbDocuments', 0),
+                    ('CodePiece', 'PC07'),
+                    ('DateDemande', datetime.datetime(2019, 4, 15, 0, 0)),
+                    ('DatePresentation', None),
+                    ('DateReception', None),
+                    ('Descriptif', "Un document graphique..."),
+                    ('IdDosPiece', 133837),
+                    ('IdPiece', 58),
+                    ('LibellePiece', "Document graphique permettant..."),
+                    ('NbDocuments', 0),
                 ]
             ),
             OrderedDict(
                 [
-                    (u'CodePiece', 'PC16-1'),
-                    (u'DateDemande', datetime.datetime(2019, 4, 15, 0, 0)),
-                    (u'DatePresentation', None),
-                    (u'DateReception', None),
-                    (u'Descriptif', u'Formulaire attestant...'),
-                    (u'IdDosPiece', 133840),
-                    (u'IdPiece', 99),
-                    (u'LibellePiece', u'Formulaire attestant...'),
-                    (u'NbDocuments', 0),
+                    ('CodePiece', 'PC16-1'),
+                    ('DateDemande', datetime.datetime(2019, 4, 15, 0, 0)),
+                    ('DatePresentation', None),
+                    ('DateReception', None),
+                    ('Descriptif', 'Formulaire attestant...'),
+                    ('IdDosPiece', 133840),
+                    ('IdPiece', 99),
+                    ('LibellePiece', 'Formulaire attestant...'),
+                    ('NbDocuments', 0),
                 ]
             ),
         ]
@@ -160,28 +160,28 @@ class FakeService:
         return [
             OrderedDict(
                 [
-                    (u'CodePiece', 'AT1'),
-                    (u'DateDemande', None),
-                    (u'DatePresentation', None),
-                    (u'DateReception', None),
-                    (u'Descriptif', u"L'attestation constatant..."),
-                    (u'IdDosPiece', 0),
-                    (u'IdPiece', 191),
-                    (u'LibellePiece', 'Attestation constat des travaux'),
-                    (u'NbDocuments', 0),
+                    ('CodePiece', 'AT1'),
+                    ('DateDemande', None),
+                    ('DatePresentation', None),
+                    ('DateReception', None),
+                    ('Descriptif', "L'attestation constatant..."),
+                    ('IdDosPiece', 0),
+                    ('IdPiece', 191),
+                    ('LibellePiece', 'Attestation constat des travaux'),
+                    ('NbDocuments', 0),
                 ]
             ),
             OrderedDict(
                 [
-                    (u'CodePiece', 'AT2'),
-                    (u'DateDemande', None),
-                    (u'DatePresentation', None),
-                    (u'DateReception', None),
-                    (u'Descriptif', u"Dans les cas..."),
-                    (u'IdDosPiece', 0),
-                    (u'IdPiece', 192),
-                    (u'LibellePiece', u'Document du...'),
-                    (u'NbDocuments', 0),
+                    ('CodePiece', 'AT2'),
+                    ('DateDemande', None),
+                    ('DatePresentation', None),
+                    ('DateReception', None),
+                    ('Descriptif', "Dans les cas..."),
+                    ('IdDosPiece', 0),
+                    ('IdPiece', 192),
+                    ('LibellePiece', 'Document du...'),
+                    ('NbDocuments', 0),
                 ]
             ),
         ]
@@ -198,13 +198,13 @@ class FakeService:
         assert id_dossier in (123, '135792')
         return OrderedDict(
             [
-                (u'AdresseTerrain', u'all\xe9e des Fleurs'),
-                (u'CoTypeDossier', 'PC'),
-                (u'Commune', u'AIGREFEUILLE SUR MAINE'),
-                (u'DateDepot', datetime.datetime(2019, 9, 19, 0, 0)),
-                (u'IdDossier', 478864),
-                (u'NomDossier', 'PC 069 085 19 00010'),
-                (u'TypeDossier', 'Permis de construire'),
+                ('AdresseTerrain', 'all\xe9e des Fleurs'),
+                ('CoTypeDossier', 'PC'),
+                ('Commune', 'AIGREFEUILLE SUR MAINE'),
+                ('DateDepot', datetime.datetime(2019, 9, 19, 0, 0)),
+                ('IdDossier', 478864),
+                ('NomDossier', 'PC 069 085 19 00010'),
+                ('TypeDossier', 'Permis de construire'),
             ]
         )
 
@@ -266,7 +266,7 @@ def test_pieces_management(connector, app, cached_data):
     assert len(data) == 5
     assert data[0]['text'] == 'Cerfa rempli'
     assert data[0]['max_files'] == 1
-    assert data[1]['text'] == u'Cerfa demandeurs complémentaires'
+    assert data[1]['text'] == 'Cerfa demandeurs complémentaires'
     assert data[1]['max_files'] == 6
     assert data[2]['text'] == 'Plan de situation du terrain'
     assert data[2]['max_files'] == 6
@@ -484,7 +484,7 @@ def test_status_error(connector, app, cached_data):
     resp = app.get('/cartads-cs/test/status?dossier_id=%s' % dossier.id)
     assert (
         resp.json['status_label']
-        == u"File refused (Le modèle sélectionné ne correspond à aucun Cerfa géré par l'application.)"
+        == "File refused (Le modèle sélectionné ne correspond à aucun Cerfa géré par l'application.)"
     )
 
 
@@ -496,7 +496,7 @@ def test_status_zip_not_considered_error(connector, app, cached_data):
     dossier.zip_ack_response = 'False'
     dossier.save()
     resp = app.get('/cartads-cs/test/status?dossier_id=%s' % dossier.id)
-    assert resp.json['status_label'] == u"File not considered"
+    assert resp.json['status_label'] == "File not considered"
 
 
 def test_additional_pieces_management(connector, app, cached_data):
@@ -510,7 +510,7 @@ def test_additional_pieces_management(connector, app, cached_data):
     assert len(data) == 2
     assert data[0]['text'] == 'Document graphique permettant...'
     assert data[0]['max_files'] == 6
-    assert data[1]['text'] == u'Formulaire attestant...'
+    assert data[1]['text'] == 'Formulaire attestant...'
     assert data[1]['max_files'] == 6
     for piece in data:
         assert len(piece['files']) == 1
diff --git a/tests/test_csv_datasource.py b/tests/test_csv_datasource.py
index 2c572255..7af94cee 100644
--- a/tests/test_csv_datasource.py
+++ b/tests/test_csv_datasource.py
@@ -245,7 +245,7 @@ def test_data(client, setup, filetype):
 
 
 def test_unicode_filter_data(client, setup, filetype):
-    filter_criteria = u'Benoît'
+    filter_criteria = 'Benoît'
     _, url = setup(',id,,text,', filename=filetype, data=get_file_content(filetype))
     filters = {'text': filter_criteria}
     resp = client.get(url, filters)
@@ -259,7 +259,7 @@ def test_unicode_filter_data(client, setup, filetype):
 
 def test_unicode_case_insensitive_filter_data(client, setup, filetype):
     _, url = setup(',id,,text,', filename=filetype, data=get_file_content(filetype))
-    filter_criteria = u'anaëlle'
+    filter_criteria = 'anaëlle'
     filters = {'text': filter_criteria, 'case-insensitive': ''}
     resp = client.get(url, filters)
     result = parse_response(resp)
diff --git a/tests/test_dpark.py b/tests/test_dpark.py
index 82338793..078f558c 100644
--- a/tests/test_dpark.py
+++ b/tests/test_dpark.py
@@ -94,7 +94,7 @@ class MockedService(object):
         elif self.error_class is TransportError:
             raise self.error_class('connection error occured', None)
         elif self.error_class is WebFaultHavingLatin1:
-            raise WebFault(message=u'éêè')
+            raise WebFault(message='éêè')
         else:
             raise Exception('random error')
 
@@ -129,7 +129,7 @@ def test_call_service_error(dpark, app):
         assert 'Error: random error' in resp.json['err_desc']
         client.return_value = get_client(error_class=WebFaultHavingLatin1)
         resp = app.get('/dpark/test/ping/')
-        assert u'ServiceError: éêè' in resp.json['err_desc']
+        assert 'ServiceError: éêè' in resp.json['err_desc']
 
 
 def test_ping(dpark, app):
@@ -156,7 +156,7 @@ def test_search(dpark, app):
         assert resp.json['code'] == 'unknown-file'
         # invalid cardnumber
         client.return_value = get_client(
-            replydata={'CodeRetour': '04', 'MessageRetour': u'Numéro de support inconnu'}
+            replydata={'CodeRetour': '04', 'MessageRetour': 'Numéro de support inconnu'}
         )
         resp = app.get('/dpark/test/search/', params=params)
         assert resp.json['err'] == 1
@@ -184,7 +184,7 @@ def test_link(dpark, app):
         assert resp.json['code'] == 'unknown-file'
         # invalid cardnumber
         client.return_value = get_client(
-            replydata={'CodeRetour': '04', 'MessageRetour': u'Numéro de support inconnu'}
+            replydata={'CodeRetour': '04', 'MessageRetour': 'Numéro de support inconnu'}
         )
         resp = app.post_json('/dpark/test/link/', params=params)
         assert resp.json['err'] == 1
@@ -420,11 +420,11 @@ def test_check_renewal_time(dpark, app):
         url = '/dpark/test/check-renewal-time/'
         params = {'firstnames': 'spam eggs', 'lastname': 'bar', 'filenumber': '1' * 9, 'badgenumber': '2' * 9}
         client.return_value = get_client(
-            replydata={'CodeRetour': '02', 'MessageRetour': u'Renouvellement hors délai'}
+            replydata={'CodeRetour': '02', 'MessageRetour': 'Renouvellement hors délai'}
         )
         resp = app.get(url, params=params)
         assert resp.json['data'] is False
-        assert resp.json['desc'] == u'Renouvellement hors délai'
+        assert resp.json['desc'] == 'Renouvellement hors délai'
         client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'})
         resp = app.get(url, params=params)
         assert resp.json['data'] is True
@@ -435,11 +435,11 @@ def test_check_renewal_duplicate(dpark, app):
         url = '/dpark/test/check-renewal-time/'
         params = {'firstnames': 'spam eggs', 'lastname': 'bar', 'filenumber': '1' * 9, 'badgenumber': '2' * 9}
         client.return_value = get_client(
-            replydata={'CodeRetour': '02', 'MessageRetour': u'Demande déjà en cours'}
+            replydata={'CodeRetour': '02', 'MessageRetour': 'Demande déjà en cours'}
         )
         resp = app.get(url, params=params)
         assert resp.json['data'] is False
-        assert resp.json['desc'] == u'Demande déjà en cours'
+        assert resp.json['desc'] == 'Demande déjà en cours'
         client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': 'Dossier existant'})
         resp = app.get(url, params=params)
         assert resp.json['data'] is True
@@ -459,11 +459,11 @@ def test_check_creation_duplicate(dpark, app):
             'applicant_lastname': 'Ham',
         }
         client.return_value = get_client(
-            replydata={'CodeRetour': '02', 'MessageRetour': u'Demande déjà en cours'}
+            replydata={'CodeRetour': '02', 'MessageRetour': 'Demande déjà en cours'}
         )
         resp = app.get(url, params=params)
         assert resp.json['data'] is False
-        assert resp.json['desc'] == u'Demande déjà en cours'
+        assert resp.json['desc'] == 'Demande déjà en cours'
         client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': ''})
         resp = app.get(url, params=params)
         assert resp.json['data'] is True
@@ -483,11 +483,11 @@ def test_check_creation_not_renewal(dpark, app):
             'applicant_lastname': 'Ham',
         }
         client.return_value = get_client(
-            replydata={'CodeRetour': '02', 'MessageRetour': u'Usager existe déjà dans D-Park'}
+            replydata={'CodeRetour': '02', 'MessageRetour': 'Usager existe déjà dans D-Park'}
         )
         resp = app.get(url, params=params)
         assert resp.json['data'] is False
-        assert resp.json['desc'] == u'Usager existe déjà dans D-Park'
+        assert resp.json['desc'] == 'Usager existe déjà dans D-Park'
         client.return_value = get_client(replydata={'CodeRetour': '01', 'MessageRetour': ''})
         resp = app.get(url, params=params)
         assert resp.json['data'] is True
@@ -508,13 +508,13 @@ def test_get_payment_infos(dpark, app):
             'badgenumber': '2' * 9,
         }
         Pairing.objects.create(resource=dpark, **params)
-        client.return_value = get_client(replydata={'CodeRetour': '02', 'MessageRetour': u'Dossier inconnu'})
+        client.return_value = get_client(replydata={'CodeRetour': '02', 'MessageRetour': 'Dossier inconnu'})
         resp = app.get(url)
         assert resp.json['err'] == 0
         assert resp.json['data'] == []
         replydata = {
             'CodeRetour': '01',
-            'MessageRetour': u'Demande acceptée',
+            'MessageRetour': 'Demande acceptée',
             'NumeroDemande': '55555',
             'Montant': 12500,
             'TypePaiement': 10,
@@ -568,7 +568,7 @@ def test_payment_notification(dpark, app, transaction_datetime, expected_date):
                 'badgenumber': '2' * 9,
             },
         )
-        operation.return_value = mock.Mock(CodeRetour='02', MessageRetour=u'Dossier inconnu')
+        operation.return_value = mock.Mock(CodeRetour='02', MessageRetour='Dossier inconnu')
         resp = app.post_json(url, params=params)
         assert operation.call_args_list[-1].args[5] == expected_date
         assert resp.json['err'] == 1
@@ -630,7 +630,7 @@ def test_registration(dpark, app, application_thirdparty_subscription):
     )
     assert demande_abonnementtiers in force_text(dpark.mock_requests[0].body)
     assert resp.json['err'] == 1
-    assert resp.json['err_desc'] == u'Dossier incomplet'
+    assert resp.json['err_desc'] == 'Dossier incomplet'
     # with complete application
     dpark.mock_responses.append(
         """<?xml version="1.0" encoding="utf-8"?>
@@ -668,7 +668,7 @@ def test_send_files(dpark, app, settings, freezer):
         soap_call.side_effect = APIError('Numéro de demande introuvable')
         resp = app.post_json(url, params=params)
         assert resp.json['err'] == 1
-        assert resp.json['err_desc'] == u'Numéro de demande introuvable'
+        assert resp.json['err_desc'] == 'Numéro de demande introuvable'
 
     params['justif_domicile'] = {
         'filename': 'address_proof.pDf',
@@ -699,10 +699,10 @@ def test_send_files(dpark, app, settings, freezer):
     params['impot_revenu'] = 'this is my tax notice'
     resp = app.post_json(url, params=params)
     errors = [
-        u"<impot_revenu> value is not a dict",
-        u"<taxe_habitat> <content> is either absent or has an invalid value",
-        u"<taxe_habitat,2> <filename> is either absent or has an invalid value",
-        u"Invalid document type: <toto,6>",
+        "<impot_revenu> value is not a dict",
+        "<taxe_habitat> <content> is either absent or has an invalid value",
+        "<taxe_habitat,2> <filename> is either absent or has an invalid value",
+        "Invalid document type: <toto,6>",
     ]
     assert resp.json['err'] == 1
     assert resp.json['err_desc'] == '%s' % errors
diff --git a/tests/test_feeds.py b/tests/test_feeds.py
index 5a27e5ff..c4dfa8bd 100644
--- a/tests/test_feeds.py
+++ b/tests/test_feeds.py
@@ -6,7 +6,7 @@ import pytest
 import tests.utils
 from passerelle.apps.feeds.models import Feed
 
-FEED_EXAMPLE = u"""<?xml version="1.0" encoding="UTF-8"?>
+FEED_EXAMPLE = """<?xml version="1.0" encoding="UTF-8"?>
 <feed xmlns="http://www.w3.org/2005/Atom" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/">
   <title>Actualités de Strasbourg</title>
   <link rel="alternate" href="http://www.strasbourg.eu/fr/actualites/-/asset_publisher/lG7u/rss" />
diff --git a/tests/test_gdema.py b/tests/test_gdema.py
index b20dc47f..ac1e7f99 100644
--- a/tests/test_gdema.py
+++ b/tests/test_gdema.py
@@ -79,7 +79,7 @@ def test_gdema_services_and_typologies(app, gdema):
         assert resp.json['err'] == 0
         assert len(resp.json['data']) == 3
         assert resp.json['data'][0]['id'] == '16151'
-        assert resp.json['data'][0]['text'] == u'DMT - Mobilité et transports'
+        assert resp.json['data'][0]['text'] == 'DMT - Mobilité et transports'
 
         resp = app.get(endpoint + '/typology/', status=200)
         assert requests_get.call_count == 2
@@ -87,11 +87,11 @@ def test_gdema_services_and_typologies(app, gdema):
         assert resp.json['err'] == 0
         assert len(resp.json['data']) == 12
         assert resp.json['data'][0]['id'] == '13067'
-        assert resp.json['data'][0]['text'] == u'Maintenance Cie'
+        assert resp.json['data'][0]['text'] == 'Maintenance Cie'
         assert resp.json['data'][0]['service_id'] == '10173'
         assert (
             resp.json['data'][0]['service_text']
-            == u'DESPU - Administration Direction environnement et services publics urbains'
+            == 'DESPU - Administration Direction environnement et services publics urbains'
         )
 
         resp = app.get(endpoint + '/typology/?service_id=10426', status=200)
@@ -100,9 +100,9 @@ def test_gdema_services_and_typologies(app, gdema):
         assert resp.json['err'] == 0
         assert len(resp.json['data']) == 7
         assert resp.json['data'][0]['id'] == '10804'
-        assert resp.json['data'][0]['text'] == u'Activités périscolaires'
+        assert resp.json['data'][0]['text'] == 'Activités périscolaires'
         assert resp.json['data'][0]['service_id'] == '10426'
-        assert resp.json['data'][0]['service_text'] == u'DEE - Périscolaire et éducatif'
+        assert resp.json['data'][0]['service_text'] == 'DEE - Périscolaire et éducatif'
 
 
 def test_gdema_referentiel(app, gdema):
@@ -143,7 +143,7 @@ def test_gdema_get_request(app, gdema):
         assert resp.json['err'] == 0
         assert resp.json['data']['Id'] == '1'
         assert resp.json['data']['AnswerToProvide'] is True
-        assert resp.json['data']['Description'].startswith(u'contrôle')
+        assert resp.json['data']['Description'].startswith('contrôle')
         assert resp.json['data']['ExpectedDate'] is None
         assert resp.json['data']['Files'] == []
         assert resp.json['data']['Handler']['CivilityId'] == '0'
@@ -158,7 +158,7 @@ def test_gdema_get_request(app, gdema):
         assert requests_get.call_args[0][0] == 'https://gdema.example.net/api/request/1/state'
         assert 'data' in resp.json
         assert resp.json['err'] == 0
-        assert resp.json['data'] == {'Id': '1', 'State': '64', 'StateLabel': u'Cloturée'}
+        assert resp.json['data'] == {'Id': '1', 'State': '64', 'StateLabel': 'Cloturée'}
 
 
 def test_gdema_create_request(app, gdema):
diff --git a/tests/test_generic_endpoint.py b/tests/test_generic_endpoint.py
index 9ab8a7e9..4870787f 100644
--- a/tests/test_generic_endpoint.py
+++ b/tests/test_generic_endpoint.py
@@ -128,13 +128,13 @@ def test_proxy_logger(mocked_get, caplog, app, arcgis):
     assert record.levelno == 20
     assert record.levelname == 'INFO'
     assert record.name == 'passerelle.resource.arcgis.test'
-    assert u"endpoint GET /arcgis/test/mapservice-query?" in record.message
+    assert "endpoint GET /arcgis/test/mapservice-query?" in record.message
     assert not hasattr(record, 'connector_result')
     record = caplog.records[1]
     assert record.levelno == 10
     assert record.levelname == 'DEBUG'
     assert record.name == 'passerelle.resource.arcgis.test'
-    assert u"endpoint GET /arcgis/test/mapservice-query?" in record.message
+    assert "endpoint GET /arcgis/test/mapservice-query?" in record.message
     assert hasattr(record, 'connector_result')
 
     data = resp.json['data']
@@ -434,7 +434,7 @@ def test_endpoint_decorator_pre_process(db, app):
     with patch_init, patch_object:
         resp = app.post_json(url_foo, params=payload, status=400)
     assert resp.json['err'] == 1
-    assert resp.json['err_desc'] == "foo/1/id: None is not of type %s" % repr(u'integer')
+    assert resp.json['err_desc'] == "foo/1/id: None is not of type %s" % repr('integer')
     with patch_init, patch_object:
         resp = app.post_json(url_bar, params=payload)
     assert resp.json['err'] == 0
diff --git a/tests/test_grenoble_gru.py b/tests/test_grenoble_gru.py
index 7dc9ba3d..1ca281b5 100644
--- a/tests/test_grenoble_gru.py
+++ b/tests/test_grenoble_gru.py
@@ -226,8 +226,8 @@ def test_demand_creation_params(app, setup):
     with mock.patch('passerelle.utils.Request.post') as request_post:
         request_post.return_value = get_typo_response()
         payload = BASIC_PAYLOAD.copy()
-        payload['intervention_free_address'] = u'169, rue du Château'
-        payload['applicant_free_address'] = u'1, rue de l\'Est'
+        payload['intervention_free_address'] = '169, rue du Château'
+        payload['applicant_free_address'] = '1, rue de l\'Est'
         app.post_json(
             reverse(
                 'generic-endpoint',
@@ -235,11 +235,11 @@ def test_demand_creation_params(app, setup):
             ),
             params=payload,
         )
-        assert request_post.call_args[1]['data']['int_adresse_manuelle'] == u'169, rue du Château'
-        assert request_post.call_args[1]['data']['dem_adresse_manuelle'] == u'1, rue de l\'Est'
+        assert request_post.call_args[1]['data']['int_adresse_manuelle'] == '169, rue du Château'
+        assert request_post.call_args[1]['data']['dem_adresse_manuelle'] == '1, rue de l\'Est'
         assert request_post.call_args[1]['data']['obs_demande_urgente'] == 1
         assert request_post.call_args[1]['data']['dem_comp'] == 'Voirie'
-        assert request_post.call_args[1]['data']['dem_pav'] == u'déchetterie'
+        assert request_post.call_args[1]['data']['dem_pav'] == 'déchetterie'
         assert request_post.call_args[1]['data']['dem_reponse'] == 0
         assert request_post.call_args[1]['data']['obs_description_probleme'] == 'thank you '
 
diff --git a/tests/test_iws.py b/tests/test_iws.py
index c1bdeff1..4be0140f 100644
--- a/tests/test_iws.py
+++ b/tests/test_iws.py
@@ -52,8 +52,8 @@ def test_checkdate_dechet_or_encombrant(app, setup, endpoint_dummy_cache):
     )
     json_result = response.json_body
     assert json_result['err'] == 1
-    assert u'DECHET' in json_result['err_desc']
-    assert u'ENCOMBRANT' in json_result['err_desc']
+    assert 'DECHET' in json_result['err_desc']
+    assert 'ENCOMBRANT' in json_result['err_desc']
 
 
 def test_checkdate_sti_code_optionnal_last_char(app, setup, endpoint_dummy_cache, monkeypatch):
diff --git a/tests/test_lille_kimoce.py b/tests/test_lille_kimoce.py
index 9b14b342..70345c3e 100644
--- a/tests/test_lille_kimoce.py
+++ b/tests/test_lille_kimoce.py
@@ -321,7 +321,7 @@ def test_create_demand(mocked_post, app, setup):
         'companyLocation': {'number': '', 'road': '', 'zipCode': '', 'city': ''},
         'pictures': [],
         'subType': '/api/sub_types/164',
-        'sourceContact': {'firstname': 'Foo', 'mail': 'foo@example.net', 'lastname': u'Bar'},
+        'sourceContact': {'firstname': 'Foo', 'mail': 'foo@example.net', 'lastname': 'Bar'},
     }
     assert response.json['data'] == json.loads(DEMAND_CREATION_RESPONSE)
     assert mocked_post.call_count == 2
diff --git a/tests/test_okina.py b/tests/test_okina.py
index bd7612ec..08a03861 100644
--- a/tests/test_okina.py
+++ b/tests/test_okina.py
@@ -1686,7 +1686,7 @@ def test_okina_classes(app, okina):
         assert resp.json['err'] == 0
         assert len(resp.json['data']) == 4
         assert resp.json['data'][0]['id'] == '1'
-        assert resp.json['data'][0]['text'] == u'École maternelle - Petite section'
+        assert resp.json['data'][0]['text'] == 'École maternelle - Petite section'
 
 
 def test_okina_institutions(app, okina):
@@ -1700,7 +1700,7 @@ def test_okina_institutions(app, okina):
             assert resp.json['err'] == 0
             assert len(resp.json['data']) == 2
             assert resp.json['data'][0]['id'] == '277'
-            assert resp.json['data'][0]['text'] == u'Collège Touvent'
+            assert resp.json['data'][0]['text'] == 'Collège Touvent'
             assert resp.json['data'][0]['lat'] == '46.791332586468016'
             assert resp.json['data'][0]['lon'] == '1.6926355997775921'
 
@@ -1711,7 +1711,7 @@ def test_okina_institutions(app, okina):
             assert resp.json['err'] == 0
             assert len(resp.json['data']) == 2
             assert resp.json['data'][0]['id'] == '277'
-            assert resp.json['data'][0]['text'] == u'Collège Touvent'
+            assert resp.json['data'][0]['text'] == 'Collège Touvent'
 
             resp = app.get(endpoint + '/from-city/36005/', status=200)
             assert (
@@ -1721,7 +1721,7 @@ def test_okina_institutions(app, okina):
             assert resp.json['err'] == 0
             assert len(resp.json['data']) == 2
             assert resp.json['data'][0]['id'] == '277'
-            assert resp.json['data'][0]['text'] == u'Collège Touvent'
+            assert resp.json['data'][0]['text'] == 'Collège Touvent'
 
 
 def test_okina_search(app, okina):
@@ -1783,7 +1783,7 @@ def test_okina_stops_area(app, okina):
         assert resp.json['err'] == 0
         assert len(resp.json['data']) == 3
         assert resp.json['data'][0]['id'] == '3281'
-        assert resp.json['data'][0]['text'] == u'Les Loges de Dressais'
+        assert resp.json['data'][0]['text'] == 'Les Loges de Dressais'
 
 
 def test_okina_ods(app, okina):
@@ -1846,7 +1846,7 @@ def test_okina_ods(app, okina):
         assert len(resp.json['data']) == 1
         assert resp.json['data'][0]['id'] == 'inst:276-seq:1-6-84'
         assert (
-            resp.json['data'][0]['text'] == u'Brenne 1 vers écoles Antoine Fée, Saint Martin et Saint Vincent'
+            resp.json['data'][0]['text'] == 'Brenne 1 vers écoles Antoine Fée, Saint Martin et Saint Vincent'
         )
         assert resp.json['data'][0]['identifier'] == 'SYNDICAT ARDENTES 4 (semaine Aller)'
         assert resp.json['data'][0]['vehicle_journey_id'] == '84'
@@ -1858,7 +1858,7 @@ def test_okina_ods(app, okina):
         assert len(resp.json['data']) == 1
         assert resp.json['data'][0]['id'] == 'inst:276-seq:1-6-84'
         assert (
-            resp.json['data'][0]['text'] == u'Brenne 1 vers écoles Antoine Fée, Saint Martin et Saint Vincent'
+            resp.json['data'][0]['text'] == 'Brenne 1 vers écoles Antoine Fée, Saint Martin et Saint Vincent'
         )
         assert resp.json['data'][0]['identifier'] == 'SYNDICAT ARDENTES 4 (semaine Aller)'
         assert resp.json['data'][0]['vehicle_journey_id'] == '84'
@@ -1882,7 +1882,7 @@ def test_okina_topology(app, okina):
         assert resp.json['err'] == 0
         assert len(resp.json['data']) == 1
         assert resp.json['data'][0]['id'] == '2'
-        assert resp.json['data'][0]['text'] == u'réseau scolaire'
+        assert resp.json['data'][0]['text'] == 'réseau scolaire'
 
         requests_get.return_value = tests.utils.FakedResponse(content=VEHICLE_JOURNEYS, status_code=200)
         resp = app.get(endpoint + '/vehicle-journeys/', status=200)
@@ -1890,7 +1890,7 @@ def test_okina_topology(app, okina):
         assert resp.json['err'] == 0
         assert len(resp.json['data']) == 3
         assert resp.json['data'][0]['id'] == '306'
-        assert resp.json['data'][0]['text'] == u'019 02 - VELLES LYCEES DE CHATEAUROUX'
+        assert resp.json['data'][0]['text'] == '019 02 - VELLES LYCEES DE CHATEAUROUX'
 
 
 def test_okina_errors(app, okina):
diff --git a/tests/test_opendatasoft.py b/tests/test_opendatasoft.py
index a828da5e..237c75cb 100644
--- a/tests/test_opendatasoft.py
+++ b/tests/test_opendatasoft.py
@@ -50,7 +50,7 @@ FAKED_CONTENT_Q_SEARCH = json.dumps(
                     "nom_rue": "RUE DE L'AUBEPINE",
                     "num_com": 482,
                     "numero": "33",
-                    "source": u"Ville et Eurométropole de Strasbourg",
+                    "source": "Ville et Eurométropole de Strasbourg",
                 },
                 "geometry": {"coordinates": [7.76978279836, 48.6060963542], "type": "Point"},
                 "record_timestamp": "2019-12-02T14:15:08.376000+00:00",
@@ -66,7 +66,7 @@ FAKED_CONTENT_Q_SEARCH = json.dumps(
                     "nom_rue": "RUE DE L'AUBEPINE",
                     "num_com": 268,
                     "numero": "19",
-                    "source": u"Ville et Eurométropole de Strasbourg",
+                    "source": "Ville et Eurométropole de Strasbourg",
                 },
                 "geometry": {"coordinates": [7.66177412454, 48.4920620548], "type": "Point"},
                 "record_timestamp": "2019-12-02T14:15:08.376000+00:00",
@@ -82,7 +82,7 @@ FAKED_CONTENT_Q_SEARCH = json.dumps(
                     "nom_rue": "RUE DE L'AUBEPINE",
                     "num_com": 482,
                     "numero": "29",
-                    "source": u"Ville et Eurométropole de Strasbourg",
+                    "source": "Ville et Eurométropole de Strasbourg",
                 },
                 "geometry": {"coordinates": [7.76988497729, 48.6056497224], "type": "Point"},
                 "record_timestamp": "2019-12-02T14:15:08.376000+00:00",
@@ -113,7 +113,7 @@ FAKED_CONTENT_ID_SEARCH = json.dumps(
                     "nom_rue": "RUE DE L'AUBEPINE",
                     "num_com": 268,
                     "numero": "19",
-                    u"source": "Ville et Eurométropole de Strasbourg",
+                    "source": "Ville et Eurométropole de Strasbourg",
                 },
                 "geometry": {"coordinates": [7.66177412454, 48.4920620548], "type": "Point"},
                 "record_timestamp": "2019-12-02T14:15:08.376000+00:00",
diff --git a/tests/test_opengis.py b/tests/test_opengis.py
index 49ce5d0a..f23036ff 100644
--- a/tests/test_opengis.py
+++ b/tests/test_opengis.py
@@ -142,7 +142,7 @@ FAKE_FEATURES_JSON = '''
     "type": "FeatureCollection"
 }'''
 
-FAKE_ERROR = u'''<ows:ExceptionReport
+FAKE_ERROR = '''<ows:ExceptionReport
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:ows="http://www.opengis.net/ows/1.1"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
diff --git a/tests/test_photon.py b/tests/test_photon.py
index 3156aa7c..be0ee422 100644
--- a/tests/test_photon.py
+++ b/tests/test_photon.py
@@ -147,7 +147,7 @@ def test_photon_search_qs_parameters_error(app, photon, mock_photon_search):
     resp = app.get('/photon/%s/search' % photon.slug, status=400)
     assert resp.json['err'] == 1
     assert resp.json['err_class'] == 'passerelle.views.WrongParameter'
-    assert resp.json['err_desc'] == u"missing parameters: 'q'."
+    assert resp.json['err_desc'] == "missing parameters: 'q'."
 
 
 @mock.patch('passerelle.utils.Request.get')
diff --git a/tests/test_planitech.py b/tests/test_planitech.py
index 9f95afe6..e28756e7 100644
--- a/tests/test_planitech.py
+++ b/tests/test_planitech.py
@@ -520,9 +520,9 @@ def test_getplaces_referential(app, connector, monkeypatch):
             'some_custom_field': None,
         },
         '3': {
-            u'capacity': 30,
-            u'label': u'salle 3',
-            u'identifier': 3,
+            'capacity': 30,
+            'label': 'salle 3',
+            'identifier': 3,
             'street_number': None,
             'address': None,
             'city': None,
@@ -530,9 +530,9 @@ def test_getplaces_referential(app, connector, monkeypatch):
             'some_custom_field': 'Yes',
         },
         '2': {
-            u'capacity': 20,
-            u'label': u'salle 2',
-            u'identifier': 2,
+            'capacity': 20,
+            'label': 'salle 2',
+            'identifier': 2,
             'street_number': None,
             'address': None,
             'city': None,
@@ -540,9 +540,9 @@ def test_getplaces_referential(app, connector, monkeypatch):
             'some_custom_field': 'Yes',
         },
         '1': {
-            u'capacity': 10,
-            u'label': u'salle 1',
-            u'identifier': 1,
+            'capacity': 10,
+            'label': 'salle 1',
+            'identifier': 1,
             'street_number': 1,
             'address': 'rue planitech',
             'city': 'thecity',
@@ -557,9 +557,9 @@ def test_getplaces_referential(app, connector, monkeypatch):
     response = app.get('/planitech/slug-planitech/getplacesreferential?some_custom_field=Yes')
     assert response.json['data'] == {
         '3': {
-            u'capacity': 30,
-            u'label': u'salle 3',
-            u'identifier': 3,
+            'capacity': 30,
+            'label': 'salle 3',
+            'identifier': 3,
             'street_number': None,
             'address': None,
             'city': None,
@@ -567,9 +567,9 @@ def test_getplaces_referential(app, connector, monkeypatch):
             'some_custom_field': 'Yes',
         },
         '2': {
-            u'capacity': 20,
-            u'label': u'salle 2',
-            u'identifier': 2,
+            'capacity': 20,
+            'label': 'salle 2',
+            'identifier': 2,
             'street_number': None,
             'address': None,
             'city': None,
@@ -585,9 +585,9 @@ def test_getplaces_referential(app, connector, monkeypatch):
     )
     assert response.json['data'] == {
         '3': {
-            u'capacity': 30,
-            u'label': u'salle 3',
-            u'identifier': 3,
+            'capacity': 30,
+            'label': 'salle 3',
+            'identifier': 3,
             'street_number': None,
             'address': None,
             'city': None,
@@ -610,9 +610,9 @@ def test_getplaces_referential(app, connector, monkeypatch):
             'some_custom_field': None,
         },
         '3': {
-            u'capacity': 30,
-            u'label': u'salle 3',
-            u'identifier': 3,
+            'capacity': 30,
+            'label': 'salle 3',
+            'identifier': 3,
             'street_number': None,
             'address': None,
             'city': None,
@@ -620,9 +620,9 @@ def test_getplaces_referential(app, connector, monkeypatch):
             'some_custom_field': 'Yes',
         },
         '2': {
-            u'capacity': 20,
-            u'label': u'salle 2',
-            u'identifier': 2,
+            'capacity': 20,
+            'label': 'salle 2',
+            'identifier': 2,
             'street_number': None,
             'address': None,
             'city': None,
@@ -630,9 +630,9 @@ def test_getplaces_referential(app, connector, monkeypatch):
             'some_custom_field': 'Yes',
         },
         '1': {
-            u'capacity': 10,
-            u'label': u'salle 1',
-            u'identifier': 1,
+            'capacity': 10,
+            'label': 'salle 1',
+            'identifier': 1,
             'street_number': 1,
             'address': 'rue planitech',
             'city': 'thecity',
@@ -665,9 +665,9 @@ def test_getplace(app, connector, monkeypatch):
     mock_planitech(monkeypatch, side_effect=side_effect)
     response = app.get('/planitech/slug-planitech/getplace?id=2')
     assert response.json['data'] == {
-        u'capacity': 20,
-        u'label': u'salle 2',
-        u'identifier': 2,
+        'capacity': 20,
+        'label': 'salle 2',
+        'identifier': 2,
         'street_number': None,
         'address': None,
         'city': None,
@@ -715,18 +715,18 @@ def test_getplaces_referential_no_configuration(app, connector, monkeypatch):
     response = app.get('/planitech/slug-planitech/getplacesreferential')
     expected_res = {
         '2': {
-            u'capacity': 20,
-            u'label': u'salle 2',
-            u'identifier': 2,
+            'capacity': 20,
+            'label': 'salle 2',
+            'identifier': 2,
             'street_number': None,
             'address': None,
             'city': None,
             'zipcode': None,
         },
         '1': {
-            u'capacity': 10,
-            u'label': u'salle 1',
-            u'identifier': 1,
+            'capacity': 10,
+            'label': 'salle 1',
+            'identifier': 1,
             'street_number': 1,
             'address': 'rue planitech',
             'city': 'thecity',
@@ -813,14 +813,14 @@ def test_get_reservations_infos(app, connector, monkeypatch):
 def freegaps_data():
     referential = collections.OrderedDict(
         [
-            (1.0, {u'capacity': 10.0, u'label': u'salle 1', u'identifier': 1.0}),
+            (1.0, {'capacity': 10.0, 'label': 'salle 1', 'identifier': 1.0}),
             (
                 2.0,
-                {u'capacity': 20.0, u'label': u'salle 2', u'identifier': 2.0, u'some_custom_field': u'Yes'},
+                {'capacity': 20.0, 'label': 'salle 2', 'identifier': 2.0, 'some_custom_field': 'Yes'},
             ),
             (
                 3.0,
-                {u'capacity': 30.0, u'label': u'salle 3', u'identifier': 3.0, u'some_custom_field': u'Yes'},
+                {'capacity': 30.0, 'label': 'salle 3', 'identifier': 3.0, 'some_custom_field': 'Yes'},
             ),
         ]
     )
@@ -868,9 +868,9 @@ def test_get_freegaps(app, connector, monkeypatch, settings):
         '&start_date=2018-11-11&display=date'
     )
     assert response.json['data'] == [
-        {u'id': u'2018-11-11', u'text': u'dimanche 11 novembre 2018', u'short_text': '11/11/2018'},
-        {u'id': u'2018-11-12', u'text': u'lundi 12 novembre 2018', u'short_text': '12/11/2018'},
-        {u'id': u'2018-11-13', u'text': u'mardi 13 novembre 2018', u'short_text': '13/11/2018'},
+        {'id': '2018-11-11', 'text': 'dimanche 11 novembre 2018', 'short_text': '11/11/2018'},
+        {'id': '2018-11-12', 'text': 'lundi 12 novembre 2018', 'short_text': '12/11/2018'},
+        {'id': '2018-11-13', 'text': 'mardi 13 novembre 2018', 'short_text': '13/11/2018'},
     ]
 
     # place display
@@ -878,7 +878,7 @@ def test_get_freegaps(app, connector, monkeypatch, settings):
         '/planitech/slug-planitech/getfreegaps?start_time=10:00&&end_time=11:00'
         '&start_date=2018-11-11&display=place'
     )
-    assert response.json['data'] == [{u'id': 1.0, u'text': u'salle 1'}, {u'id': 2.0, u'text': u'salle 2'}]
+    assert response.json['data'] == [{'id': 1.0, 'text': 'salle 1'}, {'id': 2.0, 'text': 'salle 2'}]
 
     # full display
     response = app.get(
@@ -893,29 +893,29 @@ def test_get_freegaps(app, connector, monkeypatch, settings):
 
     place_1 = full[0]
     assert place_1['id'] == 1.0
-    assert place_1['text'] == u'salle 1'
+    assert place_1['text'] == 'salle 1'
     assert place_1['dates'] == [
-        {u'available': True, u'id': u'2018-11-11'},
-        {u'available': True, u'id': u'2018-11-12'},
-        {u'available': False, u'id': u'2018-11-13'},
+        {'available': True, 'id': '2018-11-11'},
+        {'available': True, 'id': '2018-11-12'},
+        {'available': False, 'id': '2018-11-13'},
     ]
 
     place_2 = full[1]
     assert place_2['id'] == 2.0
-    assert place_2['text'] == u'salle 2'
+    assert place_2['text'] == 'salle 2'
     assert place_2['dates'] == [
-        {u'available': True, u'id': u'2018-11-11'},
-        {u'available': True, u'id': u'2018-11-12'},
-        {u'available': True, u'id': u'2018-11-13'},
+        {'available': True, 'id': '2018-11-11'},
+        {'available': True, 'id': '2018-11-12'},
+        {'available': True, 'id': '2018-11-13'},
     ]
 
     place_3 = full[2]
     assert place_3['id'] == 3.0
-    assert place_3['text'] == u'salle 3'
+    assert place_3['text'] == 'salle 3'
     assert place_3['dates'] == [
-        {u'available': False, u'id': u'2018-11-11'},
-        {u'available': False, u'id': u'2018-11-12'},
-        {u'available': False, u'id': u'2018-11-13'},
+        {'available': False, 'id': '2018-11-11'},
+        {'available': False, 'id': '2018-11-12'},
+        {'available': False, 'id': '2018-11-13'},
     ]
 
     # general params interpretation
diff --git a/tests/test_proxylogger.py b/tests/test_proxylogger.py
index 50b2b03e..4d022bbe 100644
--- a/tests/test_proxylogger.py
+++ b/tests/test_proxylogger.py
@@ -43,39 +43,39 @@ def email_handler():
 
 def test_proxy_logger_basic(db, connector):
     pr = ProxyLogger(connector)
-    pr.debug(u'some message')
+    pr.debug('some message')
     rl_query = ResourceLog.objects.all()
     assert len(rl_query) == 1
     rl = rl_query.first()
-    assert rl.message == u'some message'
+    assert rl.message == 'some message'
     assert rl.levelno == logging.DEBUG
-    assert rl.appname == u'feeds'
-    assert rl.slug == u'some-slug'
+    assert rl.appname == 'feeds'
+    assert rl.slug == 'some-slug'
 
 
 def test_proxy_logger_std_interpolation(db, connector):
     ResourceLog.objects.all().delete()
     pr = ProxyLogger(connector)
-    pr.debug(u'some message %s', u'some var')
+    pr.debug('some message %s', 'some var')
     rl_query = ResourceLog.objects.all()
     rl = rl_query.first()
-    assert rl.message == u'some message some var'
+    assert rl.message == 'some message some var'
 
 
 def test_proxy_logger_dict_interpolation(db, connector):
     ResourceLog.objects.all().delete()
     pr = ProxyLogger(connector)
-    pr.debug(u'some message %(var_name)s', {u'var_name': u'some var'})
+    pr.debug('some message %(var_name)s', {'var_name': 'some var'})
     rl_query = ResourceLog.objects.all()
     rl = rl_query.first()
-    assert rl.message == u'some message some var'
+    assert rl.message == 'some message some var'
 
 
 def test_proxy_logger_ignore(db, connector):
     ResourceLog.objects.all().delete()
     connector.set_log_level('INFO')
     pr = ProxyLogger(connector)
-    pr.debug(u'some message')
+    pr.debug('some message')
     assert len(ResourceLog.objects.all()) == 0
 
 
@@ -85,7 +85,7 @@ def test_proxy_logger_ignore_when_down(db, connector):
     assert connector.down() is True
     ResourceLog.objects.all().delete()
     pr = ProxyLogger(connector)
-    pr.debug(u'some message')
+    pr.debug('some message')
     assert len(ResourceLog.objects.all()) == 0
 
 
@@ -181,7 +181,7 @@ def test_validate_notification_delays(db, connector):
 
 @pytest.mark.parametrize('notification_delays', ['0', '0,5,100', '5,100'])
 def test_log_on_connector_availability_change(db, connector, freezer, notification_delays):
-    connector.title = u'éléphant'
+    connector.title = 'éléphant'
     availability_parameters = connector.availability_parameters
     availability_parameters.notification_delays = notification_delays
     availability_parameters.save()
@@ -203,7 +203,7 @@ def test_log_on_connector_availability_change(db, connector, freezer, notificati
     assert last_count1 == 2
     assert ResourceLog.objects.all()[0].message == 'GET http://example.net/ (=> 404)'
     assert ResourceLog.objects.all()[1].level == 'error' if notification_delays.startswith('0') else 'warning'
-    assert u'connector "éléphant" (Feed) is now down: 404 Client' in ResourceLog.objects.all()[1].message
+    assert 'connector "éléphant" (Feed) is now down: 404 Client' in ResourceLog.objects.all()[1].message
 
     # move 5 minutes in the future
     freezer.move_to(datetime.timedelta(seconds=60 * 5 + 1))
@@ -219,7 +219,7 @@ def test_log_on_connector_availability_change(db, connector, freezer, notificati
         assert last_count2 == last_count1 + 1
         assert ResourceLog.objects.all()[2].level == 'error' if notification_delays != '0' else 'warning'
         assert (
-            u'connector "éléphant" (Feed) has been down for 5 minutes: 404'
+            'connector "éléphant" (Feed) has been down for 5 minutes: 404'
             in ResourceLog.objects.all()[2].message
         )
 
@@ -240,7 +240,7 @@ def test_log_on_connector_availability_change(db, connector, freezer, notificati
     last_count3 = ResourceLog.objects.count()
     assert last_count3 == last_count2 + 1
     assert ResourceLog.objects.latest('id').level == 'info'
-    assert ResourceLog.objects.latest('id').message == u'connector "éléphant" (Feed) is back up'
+    assert ResourceLog.objects.latest('id').message == 'connector "éléphant" (Feed) is back up'
 
     # move 3 minutes in the future
     freezer.move_to(datetime.timedelta(seconds=60 * 3 + 1))
diff --git a/tests/test_requests.py b/tests/test_requests.py
index ddbd30c2..ae2f72e6 100644
--- a/tests/test_requests.py
+++ b/tests/test_requests.py
@@ -466,12 +466,12 @@ def test_log_http_request(caplog):
     del extra['request_headers']['User-Agent']
     assert extra == {
         'request_headers': {
-            u'Accept': u'*/*',
-            u'Accept-Encoding': u'gzip, deflate, br',
-            u'Connection': u'keep-alive',
+            'Accept': '*/*',
+            'Accept-Encoding': 'gzip, deflate, br',
+            'Connection': 'keep-alive',
         },
         'request_url': 'https://example.com/',
-        'response_headers': {u'Error Webservice': u'\ufffd'},
+        'response_headers': {'Error Webservice': '\ufffd'},
         'response_status': 200,
     }
 
diff --git a/tests/test_signature.py b/tests/test_signature.py
index 157e6bd0..10b0248d 100644
--- a/tests/test_signature.py
+++ b/tests/test_signature.py
@@ -33,8 +33,8 @@ def test_signature():
     assert '&nonce=' in signature.sign_url(URL, KEY)
 
     # Test unicode key conversion to UTF-8
-    assert signature.check_url(signature.sign_url(URL, u'\xe9\xe9'), b'\xc3\xa9\xc3\xa9')
-    assert signature.check_url(signature.sign_url(URL, b'\xc3\xa9\xc3\xa9'), u'\xe9\xe9')
+    assert signature.check_url(signature.sign_url(URL, '\xe9\xe9'), b'\xc3\xa9\xc3\xa9')
+    assert signature.check_url(signature.sign_url(URL, b'\xc3\xa9\xc3\xa9'), '\xe9\xe9')
 
     # Test timedelta parameter
     now = datetime.datetime.utcnow()
diff --git a/tests/test_soap.py b/tests/test_soap.py
index 5e81c628..43f4c349 100644
--- a/tests/test_soap.py
+++ b/tests/test_soap.py
@@ -68,7 +68,7 @@ def test_disable_strict_mode(mocked_post):
 
     soap_resource = SOAPResource()
     client = SOAPClient(soap_resource)
-    match = "Unexpected element %s, expected %s" % (repr(u'price'), repr(u'skipMe'))
+    match = "Unexpected element %s, expected %s" % (repr('price'), repr('skipMe'))
     with pytest.raises(XMLParseError, match=match):
         client.service.GetLastTradePrice(tickerSymbol='banana')
 
diff --git a/tests/test_solis.py b/tests/test_solis.py
index 3b8bf6ab..4f6d5b9d 100644
--- a/tests/test_solis.py
+++ b/tests/test_solis.py
@@ -145,7 +145,7 @@ def test_solis_ping(app, solis, ping_response):
         resp = app.get(endpoint, status=200)
         assert resp.json['err'] == 0
         assert resp.json['data'] == 'pong'
-        assert resp.json['response'] == u'Solis API est opérationnel.'
+        assert resp.json['response'] == 'Solis API est opérationnel.'
 
         assert requests_get.call_args[1]['auth'] == ('usertest', 'userpass')
         assert requests_get.call_args[1]['verify'] is True
@@ -498,18 +498,18 @@ def test_solis_referentiels(app, solis):
         assert requests_get.call_args[0][0].endswith('/solisapi/referentiels/trans/departement')
         assert resp.json['err'] == 0
         assert len(resp.json['data']) == 1
-        assert resp.json['data'][0]['text'] == u'Ardèche'
+        assert resp.json['data'][0]['text'] == 'Ardèche'
 
         resp = app.get(url + '/trans/departement/?q=arde', status=200)
         assert resp.json['err'] == 0
         assert len(resp.json['data']) == 2
-        assert (resp.json['data'][0]['text'], resp.json['data'][1]['text']) == (u'Ardèche', 'Ardennes')
+        assert (resp.json['data'][0]['text'], resp.json['data'][1]['text']) == ('Ardèche', 'Ardennes')
 
         resp = app.get(url + '/trans/departement/?id=7', status=200)
         assert requests_get.call_args[0][0].endswith('/solisapi/referentiels/trans/departement')
         assert resp.json['err'] == 0
         assert len(resp.json['data']) == 1
-        assert resp.json['data'][0]['text'] == u'Ardèche'
+        assert resp.json['data'][0]['text'] == 'Ardèche'
 
         resp = app.get(url + '/trans/departement/?id=99', status=200)
         assert requests_get.call_args[0][0].endswith('/solisapi/referentiels/trans/departement')
@@ -519,7 +519,7 @@ def test_solis_referentiels(app, solis):
         resp = app.get(url + '/trans/departement/?q=arde&ignore=8', status=200)
         assert resp.json['err'] == 0
         assert len(resp.json['data']) == 1
-        assert resp.json['data'][0]['text'] == u'Ardèche'
+        assert resp.json['data'][0]['text'] == 'Ardèche'
 
         resp = app.get(url + '/trans/departement/?q=arde&ignore=8,, 7', status=200)
         assert resp.json['err'] == 0
diff --git a/tests/test_strasbourg_eu.py b/tests/test_strasbourg_eu.py
index ce801e27..c10c2693 100644
--- a/tests/test_strasbourg_eu.py
+++ b/tests/test_strasbourg_eu.py
@@ -8,7 +8,7 @@ import tests.utils
 from passerelle.base.models import AccessRight, ApiUser
 from passerelle.contrib.strasbourg_eu.models import StrasbourgEu
 
-INTERESTS_EXAMPLE = u"""{
+INTERESTS_EXAMPLE = """{
     "interests": [
         {
             "id": "275305",
@@ -34,14 +34,14 @@ INTERESTS_EXAMPLE = u"""{
     ]
 }"""
 
-USER_INTERESTS_EXAMPLE = u"""{
+USER_INTERESTS_EXAMPLE = """{
     "userId": "M0cG+MtX8/Zr+zSMuI+H7yTC7SeEHT/tvYr1BsdqZic=",
     "interests": [
         "275303"
     ]
 }"""
 
-NOTIFICATIONS_EXAMPLE = u"""{
+NOTIFICATIONS_EXAMPLE = """{
     "notifications": [
         {
             "id": "279201",
@@ -79,17 +79,17 @@ NOTIFICATIONS_EXAMPLE = u"""{
     ]
 }"""
 
-SUCCESS_EXAMPLE = u"""{
+SUCCESS_EXAMPLE = """{
     "success": "MESSAGE"
 }"""
 
-ERROR_EXAMPLE = u"""{
+ERROR_EXAMPLE = """{
     "error": "MESSAGE"
 }"""
 
-UNAUTHORIZED_EXAMPLE = u"""{"error":"not authorized"}"""
+UNAUTHORIZED_EXAMPLE = """{"error":"not authorized"}"""
 
-FAVORITES_EXAMPLE = u"""{
+FAVORITES_EXAMPLE = """{
     "favorites": [
         {
             "id": "281701",
@@ -110,7 +110,7 @@ FAVORITES_EXAMPLE = u"""{
     ]
 }"""
 
-FAVORITE_TYPES_EXAMPLE = u"""{
+FAVORITE_TYPES_EXAMPLE = """{
     "types": [
         {
             "id": "1",
@@ -188,14 +188,14 @@ def test_interests(app, strasbourg_eu):
         resp = app.get(endpoint)
         assert len(resp.json['data']) == 2
         assert resp.json['data'][0]['id'] == '275303'
-        assert resp.json['data'][0]['text'] == u"Type 1 / Centre d'intérêt 1"
+        assert resp.json['data'][0]['text'] == "Type 1 / Centre d'intérêt 1"
         assert resp.json['data'][1]['id'] == '275305'
-        assert resp.json['data'][1]['text'] == u"Type 1 / Centre d'intérêt 2"
+        assert resp.json['data'][1]['text'] == "Type 1 / Centre d'intérêt 2"
 
         resp = app.get(endpoint, params={'name_id': 'xxx'})
         assert len(resp.json['data']) == 1
         assert resp.json['data'][0]['id'] == '275303'
-        assert resp.json['data'][0]['text'] == u"Type 1 / Centre d'intérêt 1"
+        assert resp.json['data'][0]['text'] == "Type 1 / Centre d'intérêt 1"
 
         resp = app.post_json(endpoint, params={})
         assert resp.json['err_desc'] == 'missing name_id'
diff --git a/tests/test_teamnet_axel.py b/tests/test_teamnet_axel.py
index caedb70a..2c2938f2 100644
--- a/tests/test_teamnet_axel.py
+++ b/tests/test_teamnet_axel.py
@@ -290,7 +290,7 @@ def test_endpoint_family_view(app, setup):
         resp = app.get('/teamnet-axel/test/family/', params=params)
         assert len(resp.json['data']['adults']) == 1
         assert len(resp.json['data']['children']) == 1
-        assert resp.json['data']['family'] == u'8336'
+        assert resp.json['data']['family'] == '8336'
         # test filtering
         resp = app.get('/teamnet-axel/test/family/adults/', params=params)
         data = resp.json['data']
diff --git a/tests/test_toulouse_axel.py b/tests/test_toulouse_axel.py
index 14e4e364..dcc426c7 100644
--- a/tests/test_toulouse_axel.py
+++ b/tests/test_toulouse_axel.py
@@ -1393,7 +1393,7 @@ def test_pre_sanitize_update_upperize(app, resource, update_params):
     jsonschema.validate(update_params, json_schema)
     check_upper(update_params)
 
-    assert upperize(u'something with an accent é') == u'SOMETHING WITH AN ACCENT E'
+    assert upperize('something with an accent é') == 'SOMETHING WITH AN ACCENT E'
 
 
 def test_pre_sanitize_update_family_data_adresse(app, resource, update_params):
diff --git a/tests/wcs/conftest.py b/tests/wcs/conftest.py
index 8716906b..4be8621f 100644
--- a/tests/wcs/conftest.py
+++ b/tests/wcs/conftest.py
@@ -250,7 +250,7 @@ def wcs_factory(base_dir, wcs_class=Wcs, **kwargs):
 
     with open(wcs_cfg_path, 'w') as fd:
         fd.write(
-            u'''[main]
+            '''[main]
 app_dir = %s\n'''
             % tmp_app_dir
         )
@@ -258,7 +258,7 @@ app_dir = %s\n'''
     local_settings_path = os.path.join(base_dir, 'local_settings.py')
     with open(local_settings_path, 'w') as fd:
         fd.write(
-            u'''
+            '''
 WCS_LEGACY_CONFIG_FILE = '{base_dir}/wcs.cfg'
 THEMES_DIRECTORY = '/'
 ALLOWED_HOSTS = ['*']
diff --git a/tests/wcs/test_conftest.py b/tests/wcs/test_conftest.py
index ec400f3d..28ee5e4e 100644
--- a/tests/wcs/test_conftest.py
+++ b/tests/wcs/test_conftest.py
@@ -24,7 +24,7 @@ def test_wcs_fixture(wcs_host):
     assert wcs_host.url.startswith('http://127.0.0.1:')
     requests.get(wcs_host.url)
     response = requests.get(urlparse.urljoin(wcs_host.url, '/api/categories/'))
-    assert response.json()['data'][0]['title'] == u'Catégorie'
+    assert response.json()['data'][0]['title'] == 'Catégorie'
 
 
 def test_wcs_api(wcs_host):
diff --git a/tests/wcs/test_sp_fr.py b/tests/wcs/test_sp_fr.py
index d41af7eb..8f195cd5 100644
--- a/tests/wcs/test_sp_fr.py
+++ b/tests/wcs/test_sp_fr.py
@@ -36,7 +36,7 @@ def spfr(settings, wcs_host, db, sftpserver):
     settings.KNOWN_SERVICES = {
         'wcs': {
             'eservices': {
-                'title': u'Démarches',
+                'title': 'Démarches',
                 'url': wcs_host.url,
                 'secret': 'test',
                 'orig': 'test',
@@ -54,7 +54,7 @@ def spfr(settings, wcs_host, db, sftpserver):
 
 
 def test_resource(spfr):
-    assert [x[1] for x in get_wcs_choices()] == ['---------', u'D\xe9marches - Demande']
+    assert [x[1] for x in get_wcs_choices()] == ['---------', 'D\xe9marches - Demande']
 
 
 def test_sftp_access(spfr, sftpserver):
-- 
2.34.1

