diff --git a/functests/cmis/tests_cmis.py b/functests/cmis/tests_cmis.py
index d4e6bbcf..f3cf5c04 100644
--- a/functests/cmis/tests_cmis.py
+++ b/functests/cmis/tests_cmis.py
@@ -1,10 +1,10 @@
import base64
import hashlib
import os
+import urllib.parse
import pytest
import requests
-from django.utils.six.moves.urllib import parse as urlparse
SPECIAL_CHARS = '!#$%&+-^_`;[]{}+='
@@ -25,7 +25,7 @@ def test_uploadfile(cmisclient, cmis_connector, cmis_tmpdir, tmpdir, monkeypatch
orig_file = tmpdir.join(file_name)
with orig_file.open('wb') as f:
f.write(os.urandom(1024))
- url = urlparse.urljoin(cmis_connector, 'uploadfile')
+ url = urllib.parse.urljoin(cmis_connector, 'uploadfile')
with orig_file.open('rb') as f:
file_b64_content = base64.b64encode(f.read())
response = requests.post(
@@ -54,7 +54,7 @@ def test_uploadfile(cmisclient, cmis_connector, cmis_tmpdir, tmpdir, monkeypatch
def test_uploadfile_conflict(cmisclient, cmis_connector, cmis_tmpdir, tmpdir, monkeypatch):
- url = urlparse.urljoin(cmis_connector, 'uploadfile')
+ url = urllib.parse.urljoin(cmis_connector, 'uploadfile')
file_b64_content = base64.b64encode('file_content')
response = requests.post(
url,
diff --git a/functests/planitech/test_planitech.py b/functests/planitech/test_planitech.py
index 08d904f1..56044079 100644
--- a/functests/planitech/test_planitech.py
+++ b/functests/planitech/test_planitech.py
@@ -1,13 +1,13 @@
import pprint
import random
+import urllib.parse
import requests
-from django.utils.six.moves.urllib import parse
def test_main(conn):
# get days
- query_string = parse.urlencode(
+ query_string = urllib.parse.urlencode(
{'start_days': 1, 'end_days': 90, 'start_time': '10:00', 'end_time': '11:00', 'display': 'date'}
)
url = conn + '/getfreegaps?%s' % query_string
@@ -19,7 +19,7 @@ def test_main(conn):
assert data
# get places
- query_string = parse.urlencode(
+ query_string = urllib.parse.urlencode(
{'start_days': 1, 'end_days': 90, 'start_time': '10:00', 'end_time': '11:00', 'display': 'place'}
)
url = conn + '/getfreegaps?%s' % query_string
@@ -32,7 +32,7 @@ def test_main(conn):
place = data[random.randint(0, len(data) - 1)]['id']
# get days on one place
- query_string = parse.urlencode(
+ query_string = urllib.parse.urlencode(
{
'start_days': 1,
'end_days': 90,
diff --git a/passerelle/apps/actesweb/models.py b/passerelle/apps/actesweb/models.py
index 61c6cbeb..646ae48f 100644
--- a/passerelle/apps/actesweb/models.py
+++ b/passerelle/apps/actesweb/models.py
@@ -16,6 +16,7 @@
from __future__ import unicode_literals
import contextlib
+import json
import os
import stat
import tempfile
@@ -28,7 +29,6 @@ from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.utils.api import endpoint
from passerelle.utils.conversion import ensure_encoding
from passerelle.utils.jsonresponse import APIError
@@ -53,7 +53,7 @@ class ActesWeb(BaseResource):
@endpoint(perm='can_access', methods=['post'], description=_('Create demand'))
def create(self, request, *args, **kwargs):
try:
- payload = json_loads(request.body)
+ payload = json.loads(request.body)
except (ValueError,):
raise APIError('Invalid payload format: json expected')
diff --git a/passerelle/apps/api_entreprise/models.py b/passerelle/apps/api_entreprise/models.py
index 991e9c49..446a2f2a 100644
--- a/passerelle/apps/api_entreprise/models.py
+++ b/passerelle/apps/api_entreprise/models.py
@@ -18,6 +18,8 @@
https://entreprise.api.gouv.fr
'''
+import urllib.parse
+
import requests
from django.core import signing
from django.db import models
@@ -25,7 +27,6 @@ from django.http import Http404, HttpResponse
from django.urls import reverse
from django.utils.timezone import datetime, make_aware, timedelta
from django.utils.translation import ugettext_lazy as _
-from six.moves.urllib_parse import urljoin
from passerelle.base.models import BaseResource
from passerelle.utils.api import endpoint
@@ -97,7 +98,7 @@ class APIEntreprise(BaseResource):
params['recipient'] = kwargs.get('recipient') or self.recipient
if kwargs.get('non_diffusables'):
params['non_diffusables'] = 'true'
- url = urljoin(self.url, path)
+ url = urllib.parse.urljoin(self.url, path)
try:
response = self.requests.get(url, data=params, cache_duration=300)
except requests.RequestException as e:
diff --git a/passerelle/apps/api_particulier/models.py b/passerelle/apps/api_particulier/models.py
index cfc3b9f7..f2594f74 100644
--- a/passerelle/apps/api_particulier/models.py
+++ b/passerelle/apps/api_particulier/models.py
@@ -32,7 +32,6 @@ except ImportError:
from django.contrib.postgres.fields import ArrayField
from django.core.cache import cache
from django.db import models
-from django.utils import six
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
@@ -96,7 +95,7 @@ class APIParticulier(BaseResource):
data={
'code': 'connection-error',
'platform': self.platform,
- 'error': six.text_type(e),
+ 'error': str(e),
},
)
try:
@@ -110,7 +109,7 @@ class APIParticulier(BaseResource):
data={
'code': 'non-json',
'status_code': response.status_code,
- 'exception': six.text_type(e),
+ 'exception': str(e),
'platform': self.platform,
'content': content,
},
diff --git a/passerelle/apps/arpege_ecp/models.py b/passerelle/apps/arpege_ecp/models.py
index 68309d50..5ec213e4 100644
--- a/passerelle/apps/arpege_ecp/models.py
+++ b/passerelle/apps/arpege_ecp/models.py
@@ -18,7 +18,7 @@ import json
from urllib import parse as urlparse
from django.db import models
-from django.utils import six, timezone
+from django.utils import timezone
from django.utils.dateparse import parse_date, parse_time
from django.utils.translation import ugettext_lazy as _
from requests import RequestException
@@ -67,7 +67,7 @@ class ArpegeECP(BaseResource):
if result.get('Data'):
if 'AccessToken' not in result['Data']:
raise APIError('Error on LoginParSubOIDC: missing Data/AccessToken')
- if not isinstance(result['Data']['AccessToken'], six.string_types):
+ if not isinstance(result['Data']['AccessToken'], str):
raise APIError('Error on LoginParSubOIDC: Data/AccessToken is not string')
return result['Data']['AccessToken']
raise APIError('%s (%s)' % (result.get('LibErreur'), result.get('CodErreur')))
diff --git a/passerelle/apps/atos_genesys/models.py b/passerelle/apps/atos_genesys/models.py
index 22ecf1c0..a2e1ae29 100644
--- a/passerelle/apps/atos_genesys/models.py
+++ b/passerelle/apps/atos_genesys/models.py
@@ -21,7 +21,6 @@ from urllib import parse as urlparse
import requests
from django.contrib.postgres.fields import JSONField
from django.db import models
-from django.utils import six
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource, HTTPResource
@@ -73,11 +72,11 @@ class Resource(BaseResource, HTTPResource):
response = self.requests.get(url, *args, **kwargs)
response.raise_for_status()
except requests.RequestException as e:
- raise APIError('HTTP request failed', data={'exception': six.text_type(e)})
+ raise APIError('HTTP request failed', data={'exception': str(e)})
try:
root = ET.fromstring(response.content)
except ET.ParseError as e:
- raise APIError('XML parsing failed', data={'exception': six.text_type(e)})
+ raise APIError('XML parsing failed', data={'exception': str(e)})
if root.tag != 'return':
raise APIError('root XML node is not return', data={'content': response.text[:1024]})
return root, response
diff --git a/passerelle/apps/atos_genesys/utils.py b/passerelle/apps/atos_genesys/utils.py
index 1cbf5f07..a14f1c13 100644
--- a/passerelle/apps/atos_genesys/utils.py
+++ b/passerelle/apps/atos_genesys/utils.py
@@ -3,7 +3,6 @@ from contextlib import contextmanager
from django.core.cache import cache
from django.db import transaction
-from django.utils import six
from passerelle.utils.jsonresponse import APIError
@@ -43,7 +42,7 @@ class RowLockedCache:
if self.row:
keys.append(str(self.row.pk))
for arg in args:
- if isinstance(arg, six.string_types):
+ if isinstance(arg, str):
keys.append(arg)
else:
keys.append(hash(arg))
diff --git a/passerelle/apps/base_adresse/models.py b/passerelle/apps/base_adresse/models.py
index fddfe99c..77340f21 100644
--- a/passerelle/apps/base_adresse/models.py
+++ b/passerelle/apps/base_adresse/models.py
@@ -1,18 +1,18 @@
import datetime
import gzip
+import json
+from io import StringIO
from urllib import parse as urlparse
from django.contrib.postgres.fields import JSONField
from django.db import connection, models
from django.db.models import Q
-from django.utils import six, timezone
+from django.utils import timezone
from django.utils.http import urlencode
-from django.utils.six import StringIO
from django.utils.translation import ugettext_lazy as _
from requests import RequestException
from passerelle.address.models import AddressResource
-from passerelle.compat import json_loads
from passerelle.utils.api import endpoint
from passerelle.utils.conversion import simplify
from passerelle.utils.jsonresponse import APIError
@@ -452,13 +452,10 @@ class BaseAdresse(AddressResource):
if ban_gz.status_code != 200:
continue
- if six.PY3:
- ban_file = StringIO(gzip.decompress(ban_gz.content).decode('utf-8'))
- else:
- ban_file = gzip.GzipFile(fileobj=StringIO(ban_gz.content))
+ ban_file = StringIO(gzip.decompress(ban_gz.content).decode('utf-8'))
line = _not_found = object()
for line in ban_file:
- street_info = json_loads(line)
+ street_info = json.loads(line)
if street_info['type'] != 'street':
continue
ban_id = street_info.get('id')
@@ -466,7 +463,7 @@ class BaseAdresse(AddressResource):
continue
for key in ('postcode', 'name', 'city'):
if isinstance(street_info[key], list):
- street_info[key] = six.text_type(street_info[key][0])
+ street_info[key] = str(street_info[key][0])
if not street_info['postcode'] or not street_info['postcode'].startswith(zipcodes):
continue
citycode = ban_id.split('_', 1)[0]
@@ -580,7 +577,6 @@ class UnaccentNameMixin:
super().save(*args, **kwargs)
-@six.python_2_unicode_compatible
class StreetModel(UnaccentNameMixin, models.Model):
ban_id = models.CharField(_('BAN Identifier'), max_length=32, blank=True)
@@ -601,7 +597,6 @@ class StreetModel(UnaccentNameMixin, models.Model):
return self.name
-@six.python_2_unicode_compatible
class RegionModel(UnaccentNameMixin, models.Model):
name = models.CharField(_('Region name'), max_length=150)
@@ -627,7 +622,6 @@ class RegionModel(UnaccentNameMixin, models.Model):
return '%s %s' % (self.code, self.name)
-@six.python_2_unicode_compatible
class DepartmentModel(UnaccentNameMixin, models.Model):
name = models.CharField(_('Department name'), max_length=100)
@@ -656,7 +650,6 @@ class DepartmentModel(UnaccentNameMixin, models.Model):
return '%s %s' % (self.code, self.name)
-@six.python_2_unicode_compatible
class CityModel(UnaccentNameMixin, models.Model):
name = models.CharField(_('City name'), max_length=150)
diff --git a/passerelle/apps/bdp/views.py b/passerelle/apps/bdp/views.py
index db097341..6734ff13 100644
--- a/passerelle/apps/bdp/views.py
+++ b/passerelle/apps/bdp/views.py
@@ -1,9 +1,10 @@
+import json
+
from django.http import Http404
from django.views.generic.base import View
from django.views.generic.detail import DetailView, SingleObjectMixin
from passerelle import utils
-from passerelle.compat import json_loads
from .models import Bdp
@@ -40,7 +41,7 @@ class PostAdherentView(View, SingleObjectMixin):
@utils.protected_api('can_access')
@utils.to_json()
def post(self, request, *args, **kwargs):
- data = json_loads(request.body) # JSON w.c.s. formdata
+ data = json.loads(request.body) # JSON w.c.s. formdata
date_de_naissance = data['fields'].get('date_de_naissance')
# force 1973-04-18T00:00:00Z
date_de_naissance = date_de_naissance[:10] + 'T00:00:00Z'
diff --git a/passerelle/apps/choosit/models.py b/passerelle/apps/choosit/models.py
index 531846fb..98e69f88 100644
--- a/passerelle/apps/choosit/models.py
+++ b/passerelle/apps/choosit/models.py
@@ -3,7 +3,6 @@ import json
import requests
from django.db import models
-from django.utils.six import string_types
from django.utils.translation import ugettext_lazy as _
from passerelle.sms.models import SMSResource
@@ -95,6 +94,6 @@ class ChoositSMSGateway(SMSResource):
results.append('Choosit error: %s' % output['error'])
else:
results.append(output)
- if any(isinstance(result, string_types) for result in results):
+ if any(isinstance(result, str) for result in results):
raise APIError('Choosit error: some destinations failed', data=list(zip(destinations, results)))
# credit consumed is unknown
diff --git a/passerelle/apps/cityweb/cityweb.py b/passerelle/apps/cityweb/cityweb.py
index 51c28011..5ca5fcc4 100644
--- a/passerelle/apps/cityweb/cityweb.py
+++ b/passerelle/apps/cityweb/cityweb.py
@@ -18,7 +18,6 @@ import os
import stat
from django.core.files.storage import default_storage
-from django.utils import six
from django.utils.dateparse import parse_date
from django.utils.encoding import force_bytes
from lxml import etree
@@ -86,7 +85,7 @@ class BaseType:
attr = getattr(self, subelt, None)
if not attr:
continue
- if isinstance(attr, six.string_types):
+ if isinstance(attr, str):
tag.append(self.make_element(subelt, attr, namespace=self.namespace))
else:
xml = attr.xml
diff --git a/passerelle/apps/cityweb/models.py b/passerelle/apps/cityweb/models.py
index 7dd02a9d..0c7ecb00 100644
--- a/passerelle/apps/cityweb/models.py
+++ b/passerelle/apps/cityweb/models.py
@@ -14,13 +14,13 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
+import json
import os
from django.core.files.storage import default_storage
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.utils.api import endpoint
from passerelle.utils.jsonresponse import APIError
@@ -47,7 +47,7 @@ class CityWeb(BaseResource):
@endpoint(perm='can_access', methods=['post'], description=_('Create a demand'))
def create(self, request, *args, **kwargs):
- payload = json_loads(request.body)
+ payload = json.loads(request.body)
# check mandatory keys
for key in ('application_id', 'application_time', 'certificate_type'):
if key not in payload:
diff --git a/passerelle/apps/clicrdv/views.py b/passerelle/apps/clicrdv/views.py
index 7b23aed5..97f6eb31 100644
--- a/passerelle/apps/clicrdv/views.py
+++ b/passerelle/apps/clicrdv/views.py
@@ -1,9 +1,10 @@
+import json
+
from django.views.generic.base import View
from django.views.generic.detail import DetailView, SingleObjectMixin
from passerelle import utils
from passerelle.apps.clicrdv.models import ClicRdv
-from passerelle.compat import json_loads
class ClicRdvDetailView(DetailView):
@@ -87,7 +88,7 @@ class CreateAppointmentView(View, SingleObjectMixin):
def post(self, request, intervention_id=None, *args, **kwargs):
if intervention_id is None:
intervention_id = self.request.GET.get('intervention')
- data = json_loads(request.body)
+ data = json.loads(request.body)
return {
'data': self.get_object().create_appointment(
intervention_id, self.request.GET.get('websource'), data
diff --git a/passerelle/apps/cmis/models.py b/passerelle/apps/cmis/models.py
index c68975af..20003aa3 100644
--- a/passerelle/apps/cmis/models.py
+++ b/passerelle/apps/cmis/models.py
@@ -19,6 +19,7 @@ import binascii
import functools
import re
from contextlib import contextmanager
+from io import BytesIO
from urllib import error as urllib2
import httplib2
@@ -32,7 +33,6 @@ from cmislib.exceptions import (
)
from django.db import models
from django.utils.functional import cached_property
-from django.utils.six import BytesIO
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
diff --git a/passerelle/apps/csvdatasource/models.py b/passerelle/apps/csvdatasource/models.py
index 87866720..cb87d83c 100644
--- a/passerelle/apps/csvdatasource/models.py
+++ b/passerelle/apps/csvdatasource/models.py
@@ -24,7 +24,6 @@ import tempfile
from collections import OrderedDict
import pytz
-import six
from django.conf import settings
from django.contrib.postgres.fields import JSONField
from django.contrib.postgres.indexes import GinIndex
@@ -231,7 +230,7 @@ class CsvDataSource(BaseResource):
options = {}
for k, v in self._dialect_options.items():
- if isinstance(v, six.text_type):
+ if isinstance(v, str):
v = force_str(v.encode('ascii'))
options[force_str(k.encode('ascii'))] = v
diff --git a/passerelle/apps/family/loaders/concerto_fondettes.py b/passerelle/apps/family/loaders/concerto_fondettes.py
index a0e94c93..e6a1e210 100644
--- a/passerelle/apps/family/loaders/concerto_fondettes.py
+++ b/passerelle/apps/family/loaders/concerto_fondettes.py
@@ -16,10 +16,10 @@
import csv
import datetime
+import io
from decimal import Decimal
from django.core.exceptions import ValidationError
-from django.utils import six
from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _
@@ -41,11 +41,8 @@ class Loader:
def load(self, archive):
archive_files = archive.namelist()
fd = archive.open('data_full.csv')
- if six.PY3:
- import io
-
- fd = io.TextIOWrapper(fd, 'iso-8859-15')
- csvfile = six.StringIO(fd.read())
+ fd = io.TextIOWrapper(fd, 'iso-8859-15')
+ csvfile = io.StringIO(fd.read())
csvreader = csv.reader(csvfile, delimiter='\t')
first_row = next(csvreader)
csvfile.seek(0)
diff --git a/passerelle/apps/family/loaders/concerto_orleans.py b/passerelle/apps/family/loaders/concerto_orleans.py
index c455c7c5..2a5a9c93 100644
--- a/passerelle/apps/family/loaders/concerto_orleans.py
+++ b/passerelle/apps/family/loaders/concerto_orleans.py
@@ -15,12 +15,13 @@
# along with this program. If not, see .
import csv
+import io
import os
from decimal import Decimal
from django.core.exceptions import ValidationError
from django.core.files.storage import DefaultStorage
-from django.utils import six, timezone
+from django.utils import timezone
from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _
@@ -123,10 +124,7 @@ class Loader:
def csvread(self, filename):
fd = self.archive.open(filename)
- if six.PY3:
- import io
-
- fd = io.TextIOWrapper(fd, 'iso-8859-15')
+ fd = io.TextIOWrapper(fd, 'iso-8859-15')
reader = csv.reader(fd, Dialect)
# pylint: disable=stop-iteration-return
diff --git a/passerelle/apps/family/loaders/opus_fondettes.py b/passerelle/apps/family/loaders/opus_fondettes.py
index 7ae78401..f02f3364 100644
--- a/passerelle/apps/family/loaders/opus_fondettes.py
+++ b/passerelle/apps/family/loaders/opus_fondettes.py
@@ -16,10 +16,10 @@
import csv
import datetime
+import io
from decimal import Decimal
from django.core.exceptions import ValidationError
-from django.utils import six
from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _
@@ -41,11 +41,8 @@ class Loader:
def load(self, archive):
archive_files = archive.namelist()
fd = archive.open('publipostage.csv')
- if six.PY3:
- import io
-
- fd = io.TextIOWrapper(fd, 'iso-8859-15')
- csvfile = six.StringIO(fd.read())
+ fd = io.TextIOWrapper(fd, 'iso-8859-15')
+ csvfile = io.StringIO(fd.read())
csvreader = csv.reader(csvfile, delimiter=';')
first_row = next(csvreader)
csvfile.seek(0)
diff --git a/passerelle/apps/family/models.py b/passerelle/apps/family/models.py
index 1a409728..ee74f95f 100644
--- a/passerelle/apps/family/models.py
+++ b/passerelle/apps/family/models.py
@@ -16,6 +16,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
+import json
import os
import sys
import zipfile
@@ -27,12 +28,10 @@ from django.core.exceptions import ValidationError
from django.core.files.storage import default_storage
from django.db import models, transaction
from django.http import Http404, HttpResponse
-from django.utils import six
from django.utils.timezone import datetime, make_aware, now
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.utils.api import endpoint
SEXES = (
@@ -212,7 +211,7 @@ class GenericFamily(BaseResource):
adults = []
for f in family_files:
- family_data = json_loads(archive.read(f))
+ family_data = json.loads(archive.read(f))
families.append(family_data['id'])
address = family_data.get('address') or {}
family_data.update(address)
@@ -403,7 +402,7 @@ class GenericFamily(BaseResource):
name='regie', methods=['post'], perm='can_access', pattern=r'^invoice/(?P\w+)/pay/$'
)
def pay_invoice(self, request, invoice_id, **kwargs):
- data = json_loads(request.body)
+ data = json.loads(request.body)
invoice = self.get_invoice(invoice_id)
if not invoice:
return {'data': False}
@@ -454,7 +453,6 @@ class Family(models.Model):
return self.external_id
-@six.python_2_unicode_compatible
class Person(models.Model):
family = models.ForeignKey('Family', on_delete=models.CASCADE)
external_id = models.CharField(_('Person\'s external id'), max_length=32, db_index=True)
diff --git a/passerelle/apps/gdc/views.py b/passerelle/apps/gdc/views.py
index 3a059dfb..bf74fb3d 100644
--- a/passerelle/apps/gdc/views.py
+++ b/passerelle/apps/gdc/views.py
@@ -15,12 +15,13 @@
# along with this program. If not, see .
+import json
+
from django.utils.encoding import force_text
from django.views.generic.base import View
from django.views.generic.detail import DetailView, SingleObjectMixin
from passerelle import utils
-from passerelle.compat import json_loads
from passerelle.utils.conversion import normalize
from .models import Gdc, phpserialize, phpserialize_loads
@@ -132,7 +133,7 @@ class PostDemandeView(View, SingleObjectMixin):
#
#
#
- data = json_loads(request.body)
+ data = json.loads(request.body)
voie_id = data['fields'].get('voie_raw')
voie_str = data['fields'].get('voie')
insee = data['fields'].get('commune_raw')
diff --git a/passerelle/apps/gesbac/models.py b/passerelle/apps/gesbac/models.py
index e6688ff6..5c7e7b57 100644
--- a/passerelle/apps/gesbac/models.py
+++ b/passerelle/apps/gesbac/models.py
@@ -21,8 +21,6 @@ from collections import OrderedDict
from django.contrib.postgres.fields import JSONField
from django.db import IntegrityError, models, transaction
from django.http import Http404
-from django.utils import six
-from django.utils.encoding import force_bytes
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
@@ -239,10 +237,7 @@ class Gesbac(BaseResource):
if not csv_file.startswith(self.input_files_prefix):
continue
with client.open(csv_file, 'rb') as fd:
- if six.PY3:
- content = io.TextIOWrapper(fd, encoding=FILES_ENCODING)
- else:
- content = io.BytesIO(force_bytes(fd.read().decode(FILES_ENCODING)))
+ content = io.TextIOWrapper(fd, encoding=FILES_ENCODING)
for row in csv.reader(content, delimiter=CSV_DELIMITER):
data.append(row)
for card_data in data:
@@ -357,16 +352,9 @@ class Form(models.Model):
def send(self):
with self.resource.outcoming_sftp.client() as client:
with client.open(self.get_filename(), mode='wb') as fd:
- if six.PY3:
- fd = io.TextIOWrapper(fd, encoding=FILES_ENCODING)
+ fd = io.TextIOWrapper(fd, encoding=FILES_ENCODING)
writer = csv.writer(fd, delimiter=CSV_DELIMITER)
for row in self.demand_data:
- # encode strings to ASCII
- if six.PY2:
- row = [
- item.encode(FILES_ENCODING) if isinstance(item, six.string_types) else item
- for item in row
- ]
writer.writerow(row)
self.status = 'sent'
self.save()
diff --git a/passerelle/apps/jsondatastore/models.py b/passerelle/apps/jsondatastore/models.py
index 487be141..7de438e1 100644
--- a/passerelle/apps/jsondatastore/models.py
+++ b/passerelle/apps/jsondatastore/models.py
@@ -14,6 +14,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
+import json
import uuid
from django.contrib.postgres.fields import JSONField
@@ -22,7 +23,6 @@ from django.template import Context, Template
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.utils.api import APIError, endpoint
from passerelle.utils.conversion import simplify
@@ -33,7 +33,7 @@ def get_hex_uuid():
def clean_json_data(data):
try:
- payload = json_loads(data)
+ payload = json.loads(data)
if not isinstance(payload, dict):
raise APIError('payload must be a dict')
return payload
diff --git a/passerelle/apps/mdel/models.py b/passerelle/apps/mdel/models.py
index 178c4405..ffb08495 100644
--- a/passerelle/apps/mdel/models.py
+++ b/passerelle/apps/mdel/models.py
@@ -15,14 +15,13 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
+import json
import os
from django.db import models
-from django.utils import six
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.utils import SFTPField
from passerelle.utils.api import endpoint
from passerelle.utils.files import atomic_write
@@ -93,7 +92,7 @@ class MDEL(BaseResource):
@endpoint(perm='can_access', methods=['post'])
def create(self, request, *args, **kwargs):
"""Create a demand"""
- formdata = json_loads(request.body)
+ formdata = json.loads(request.body)
extra = formdata.pop('extra', {})
fields = formdata.pop('fields', {})
@@ -193,7 +192,6 @@ class MDEL(BaseResource):
self.get_response_files()
-@six.python_2_unicode_compatible
class Demand(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
diff --git a/passerelle/apps/mdel_ddpacs/abstract.py b/passerelle/apps/mdel_ddpacs/abstract.py
index dce47ff3..090a1133 100644
--- a/passerelle/apps/mdel_ddpacs/abstract.py
+++ b/passerelle/apps/mdel_ddpacs/abstract.py
@@ -28,7 +28,7 @@ from django.contrib.postgres.fields import JSONField
from django.db import IntegrityError, models, transaction
from django.http import HttpResponse
from django.urls import reverse
-from django.utils import functional, six
+from django.utils import functional
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource, SkipJob
@@ -214,7 +214,6 @@ class Resource(BaseResource):
return
-@six.python_2_unicode_compatible
class Demand(models.Model):
STATUS_PENDING = 'pending'
STATUS_PUSHED = 'pushed'
diff --git a/passerelle/apps/mdel_ddpacs/models.py b/passerelle/apps/mdel_ddpacs/models.py
index 9fab543b..3c6b0828 100644
--- a/passerelle/apps/mdel_ddpacs/models.py
+++ b/passerelle/apps/mdel_ddpacs/models.py
@@ -19,7 +19,6 @@ from __future__ import unicode_literals
import xmlschema
from django.db import models
-from django.utils import six
from django.utils.translation import ugettext_lazy as _
from passerelle.utils.api import endpoint
@@ -117,7 +116,7 @@ class Resource(abstract.Resource):
else:
del d['filiationInconnu']
# convert codeNationalite to array of strings
- if isinstance(d.get('codeNationalite'), six.text_type):
+ if isinstance(d.get('codeNationalite'), str):
d['codeNationalite'] = [d['codeNationalite']]
for key in d:
if key in ('anneeNaissance', 'jourNaissance', 'moisNaissance'):
diff --git a/passerelle/apps/okina/models.py b/passerelle/apps/okina/models.py
index c1fbd10b..e42e3f77 100644
--- a/passerelle/apps/okina/models.py
+++ b/passerelle/apps/okina/models.py
@@ -22,7 +22,6 @@ from django.utils.http import urlencode
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.utils.api import endpoint
from passerelle.utils.jsonresponse import APIError
@@ -245,7 +244,7 @@ class Okina(BaseResource):
@endpoint(name='subscriber', methods=['post'], perm='can_access')
def create_subscriber(self, request):
try:
- payload = json_loads(request.body)
+ payload = json.loads(request.body)
except ValueError:
raise APIError('payload must be a JSON object', http_status=400)
if not isinstance(payload, dict):
@@ -261,14 +260,14 @@ class Okina(BaseResource):
qrcode = self.request('subscribers/%s/qrcode' % subscriber_id, result_is_json=False)
content_type = qrcode.headers.get('Content-Type')
if not (content_type and content_type.startswith('image/')):
- response = json_loads(qrcode.content)
+ response = json.loads(qrcode.content)
raise APIError(response['message'], http_status=response['status'], err=response['code'])
return HttpResponse(qrcode.content, content_type=content_type)
@endpoint(name='subscription', methods=['post'], perm='can_access')
def create_subscription(self, request):
try:
- payload = json_loads(request.body)
+ payload = json.loads(request.body)
except ValueError:
raise APIError('payload must be a JSON object', http_status=400)
if not isinstance(payload, dict):
diff --git a/passerelle/apps/opengis/models.py b/passerelle/apps/opengis/models.py
index 3072347a..aa087659 100644
--- a/passerelle/apps/opengis/models.py
+++ b/passerelle/apps/opengis/models.py
@@ -19,7 +19,6 @@ import math
import xml.etree.ElementTree as ET
import pyproj
-import six
from django.contrib.postgres.fields import JSONField
from django.core.cache import cache
from django.db import models, transaction
@@ -396,7 +395,7 @@ class OpenGIS(BaseResource):
for attribute, properties in self.attributes_mapping:
for field in properties:
if closest_feature['properties'].get(field):
- result['address'][attribute] = six.text_type(closest_feature['properties'][field])
+ result['address'][attribute] = str(closest_feature['properties'][field])
break
return result
raise APIError('Unable to geocode')
diff --git a/passerelle/apps/plone_restapi/models.py b/passerelle/apps/plone_restapi/models.py
index fb2dc775..8959468f 100644
--- a/passerelle/apps/plone_restapi/models.py
+++ b/passerelle/apps/plone_restapi/models.py
@@ -14,6 +14,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
+import json
from urllib.parse import parse_qsl, urlsplit, urlunsplit
from django.core.cache import cache
@@ -24,7 +25,6 @@ from django.utils.translation import ugettext_lazy as _
from requests import RequestException
from passerelle.base.models import BaseQuery, BaseResource, HTTPResource
-from passerelle.compat import json_loads
from passerelle.utils.api import endpoint
from passerelle.utils.http_authenticators import HttpBearerAuth
from passerelle.utils.json import unflatten
@@ -303,7 +303,7 @@ class PloneRestApi(BaseResource, HTTPResource):
)
def create(self, request, uri, publish=False):
try:
- post_data = json_loads(request.body)
+ post_data = json.loads(request.body)
except ValueError as e:
raise ParameterTypeError(str(e))
post_data = unflatten(post_data)
@@ -330,7 +330,7 @@ class PloneRestApi(BaseResource, HTTPResource):
)
def update(self, request, uid, uri=''):
try:
- post_data = json_loads(request.body)
+ post_data = json.loads(request.body)
except ValueError as e:
raise ParameterTypeError(str(e))
post_data = unflatten(post_data)
diff --git a/passerelle/apps/solis/models.py b/passerelle/apps/solis/models.py
index 4576d142..fd6c6712 100644
--- a/passerelle/apps/solis/models.py
+++ b/passerelle/apps/solis/models.py
@@ -16,6 +16,7 @@
import base64
import copy
+import json
from django.db import models
from django.template.loader import get_template
@@ -24,7 +25,6 @@ from django.utils.http import urlencode
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.utils.api import endpoint
from passerelle.utils.conversion import simplify, to_pdf
from passerelle.utils.jsonresponse import APIError
@@ -276,7 +276,7 @@ class Solis(BaseResource):
)
def apa_link(self, request):
try:
- data = json_loads(request.body)
+ data = json.loads(request.body)
except ValueError:
raise APIError('payload is not a JSON dict')
if not isinstance(data, dict):
@@ -302,7 +302,7 @@ class Solis(BaseResource):
)
def apa_unlink(self, request):
try:
- data = json_loads(request.body)
+ data = json.loads(request.body)
except ValueError:
raise APIError('payload is not a JSON dict')
if not isinstance(data, dict):
@@ -411,7 +411,7 @@ class Solis(BaseResource):
)
def apa_integration(self, request):
try:
- payload = json_loads(request.body)
+ payload = json.loads(request.body)
except ValueError:
raise APIError('payload is not a JSON object', http_status=400)
if not isinstance(payload, dict):
@@ -566,7 +566,7 @@ class Solis(BaseResource):
)
def rsa_link(self, request):
try:
- data = json_loads(request.body)
+ data = json.loads(request.body)
except ValueError:
raise APIError('payload is not a JSON dict')
if not isinstance(data, dict):
@@ -593,7 +593,7 @@ class Solis(BaseResource):
)
def rsa_unlink(self, request):
try:
- data = json_loads(request.body)
+ data = json.loads(request.body)
except ValueError:
raise APIError('payload is not a JSON dict')
if not isinstance(data, dict):
diff --git a/passerelle/apps/sp_fr/models.py b/passerelle/apps/sp_fr/models.py
index 77465ef9..9f33dcce 100644
--- a/passerelle/apps/sp_fr/models.py
+++ b/passerelle/apps/sp_fr/models.py
@@ -28,7 +28,6 @@ from django.core.files import File
from django.db import models, transaction
from django.template import engines
from django.urls import reverse
-from django.utils import six
from django.utils.translation import ugettext
from django.utils.translation import ugettext_lazy as _
from lxml import etree as ET
@@ -77,8 +76,8 @@ def simplify(s):
'''Simplify XML node tag names because XSD from DGME are garbage'''
if not s:
return ''
- if not isinstance(s, six.text_type):
- s = six.text_type(s, 'utf-8', 'ignore')
+ if not isinstance(s, str):
+ s = str(s, 'utf-8', 'ignore')
s = normalize(s)
s = re.sub(r'[^\w\s\'-_]', '', s)
s = s.replace('-', '_')
@@ -536,7 +535,6 @@ def default_rule():
return {}
-@six.python_2_unicode_compatible
class Mapping(models.Model):
resource = models.ForeignKey(
Resource, verbose_name=_('Resource'), related_name='mappings', on_delete=models.CASCADE
diff --git a/passerelle/apps/sp_fr/xsd.py b/passerelle/apps/sp_fr/xsd.py
index 036c1384..68867466 100644
--- a/passerelle/apps/sp_fr/xsd.py
+++ b/passerelle/apps/sp_fr/xsd.py
@@ -17,7 +17,6 @@
import datetime
import isodate
-from django.utils import six
from lxml import etree as ET
from zeep.utils import qname_attr
@@ -57,7 +56,7 @@ ANY_TYPE = ET.QName(XSD, 'anyType')
TYPE_CASTER = {
BOOLEAN: parse_bool,
- STRING: six.text_type,
+ STRING: str,
DATE: parse_date,
INT: int,
INTEGER: int,
@@ -245,7 +244,7 @@ class Schema:
def qname_display(self, name):
if name.namespace in self.reverse_nsmap:
name = '%s:%s' % (self.reverse_nsmap[name.namespace], name.localname)
- return six.text_type(name)
+ return str(name)
def paths(self):
roots = sorted(self.elements.keys())
@@ -292,7 +291,6 @@ class Schema:
yield path
-@six.python_2_unicode_compatible
class Path:
def __init__(self, path, xsd_type):
assert path
@@ -301,7 +299,7 @@ class Path:
try:
self.caster = TYPE_CASTER[xsd_type]
except KeyError:
- raise KeyError(six.text_type(xsd_type))
+ raise KeyError(str(xsd_type))
def resolve(self, root):
def helper(node, path):
@@ -319,4 +317,4 @@ class Path:
return self.caster(child.text)
def __str__(self):
- return '.'.join(six.text_type(name) for name in self.path)
+ return '.'.join(str(name) for name in self.path)
diff --git a/passerelle/base/models.py b/passerelle/base/models.py
index 3a3ea9d8..659a1fb4 100644
--- a/passerelle/base/models.py
+++ b/passerelle/base/models.py
@@ -26,7 +26,7 @@ from django.forms.models import modelform_factory
from django.forms.widgets import ClearableFileInput
from django.test import override_settings
from django.urls import reverse
-from django.utils import six, timezone
+from django.utils import timezone
from django.utils.encoding import force_text
from django.utils.log import AdminEmailHandler
from django.utils.text import slugify
@@ -71,7 +71,6 @@ BASE_EXPORT_FIELDS = (
)
-@six.python_2_unicode_compatible
class ApiUser(models.Model):
username = models.CharField(max_length=128, verbose_name=_('Username'), unique=True)
fullname = models.CharField(max_length=50, verbose_name=_('Full Name'))
@@ -135,7 +134,6 @@ class InheritanceManager(ModelUtilsInheritanceManager):
return self.filter(Q(users=None) | Q(users=apiuser))
-@six.python_2_unicode_compatible
class BaseResource(models.Model):
title = models.CharField(max_length=50, verbose_name=_('Title'))
slug = models.SlugField(verbose_name=_('Identifier'), unique=True)
@@ -653,7 +651,6 @@ class BaseResource(models.Model):
).exists()
-@six.python_2_unicode_compatible
class AccessRight(models.Model):
codename = models.CharField(max_length=100, verbose_name='codename')
resource_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
@@ -798,7 +795,7 @@ class Job(models.Model):
def set_after_timestamp(self, value):
if isinstance(value, datetime.datetime):
self.after_timestamp = value
- elif isinstance(value, six.integer_types + (float,)):
+ elif isinstance(value, (float, int)):
self.after_timestamp = timezone.now() + datetime.timedelta(seconds=value)
elif isinstance(value, datetime.timedelta):
self.after_timestamp = timezone.now() + value
@@ -849,7 +846,6 @@ class Job(models.Model):
self.save()
-@six.python_2_unicode_compatible
class ResourceLog(models.Model):
timestamp = models.DateTimeField(auto_now_add=True)
appname = models.CharField(max_length=128, verbose_name='appname', null=True)
@@ -1063,7 +1059,6 @@ class HTTPResource(models.Model):
abstract = True
-@six.python_2_unicode_compatible
class BaseQuery(models.Model):
"""Base for building custom queries.
diff --git a/passerelle/base/signature.py b/passerelle/base/signature.py
index 4f689174..1d7820f0 100644
--- a/passerelle/base/signature.py
+++ b/passerelle/base/signature.py
@@ -5,7 +5,6 @@ import hmac
import random
from urllib import parse as urlparse
-from django.utils import six
from django.utils.encoding import smart_bytes
from django.utils.http import quote, urlencode
@@ -38,7 +37,7 @@ def sign_query(query, key, algo='sha256', timestamp=None, nonce=None):
def sign_string(s, key, algo='sha256'):
digestmod = getattr(hashlib, algo)
- if isinstance(key, six.text_type):
+ if isinstance(key, str):
key = key.encode('utf-8')
hash = hmac.HMAC(smart_bytes(key), digestmod=digestmod, msg=smart_bytes(s))
return hash.digest()
@@ -74,10 +73,6 @@ def check_string(s, signature, key, algo='sha256'):
if len(signature2) != len(signature):
return False
res = 0
- if six.PY3:
- for a, b in zip(signature, signature2):
- res |= a ^ b
- else:
- for a, b in zip(signature, signature2):
- res |= ord(a) ^ ord(b)
+ for a, b in zip(signature, signature2):
+ res |= a ^ b
return res == 0
diff --git a/passerelle/base/views.py b/passerelle/base/views.py
index 52181f35..66079186 100644
--- a/passerelle/base/views.py
+++ b/passerelle/base/views.py
@@ -29,8 +29,6 @@ from django.utils.timezone import make_aware
from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, DeleteView, DetailView, FormView, ListView, UpdateView, View
-from passerelle.compat import json_loads
-
from ..utils import ImportSiteError, export_site, get_trusted_services, import_site
from ..views import GenericConnectorMixin
from .forms import AccessRightForm, ApiUserForm, AvailabilityParametersForm, ImportSiteForm
@@ -332,7 +330,7 @@ class ImportSiteView(FormView):
def form_valid(self, form):
try:
- site_json = json_loads(self.request.FILES['site_json'].read())
+ site_json = json.loads(self.request.FILES['site_json'].read())
except ValueError:
form.add_error('site_json', _('File is not in the expected JSON format.'))
return self.form_invalid(form)
diff --git a/passerelle/compat.py b/passerelle/compat.py
deleted file mode 100644
index e987c028..00000000
--- a/passerelle/compat.py
+++ /dev/null
@@ -1,10 +0,0 @@
-import json
-
-from django.utils import six
-from django.utils.encoding import force_text
-
-
-def json_loads(value):
- if six.PY3:
- value = force_text(value)
- return json.loads(value)
diff --git a/passerelle/contrib/dpark/models.py b/passerelle/contrib/dpark/models.py
index c604fb6f..e8c25b36 100644
--- a/passerelle/contrib/dpark/models.py
+++ b/passerelle/contrib/dpark/models.py
@@ -18,18 +18,18 @@ from __future__ import unicode_literals
import base64
import datetime
+import json
import pytz
from django.conf import settings
from django.core.cache import cache
from django.db import models
-from django.utils import six, timezone
+from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from zeep.exceptions import Fault as WebFault
from zeep.helpers import serialize_object
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.utils.api import endpoint
from passerelle.utils.conversion import to_pdf
from passerelle.utils.jsonresponse import APIError
@@ -201,7 +201,6 @@ def get_client(instance):
return instance.soap_client()
-@six.python_2_unicode_compatible
class DPark(BaseResource):
log_requests_errors = False
@@ -290,7 +289,7 @@ class DPark(BaseResource):
@endpoint(perm='can_access', methods=['post'], description=_('Register a subscription application'))
def register(self, request, *args, **kwargs):
- data = json_loads(request.body)
+ data = json.loads(request.body)
is_erroneous(
data,
(
@@ -348,7 +347,7 @@ class DPark(BaseResource):
@endpoint(perm='can_access', methods=['post'], description=_('Link user to a subscription'))
def link(self, request, *args, **kwargs):
- data = json_loads(request.body)
+ data = json.loads(request.body)
if 'nameid' not in data:
raise WrongParameter(['nameid'], [])
result = self.check_file_exists(data)
@@ -370,7 +369,7 @@ class DPark(BaseResource):
@endpoint(perm='can_access', methods=['post'], description=_('Unlink user to subscription'))
def unlink(self, request, *args, **kwargs):
- data = json_loads(request.body)
+ data = json.loads(request.body)
is_erroneous(data, ('nameid',))
pairings = Pairing.objects.filter(**data)
if pairings.exists() is False:
@@ -479,7 +478,7 @@ class DPark(BaseResource):
@endpoint(name='notify-payment', perm='can_access', methods=['post'], description=_('Notify a payment'))
def payment_notification(self, request, *args, **kwargs):
- data = json_loads(request.body)
+ data = json.loads(request.body)
is_erroneous(
data,
(
@@ -519,7 +518,7 @@ class DPark(BaseResource):
)
def send_files(self, request, *args, **kwargs):
try:
- data = json_loads(request.body)
+ data = json.loads(request.body)
except ValueError as exc:
raise APIError(str(exc), http_status=400)
@@ -568,7 +567,6 @@ class DPark(BaseResource):
return {'data': True}
-@six.python_2_unicode_compatible
class Pairing(models.Model):
INFO_CACHE_DURATION = 5 * 60
PAYMENT_INFO_CACHE_DURATION = 20 * 60
diff --git a/passerelle/contrib/gdema/models.py b/passerelle/contrib/gdema/models.py
index 79a93d25..c8c2e33c 100644
--- a/passerelle/contrib/gdema/models.py
+++ b/passerelle/contrib/gdema/models.py
@@ -20,12 +20,10 @@ import re
from django.db import models
from django.utils.dateparse import parse_date, parse_datetime
-from django.utils.six import string_types
from django.utils.timezone import get_fixed_timezone, is_naive, make_aware, utc
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.utils.api import endpoint
from passerelle.utils.jsonresponse import APIError
@@ -68,7 +66,7 @@ def parse_gdema_datetime(value):
def normalize(value):
'''convert /Date()/ to datetime, integers to strings'''
- if isinstance(value, string_types):
+ if isinstance(value, str):
datetime = parse_gdema_datetime(value)
if datetime:
return datetime
@@ -253,7 +251,7 @@ class Gdema(BaseResource):
)
def create_request(self, request):
try:
- payload = json_loads(request.body)
+ payload = json.loads(request.body)
except ValueError:
raise APIError('payload must be a JSON object', http_status=400)
if not isinstance(payload, dict):
diff --git a/passerelle/contrib/grandlyon_streetsections/models.py b/passerelle/contrib/grandlyon_streetsections/models.py
index b0e73655..f5d3e0a7 100644
--- a/passerelle/contrib/grandlyon_streetsections/models.py
+++ b/passerelle/contrib/grandlyon_streetsections/models.py
@@ -14,6 +14,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
+import json
import re
from django.db import models
@@ -22,7 +23,6 @@ from django.utils.text import slugify
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.utils.api import endpoint
COMMUNE_EXTRA_MAPPING = {'Vaulx-en-Velin': 'VAULX'}
@@ -123,7 +123,7 @@ class GrandLyonStreetSections(BaseResource):
sections = self.requests.get(
'https://download.data.grandlyon.com/ws/grandlyon/adr_voie_lieu.adraxevoie/all.json?maxfeatures=1000000'
).content
- for value in json_loads(sections).get('values'):
+ for value in json.loads(sections).get('values'):
if not value.get('codefuv') or not value.get('codetroncon'):
continue
section, dummy = StreetSection.objects.get_or_create(
diff --git a/passerelle/contrib/greco/models.py b/passerelle/contrib/greco/models.py
index aabceef8..ebc0a0f9 100644
--- a/passerelle/contrib/greco/models.py
+++ b/passerelle/contrib/greco/models.py
@@ -14,6 +14,7 @@
# along with this program. If not, see .
import base64
+import json
import re
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
@@ -28,7 +29,6 @@ from suds.transport import Reply
from suds.transport.http import HttpAuthenticated
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.soap import sudsobject_to_dict
from passerelle.utils.api import APIError, endpoint
@@ -258,7 +258,7 @@ Response :
def create(self, request):
# get creation fields from payload
try:
- formdata = FormData(json_loads(request.body), CREATION_SCHEMA)
+ formdata = FormData(json.loads(request.body), CREATION_SCHEMA)
except ValueError as e:
raise ParameterTypeError(str(e))
# create suds object from formdata
@@ -329,7 +329,7 @@ Response :
)
def add_information(self, request, iddemande=None, idgreco=None, information=None):
if request.body:
- payload = json_loads(request.body)
+ payload = json.loads(request.body)
if not isinstance(payload, dict):
raise ParameterTypeError('payload must be a dict')
idgreco = payload.get('idgreco') or idgreco
@@ -356,7 +356,7 @@ Response :
)
def update(self, request, iddemande=None, idgreco=None, comment=None):
if request.body:
- payload = json_loads(request.body)
+ payload = json.loads(request.body)
if not isinstance(payload, dict):
raise ParameterTypeError('payload must be a dict')
idgreco = payload.get('idgreco') or idgreco
@@ -383,7 +383,7 @@ Response :
display_order=7,
)
def add_confirmation(self, request):
- payload = json_loads(request.body)
+ payload = json.loads(request.body)
if not isinstance(payload, dict):
raise ParameterTypeError('payload must be a dict')
idgreco = payload.get('idgreco')
diff --git a/passerelle/contrib/grenoble_gru/models.py b/passerelle/contrib/grenoble_gru/models.py
index 4b3e12ff..50421932 100644
--- a/passerelle/contrib/grenoble_gru/models.py
+++ b/passerelle/contrib/grenoble_gru/models.py
@@ -14,6 +14,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
+import json
import re
from urllib import parse as urlparse
@@ -26,7 +27,6 @@ from django.utils.translation import ugettext_lazy as _
from lxml import etree
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.utils.api import endpoint
from passerelle.utils.jsonresponse import APIError
from passerelle.views import WrongParameter
@@ -237,7 +237,7 @@ class GrenobleGRU(BaseResource):
@endpoint(name='create-demand', perm='can_access', methods=['post'], description=_('Create a demand'))
def create_demand(self, request, *args, **kwargs):
try:
- payload = self.build_gru_params(json_loads(request.body))
+ payload = self.build_gru_params(json.loads(request.body))
except (KeyError, ValueError) as e:
raise APIError(e)
response = self.request('ws_creation_demande.php', payload)
@@ -253,7 +253,7 @@ class GrenobleGRU(BaseResource):
pattern=r'(?P[\w-]+)/add-attachment/$',
)
def add_attachment_to_demand(self, request, demand_id, **kwargs):
- data = json_loads(request.body)
+ data = json.loads(request.body)
if 'file' not in data:
raise WrongParameter(['file'], [])
file_data = data['file']
diff --git a/passerelle/contrib/lille_urban_card/models.py b/passerelle/contrib/lille_urban_card/models.py
index d65b9c46..0668775b 100644
--- a/passerelle/contrib/lille_urban_card/models.py
+++ b/passerelle/contrib/lille_urban_card/models.py
@@ -16,6 +16,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
+import json
import re
from urllib.parse import urljoin
@@ -23,7 +24,6 @@ from django.db import models
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.utils.api import endpoint
from passerelle.utils.http_authenticators import HttpBearerAuth
from passerelle.utils.jsonresponse import APIError
@@ -134,7 +134,7 @@ class LilleUrbanCard(BaseResource):
@endpoint(perm='can_access', description=_('Card Request'), methods=['post'])
def card_request(self, request, *args, **kwargs):
- data = json_loads(request.body)
+ data = json.loads(request.body)
self.preprocess_card_request_data(data)
self.preprocess_contact_data(data)
self.preprocess_service_data(data)
@@ -169,7 +169,7 @@ class LilleUrbanCard(BaseResource):
@endpoint(perm='can_access', description=_('Add new subscriptions'), methods=['post'])
def add_subscriptions(self, request, *args, **kwargs):
- data = json_loads(request.body)
+ data = json.loads(request.body)
self.preprocess_card_request_data(data)
self.preprocess_contact_data(data)
self.preprocess_service_data(data)
@@ -193,7 +193,7 @@ class LilleUrbanCard(BaseResource):
@endpoint(perm='can_access', description=_('Code Change'), methods=['post'])
def code_change(self, request, *args, **kwargs):
- data = json_loads(request.body)
+ data = json.loads(request.body)
response = self.requests.post(
urljoin(self.base_url, '/clu/ws/modifierCodeSecret'),
json=data,
@@ -211,7 +211,7 @@ class LilleUrbanCard(BaseResource):
@endpoint(perm='can_access', description=_('Code check'), methods=['post'])
def code_check(self, request, *args, **kwargs):
- data = json_loads(request.body)
+ data = json.loads(request.body)
if 'password' in data:
data['code_secret'] = data.pop('password')
response = self.requests.get(
@@ -262,7 +262,7 @@ class LilleUrbanCard(BaseResource):
@endpoint(perm='can_access', description=_('Card Revocation'), methods=['post'])
def card_revocation(self, request, *args, **kwargs):
- data = json_loads(request.body)
+ data = json.loads(request.body)
self.preprocess_contact_data(data)
response = self.requests.post(
urljoin(self.base_url, '/clu/ws/revoquerCarte'), json=data, auth=HttpBearerAuth(self.get_token())
@@ -279,7 +279,7 @@ class LilleUrbanCard(BaseResource):
@endpoint(perm='can_access', description=_('Subscription Revocation'), methods=['post'])
def subscription_revocation(self, request, *args, **kwargs):
- data = json_loads(request.body)
+ data = json.loads(request.body)
self.preprocess_contact_data(data)
self.preprocess_service_data(data)
response = self.requests.post(
@@ -299,7 +299,7 @@ class LilleUrbanCard(BaseResource):
@endpoint(perm='can_access', description=_('Subscription Renewal'), methods=['post'])
def subscription_renewal(self, request, *args, **kwargs):
- data = json_loads(request.body)
+ data = json.loads(request.body)
self.preprocess_contact_data(data)
response = self.requests.post(
urljoin(self.base_url, '/clu/ws/renouvelerAbonnements'),
diff --git a/passerelle/contrib/mdph13/models.py b/passerelle/contrib/mdph13/models.py
index a542500b..44ca3f8f 100644
--- a/passerelle/contrib/mdph13/models.py
+++ b/passerelle/contrib/mdph13/models.py
@@ -22,7 +22,6 @@ from urllib import parse as urlparse
import requests
from django.db import models, transaction
-from django.utils import six
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource, HTTPResource
@@ -135,7 +134,7 @@ class MDPH13Resource(BaseResource, HTTPResource):
'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):
+ if not all(isinstance(demande.get('typologie'), str) for demande in demandes):
raise APIError('typologie-must-be-a-string', data=content)
if not all(demande['typologie'].lower() in typologies for demande in demandes):
unknowns = set([demande['typologie'].lower() for demande in demandes]) - set(
@@ -158,7 +157,7 @@ class MDPH13Resource(BaseResource, HTTPResource):
def check(value, path):
if path[-1].startswith('date_'):
- if isinstance(value, six.text_type) and not self.DATE_RE.match(value):
+ if isinstance(value, str) and not self.DATE_RE.match(value):
errors.append('%s is not a date string' % '.'.join(path))
json_walker(data, check)
@@ -297,14 +296,13 @@ class MDPH13Resource(BaseResource, HTTPResource):
raise
file_data.update(to_json().err_to_response(e))
# do it later as get_filter() can modify str(link)
- file_data['text'] = six.text_type(link)
+ file_data['text'] = str(link)
data.append(file_data)
if link_id:
return {'data': data[0] if data else None}
return {'data': data}
-@six.python_2_unicode_compatible
class Link(models.Model):
resource = models.ForeignKey(MDPH13Resource, on_delete=models.CASCADE)
name_id = models.CharField(verbose_name=_('NameID'), max_length=256)
diff --git a/passerelle/contrib/nancypoll/models.py b/passerelle/contrib/nancypoll/models.py
index 4202ca42..8cb44f1c 100644
--- a/passerelle/contrib/nancypoll/models.py
+++ b/passerelle/contrib/nancypoll/models.py
@@ -1,7 +1,6 @@
import csv
from django.db import models
-from django.utils import six
from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _
@@ -51,8 +50,7 @@ class NancyPoll(BaseResource):
content = self.csv_file.read()
if not content:
raise APIError('No content found')
- if six.PY3:
- content = force_text(content)
+ content = force_text(content)
reader = csv.reader(content.splitlines())
next(reader)
diff --git a/passerelle/contrib/planitech/mste.py b/passerelle/contrib/planitech/mste.py
index f2a483a5..b2f96427 100644
--- a/passerelle/contrib/planitech/mste.py
+++ b/passerelle/contrib/planitech/mste.py
@@ -17,8 +17,6 @@
import calendar
from datetime import datetime
-from django.utils import six
-
ENCODE_TOKENS = {
'integer': 16,
'real': 19,
@@ -228,7 +226,7 @@ class MSTEEncoder:
if ref is not None:
self._push_token_type('ref')
self._push(ref)
- elif isinstance(obj, six.string_types):
+ elif isinstance(obj, str):
self._encode_string(obj)
elif obj is None:
self._encode_nil()
diff --git a/passerelle/contrib/solis_apa/models.py b/passerelle/contrib/solis_apa/models.py
index 587566f2..290bd35b 100644
--- a/passerelle/contrib/solis_apa/models.py
+++ b/passerelle/contrib/solis_apa/models.py
@@ -23,7 +23,6 @@ from django.db import models
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.contrib.solis_apa import conciliation, integration, suivi
from passerelle.utils.jsonresponse import APIError
@@ -314,7 +313,7 @@ class SolisAPA(BaseResource):
uri = 'importFlow?flow=ImportIntegrationDemande&application=%s' % APPLICATION
url = self.get_resource_url(uri)
- data = {'ImportInputWSDemandeApa': integration.build_message(json_loads(data))}
+ data = {'ImportInputWSDemandeApa': integration.build_message(json.loads(data))}
data = json.dumps(data)
self.logger.debug('Demande APA: %s' % data, extra={'solis_apa_demande': data})
response = self.requests.post(url, data=data, headers=HEADERS)
diff --git a/passerelle/contrib/strasbourg_eu/models.py b/passerelle/contrib/strasbourg_eu/models.py
index 7388ec40..f8e352a2 100644
--- a/passerelle/contrib/strasbourg_eu/models.py
+++ b/passerelle/contrib/strasbourg_eu/models.py
@@ -15,6 +15,7 @@
# along with this program. If not, see .
import datetime
+import json
from urllib import parse as urlparse
from django.db import models
@@ -23,7 +24,6 @@ from django.utils.translation import ugettext_lazy as _
from requests import RequestException
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.utils.api import APIError, endpoint
@@ -52,7 +52,7 @@ class StrasbourgEu(BaseResource):
if name_id is None:
raise APIError('missing name_id')
# expected content: {"interests": ["123", "456"]}
- response = json_loads(request.body)
+ response = json.loads(request.body)
if 'error ' in response:
return {'err': 1, 'err_desc': response.get('error')}
interests = response.get('interests')
@@ -134,7 +134,7 @@ class StrasbourgEu(BaseResource):
else:
# expected content: {"title": ..., "description": ..., "url": ...,
# ...}, cf https://strasbourgeurometropole.github.io/slate/#ajout-d-39-une-notification
- notification = json_loads(request.body)
+ notification = json.loads(request.body)
notification['userId'] = name_id
url = urlparse.urljoin(self.liferay_api_url, 'jsonws/notification.notification/add-notification')
try:
@@ -172,7 +172,7 @@ class StrasbourgEu(BaseResource):
else:
# expected content: {"title": ..., "url": ..., ...},
# cf https://strasbourgeurometropole.github.io/slate/?shell#ajout-d-39-un-favori
- favorite = json_loads(request.body)
+ favorite = json.loads(request.body)
# change type to typeId
types_url = urlparse.urljoin(self.liferay_api_url, 'jsonws/favorite.favorite/get-types')
try:
diff --git a/passerelle/contrib/teamnet_axel/models.py b/passerelle/contrib/teamnet_axel/models.py
index 0721ec5b..b0ee43ec 100644
--- a/passerelle/contrib/teamnet_axel/models.py
+++ b/passerelle/contrib/teamnet_axel/models.py
@@ -15,6 +15,7 @@
# along with this program. If not, see .
import base64
+import json
import logging
import xml.etree.ElementTree as ET
from datetime import datetime
@@ -26,7 +27,6 @@ from django.utils.encoding import smart_text
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.soap import client_to_jsondict
from passerelle.utils.api import endpoint
from passerelle.utils.jsonresponse import APIError
@@ -315,7 +315,7 @@ class TeamnetAxel(BaseResource):
pattern=r'^(?P\w+)/invoice/(?P[\w,-]+)/pay/$',
)
def pay_invoice(self, request, regie_id, invoice_id, **kwargs):
- data = json_loads(request.body)
+ data = json.loads(request.body)
transaction_id = data.get('transaction_id')
transaction_date = data.get('transaction_date')
email = data.get('email')
diff --git a/passerelle/contrib/teamnet_axel/soap.py b/passerelle/contrib/teamnet_axel/soap.py
index ff98786c..2af3108a 100644
--- a/passerelle/contrib/teamnet_axel/soap.py
+++ b/passerelle/contrib/teamnet_axel/soap.py
@@ -17,7 +17,8 @@
# borrowed from https://pypi.python.org/pypi/suds_requests
# and https://docs.oracle.com/cd/E50245_01/E50253/html/vmprg-soap-example-authentication-python.html
-from django.utils.six import BytesIO
+from io import BytesIO
+
from suds.client import Client
from suds.transport import Reply
from suds.transport.http import HttpAuthenticated
diff --git a/passerelle/contrib/toulouse_axel/models.py b/passerelle/contrib/toulouse_axel/models.py
index 2b48fe35..2713bb8a 100644
--- a/passerelle/contrib/toulouse_axel/models.py
+++ b/passerelle/contrib/toulouse_axel/models.py
@@ -16,6 +16,7 @@
import base64
import datetime
+import json
import logging
import os
@@ -27,7 +28,6 @@ from django.utils.dates import WEEKDAYS as WEEKDAYS_LABELS
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
-from passerelle.compat import json_loads
from passerelle.contrib.utils import axel
from passerelle.utils.api import endpoint
from passerelle.utils.jsonresponse import APIError
@@ -873,7 +873,7 @@ class ToulouseAxel(BaseResource):
},
)
def pay_invoice(self, request, regie_id, invoice_id, **kwargs):
- data = json_loads(request.body)
+ data = json.loads(request.body)
dui, invoice_id = invoice_id.rsplit('-', 1)
invoice = self.get_invoice(regie_id=regie_id, dui=dui, invoice_id=invoice_id)
diff --git a/passerelle/contrib/toulouse_axel/utils.py b/passerelle/contrib/toulouse_axel/utils.py
index 190bea80..4a751322 100644
--- a/passerelle/contrib/toulouse_axel/utils.py
+++ b/passerelle/contrib/toulouse_axel/utils.py
@@ -20,8 +20,6 @@ from __future__ import unicode_literals
import datetime
from collections import OrderedDict
-from django.utils.six import string_types
-
from passerelle.utils.conversion import normalize
situation_familiale_mapping = OrderedDict(
@@ -92,7 +90,7 @@ def upperize(data):
if isinstance(data, list):
for i, val in enumerate(data):
data[i] = upperize(val)
- if isinstance(data, string_types):
+ if isinstance(data, str):
data = normalize(data).upper()
return data
diff --git a/passerelle/sms/models.py b/passerelle/sms/models.py
index 902a9069..ae5816a9 100644
--- a/passerelle/sms/models.py
+++ b/passerelle/sms/models.py
@@ -21,7 +21,6 @@ from django.contrib.postgres.fields import ArrayField
from django.core.validators import RegexValidator
from django.db import models
from django.urls import reverse
-from django.utils import six
from django.utils.module_loading import import_string
from django.utils.translation import ugettext_lazy as _
@@ -250,7 +249,6 @@ class SMSResource(BaseResource):
abstract = True
-@six.python_2_unicode_compatible
class SMSLog(models.Model):
timestamp = models.DateTimeField(auto_now_add=True)
appname = models.CharField(max_length=128, verbose_name='appname', null=True)
diff --git a/passerelle/utils/__init__.py b/passerelle/utils/__init__.py
index 8b6bc267..18bc38cf 100644
--- a/passerelle/utils/__init__.py
+++ b/passerelle/utils/__init__.py
@@ -21,6 +21,7 @@ import re
import time
import warnings
from functools import wraps
+from io import BytesIO
from itertools import chain, islice
from django.conf import settings
@@ -33,7 +34,6 @@ from django.utils.decorators import available_attrs
from django.utils.encoding import force_bytes, force_text
from django.utils.functional import lazy
from django.utils.html import mark_safe
-from django.utils.six import BytesIO
from django.utils.translation import ngettext_lazy
from django.views.generic.detail import SingleObjectMixin
from requests import Response as RequestResponse
diff --git a/passerelle/utils/api.py b/passerelle/utils/api.py
index 0ee6cb26..b55a59c8 100644
--- a/passerelle/utils/api.py
+++ b/passerelle/utils/api.py
@@ -19,7 +19,6 @@ from __future__ import absolute_import
import inspect
from django.urls import reverse
-from django.utils import six
from django.utils.safestring import mark_safe
# make APIError available from this module
@@ -109,7 +108,7 @@ class endpoint:
def __call__(self, func):
func.endpoint_info = self
if not self.name:
- self.name = func.func_name if six.PY2 else func.__name__
+ self.name = func.__name__
self.func = func
return func
diff --git a/passerelle/utils/conversion.py b/passerelle/utils/conversion.py
index 2a8671bd..2a9625e2 100644
--- a/passerelle/utils/conversion.py
+++ b/passerelle/utils/conversion.py
@@ -19,11 +19,10 @@ import math
import re
import unicodedata
import warnings
+from io import BytesIO
import unidecode
-from django.utils import six
from django.utils.encoding import force_text
-from django.utils.six import BytesIO
from PIL import Image
@@ -74,20 +73,20 @@ def to_ascii(s):
def exception_to_text(e):
try:
- return six.text_type(e)
+ return str(e)
except Exception:
pass
try:
r = repr(e)
- return six.text_type(r, errors='replace')
+ return str(r, errors='replace')
except Exception:
pass
try:
args = e.args
try:
- content = six.text_type(repr(args)) if args != [] else ''
+ content = str(repr(args)) if args != [] else ''
except Exception:
content = ''
except AttributeError:
diff --git a/passerelle/utils/json.py b/passerelle/utils/json.py
index 5a714124..7152155e 100644
--- a/passerelle/utils/json.py
+++ b/passerelle/utils/json.py
@@ -31,8 +31,6 @@
from __future__ import unicode_literals
-from django.utils import six
-
from passerelle.utils.validation import is_number
FLATTEN_SEPARATOR = '/'
@@ -110,7 +108,7 @@ def flatten(data, separator=FLATTEN_SEPARATOR):
for path, value in helper(value):
yield [str(i)] + path, value
elif isinstance(data, dict):
- for key, value in six.iteritems(data):
+ for key, value in data.items():
for path, value in helper(value):
yield [str(key)] + path, value
else:
diff --git a/passerelle/utils/sftp.py b/passerelle/utils/sftp.py
index a6034e32..44e72186 100644
--- a/passerelle/utils/sftp.py
+++ b/passerelle/utils/sftp.py
@@ -27,7 +27,6 @@ import paramiko
from django import forms
from django.core import validators
from django.db import models
-from django.utils import six
from django.utils.encoding import force_bytes, force_text
from django.utils.translation import ugettext_lazy as _
from paramiko.dsskey import DSSKey
@@ -59,7 +58,6 @@ def _load_private_key(content_or_file, password=None):
pass
-@six.python_2_unicode_compatible
class SFTP:
def __init__(self, url, private_key_content=None, private_key_password=None):
self.url = url
diff --git a/passerelle/utils/wcs.py b/passerelle/utils/wcs.py
index 13b8d7e9..9e565ffa 100644
--- a/passerelle/utils/wcs.py
+++ b/passerelle/utils/wcs.py
@@ -31,7 +31,6 @@ from django import forms
from django.conf import settings
from django.core.cache import cache
from django.db import models
-from django.utils import six
from passerelle.base import signature
@@ -114,7 +113,6 @@ class Evolution(BaseObject):
self.who = EvolutionUser(wcs_api, **self.who)
-@six.python_2_unicode_compatible
class FormData(BaseObject):
geolocations = None
evolution = None
@@ -411,7 +409,7 @@ class FormDefSubmit:
content_type = kwargs.get('content_type', 'application/octet-stream')
if hasattr(value, 'read'):
content = base64.b64encode(value.read())
- elif isinstance(value, six.binary_type):
+ elif isinstance(value, bytes):
content = base64.b64encode(value)
elif isinstance(value, dict):
if not set(value).issuperset(set(['filename', 'content'])):
@@ -428,7 +426,7 @@ class FormDefSubmit:
}
def _set_type_date(self, varname, field, value):
- if isinstance(value, six.string_types):
+ if isinstance(value, str):
value = datetime.datetime.strptime(value, '%Y-%m-%d').date()
if isinstance(value, datetime.datetime):
value = value.date()
@@ -444,7 +442,7 @@ class FormDefSubmit:
self.data[varname] = value
def _set_type_bool(self, varname, field, value):
- if isinstance(value, six.string_types):
+ if isinstance(value, str):
value = value.lower().strip() in ['yes', 'true', 'on']
if not isinstance(value, bool):
raise TypeError('value must be a boolean or a string true, yes, on, false, no, off')
@@ -454,7 +452,6 @@ class FormDefSubmit:
raise CancelSubmitError
-@six.python_2_unicode_compatible
class FormDef(BaseObject):
geolocations = None
@@ -645,7 +642,6 @@ def get_wcs_choices(session=None):
return choices
-@six.python_2_unicode_compatible
class FormDefRef:
_formdef = None
_api = None
@@ -655,7 +651,7 @@ class FormDefRef:
if value2:
self.wcs_slug, self.formdef_slug = value1, value2
else:
- self.wcs_slug, self.formdef_slug = six.text_type(value1).rsplit(':', 1)
+ self.wcs_slug, self.formdef_slug = str(value1).rsplit(':', 1)
@property
def api(self):
diff --git a/passerelle/utils/zip.py b/passerelle/utils/zip.py
index 22c389b2..ef3b1559 100644
--- a/passerelle/utils/zip.py
+++ b/passerelle/utils/zip.py
@@ -28,7 +28,6 @@ from django.template import Context, Template, TemplateDoesNotExist, TemplateSyn
from django.template.loader import get_template
from django.utils.encoding import force_str
from django.utils.functional import cached_property
-from django.utils.six import python_2_unicode_compatible
from jsonschema import ValidationError, validate
from passerelle.utils.files import atomic_write
@@ -92,7 +91,6 @@ class ZipTemplateSyntaxError(ZipTemplateError):
VARIABLE_RE = re.compile(r'{{ *(\w*)')
-@python_2_unicode_compatible
class ZipPart:
def __init__(self, zip_template, name_template, template_path=None, content_expression=None):
self.zip_template = zip_template
diff --git a/passerelle/views.py b/passerelle/views.py
index 7916acbb..e781d729 100644
--- a/passerelle/views.py
+++ b/passerelle/views.py
@@ -53,7 +53,6 @@ from django.views.generic.detail import SingleObjectMixin
from jsonschema import ValidationError, validate, validators
from passerelle.base.models import BaseResource, ResourceLog
-from passerelle.compat import json_loads
from passerelle.utils.conversion import normalize
from passerelle.utils.json import unflatten
from passerelle.utils.jsonresponse import APIError, JSONEncoder
@@ -397,7 +396,7 @@ class GenericEndpointView(GenericConnectorMixin, SingleObjectMixin, View):
merge_extra = hasattr(json_schema, 'items') and json_schema.get('merge_extra', False)
pre_process = hasattr(json_schema, 'items') and json_schema.get('pre_process')
try:
- data = json_loads(request.body)
+ data = json.loads(request.body)
except ValueError as e:
raise APIError("could not decode body to json: %s" % e, http_status=400)
if must_unflatten:
diff --git a/tests/conftest.py b/tests/conftest.py
index cae31341..e18c58f8 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -6,14 +6,10 @@ import pytest
from django.contrib.auth.models import User
from django.core.cache import cache
from django.core.files import File
-from django.utils import six
from httmock import HTTMock, remember_called, response, urlmatch
from tests.utils import make_resource
-if six.PY2:
- collect_ignore = ['wcs/']
-
@pytest.fixture(autouse=True)
def media(settings, tmpdir):
diff --git a/tests/test_address.py b/tests/test_address.py
index 841ed63c..83ae6d26 100644
--- a/tests/test_address.py
+++ b/tests/test_address.py
@@ -15,11 +15,11 @@
# along with this program. If not, see .
import json
+from io import StringIO
import mock
import pytest
from django.core.files import File
-from django.utils.six import StringIO
import tests.utils
from passerelle.apps.base_adresse.models import BaseAdresse
diff --git a/tests/test_cartads_cs.py b/tests/test_cartads_cs.py
index c8413d39..85f1ec3d 100644
--- a/tests/test_cartads_cs.py
+++ b/tests/test_cartads_cs.py
@@ -13,7 +13,6 @@ from httmock import HTTMock
import tests.utils
from passerelle.apps.cartads_cs.models import CartaDSCS, CartaDSDossier, CartaDSFile
from passerelle.base.models import Job
-from passerelle.compat import json_loads
@pytest.fixture
@@ -716,12 +715,12 @@ def test_role_sync(connector, app, cached_data):
assert url.netloc == 'idp.example.org'
if url.path == '/api/roles/':
dossier = CartaDSDossier.objects.all().first()
- assert json_loads(request.body) == json.loads(
+ assert json.loads(request.body) == json.loads(
'{"name": "Suivi Cart@DS (%s)", "slug": "_cartads_%s"}' % (dossier.id, dossier.id)
)
return {'content': json.dumps({'uuid': 'role-uuid'}), 'status_code': 200}
elif url.path == '/api/roles/role-uuid/relationships/members/':
- body = json_loads(request.body)
+ body = json.loads(request.body)
idp_mock.subscribed_roles = set([x['uuid'] for x in body['data']])
return {'content': json.dumps({'err': 0}), 'status_code': 200}
raise Exception('unhandled http call (%s)' % url)
diff --git a/tests/test_csv_datasource.py b/tests/test_csv_datasource.py
index 3e22cec5..91c4fab7 100644
--- a/tests/test_csv_datasource.py
+++ b/tests/test_csv_datasource.py
@@ -17,16 +17,17 @@
# along with this program. If not, see .
import datetime
+import json
import os
import time
import uuid
+from io import StringIO
from posix import stat_result
from stat import ST_MTIME
from urllib.parse import urlencode
import mock
import pytest
-import six
import webtest
from django.contrib.contenttypes.models import ContentType
from django.core.files import File
@@ -35,12 +36,10 @@ from django.core.management import call_command
from django.test import Client, override_settings
from django.urls import reverse
from django.utils.encoding import force_bytes, force_str, force_text
-from django.utils.six import StringIO
from django.utils.timezone import now
from passerelle.apps.csvdatasource.models import CsvDataSource, Query, TableRow, upload_to
from passerelle.base.models import AccessRight, ApiUser
-from passerelle.compat import json_loads
from tests.test_manager import login
data = """121;69981;DELANOUE;Eliot;H
@@ -114,7 +113,7 @@ def setup():
def parse_response(response):
- return json_loads(response.content)['data']
+ return json.loads(response.content)['data']
@pytest.fixture
@@ -345,7 +344,7 @@ def test_on_the_fly_dialect_detection(client, setup):
_, url = setup(data=StringIO(data))
CsvDataSource.objects.all().update(_dialect_options=None)
resp = client.get(url)
- result = json_loads(resp.content)
+ result = json.loads(resp.content)
assert result['err'] == 0
assert len(result['data']) == 20
@@ -353,7 +352,7 @@ def test_on_the_fly_dialect_detection(client, setup):
def test_missing_columns(client, setup):
_, url = setup(data=StringIO(data + 'A;B;C\n'))
resp = client.get(url)
- result = json_loads(resp.content)
+ result = json.loads(resp.content)
assert result['err'] == 0
assert len(result['data']) == 21
assert result['data'][-1] == {'lname': 'C', 'sex': '', 'id': 'B', 'fname': '', 'fam': 'A'}
@@ -364,20 +363,20 @@ def test_unknown_sheet_name(client, setup):
csvdata.sheet_name = 'unknown'
csvdata.save()
resp = client.get(url)
- result = json_loads(resp.content)
+ result = json.loads(resp.content)
assert len(result['data']) == 20
def test_cache_new_shorter_file(client, setup):
csvdata, url = setup(data=StringIO(data + 'A;B;C\n'))
resp = client.get(url)
- result = json_loads(resp.content)
+ result = json.loads(resp.content)
assert result['err'] == 0
assert len(result['data']) == 21
csvdata.csv_file = File(StringIO(data), 'data.csv')
csvdata.save()
resp = client.get(url)
- result = json_loads(resp.content)
+ result = json.loads(resp.content)
assert len(result['data']) == 20
@@ -400,7 +399,7 @@ def test_query_array(app, setup, filetype):
for row in response.json['data']:
assert len(row) == 2
assert isinstance(row[0], int)
- assert isinstance(row[1], six.text_type)
+ assert isinstance(row[1], str)
def test_query_q_filter(app, setup, filetype):
@@ -449,7 +448,7 @@ def test_query_dict(app, setup, filetype):
for row in response.json['data']:
assert len(row) == 2
assert isinstance(row['id'], int)
- assert isinstance(row['prenom'], six.text_type)
+ assert isinstance(row['prenom'], str)
def test_query_tuples(app, setup, filetype):
@@ -473,7 +472,7 @@ def test_query_tuples(app, setup, filetype):
assert row[0][0] == 'id'
assert isinstance(row[0][1], int)
assert row[1][0] == 'prenom'
- assert isinstance(row[1][1], six.text_type)
+ assert isinstance(row[1][1], str)
def test_query_onerow(app, setup, filetype):
diff --git a/tests/test_ensure_jsonbfields.py b/tests/test_ensure_jsonbfields.py
index 77de6d41..06dd977e 100644
--- a/tests/test_ensure_jsonbfields.py
+++ b/tests/test_ensure_jsonbfields.py
@@ -1,10 +1,11 @@
# -*- coding: utf-8 -*-
+from io import BytesIO
+
import pytest
from django.core.files import File
from django.core.management import call_command
from django.db import connection
-from django.utils.six import BytesIO
from passerelle.apps.csvdatasource.models import CsvDataSource
from passerelle.contrib.teamnet_axel.models import TeamnetAxel
diff --git a/tests/test_grenoble_gru.py b/tests/test_grenoble_gru.py
index 29753403..4206a7f6 100644
--- a/tests/test_grenoble_gru.py
+++ b/tests/test_grenoble_gru.py
@@ -20,7 +20,6 @@ import os
import mock
import pytest
-import six
from django.urls import reverse
import tests.utils
@@ -119,7 +118,7 @@ Création de la demande via le webService de la commune de Grenoble
@pytest.fixture(params=['01', '02', '10', '20', '21', '23', '4242'])
def remote_response(request):
- text = six.text_type(request.param)
+ text = str(request.param)
return tests.utils.FakedResponse(index=request.param_index, text=text)
diff --git a/tests/test_import_export.py b/tests/test_import_export.py
index fad8e452..22b45626 100644
--- a/tests/test_import_export.py
+++ b/tests/test_import_export.py
@@ -3,6 +3,7 @@ import json
import os
import sys
import tempfile
+from io import BytesIO, StringIO
import pytest
from django.contrib.contenttypes.models import ContentType
@@ -12,7 +13,6 @@ from django.test import Client
from django.urls import reverse
from django.utils import timezone
from django.utils.encoding import force_bytes, force_text
-from django.utils.six import BytesIO, StringIO
from passerelle.apps.base_adresse.models import BaseAdresse
from passerelle.apps.bdp.models import Bdp
@@ -20,7 +20,6 @@ from passerelle.apps.csvdatasource.models import CsvDataSource, Query
from passerelle.apps.ovh.models import OVHSMSGateway
from passerelle.apps.sector.models import SectorResource
from passerelle.base.models import AccessRight, ApiUser
-from passerelle.compat import json_loads
from passerelle.utils import ImportSiteError, export_site, import_site
data = """121;69981;DELANOUE;Eliot;H
@@ -91,7 +90,7 @@ def setup():
def parse_response(response):
- return json_loads(response.content)['data']
+ return json.loads(response.content)['data']
@pytest.fixture
@@ -138,7 +137,7 @@ def test_export_csvdatasource(app, setup, filetype):
assert first == second
output = get_output_of_command('export_site')
- third = json_loads(output)
+ third = json.loads(output)
third['resources'][0]['csv_file']['name'] = 'whocares'
assert first == third
diff --git a/tests/test_jsonresponse.py b/tests/test_jsonresponse.py
index ac44ac5f..26edc135 100644
--- a/tests/test_jsonresponse.py
+++ b/tests/test_jsonresponse.py
@@ -1,3 +1,4 @@
+import json
import logging
import pytest
@@ -5,7 +6,6 @@ from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
from django.http import Http404
from django.test.client import RequestFactory
-from passerelle.compat import json_loads
from passerelle.utils import to_json
@@ -109,7 +109,7 @@ def test_jsonresponse_log_as_warning_exception(caplog):
assert record.method == 'GET'
assert "Error occurred while processing request" in record.message
assert response.status_code == 488
- data = json_loads(response.content)
+ data = json.loads(response.content)
assert data['err'] == 'logaswarningexception'
assert data['err_desc'] == 'log as warning exception'
@@ -124,7 +124,7 @@ def test_jsonresponse_error_header():
result = test_func(req)
assert result.status_code == 200
- data = json_loads(result.content)
+ data = json.loads(result.content)
assert data == {'test': 'un test', 'err': 0}
@to_json()
@@ -135,7 +135,7 @@ def test_jsonresponse_error_header():
raise CustomException
result = test_func2(req)
- data = json_loads(result.content)
+ data = json.loads(result.content)
assert 'err_class' in data
assert 'err' in data
assert data['err'] == 1
@@ -161,7 +161,7 @@ def test_jsonresponse_with_callback():
content_type = result.get('Content-Type')
assert 'application/javascript' in content_type
assert result.content.startswith(b'myfunc(')
- args = json_loads(result.content[7:-2])
+ args = json.loads(result.content[7:-2])
assert args == {'foo': 'bar', 'err': 0}
diff --git a/tests/test_lille_urban_card.py b/tests/test_lille_urban_card.py
index 2257c2c2..13402526 100644
--- a/tests/test_lille_urban_card.py
+++ b/tests/test_lille_urban_card.py
@@ -7,7 +7,6 @@ import pytest
from httmock import HTTMock
import tests.utils
-from passerelle.compat import json_loads
from passerelle.contrib.lille_urban_card.models import LilleUrbanCard
from passerelle.utils.jsonresponse import APIError
@@ -29,7 +28,7 @@ def mocked_http(url, request):
if url.path == '/clu/ws/auth/connexion':
return {'content': TOKEN_RESPONSE, 'status_code': 200}
if url.path == '/clu/ws/demanderCarte':
- request_json = json_loads(request.body)
+ request_json = json.loads(request.body)
if request_json.get('simulate_error') == 'doublon':
error = {'erreur': 'Demande 113-9166 : 1 demande(s) ...'}
return {'content': json.dumps(error), 'status_code': 409}
@@ -50,7 +49,7 @@ def mocked_http(url, request):
}
return {'content': json.dumps(content), 'status_code': 200}
if url.path == '/clu/ws/ajouterAbonnements':
- request_json = json_loads(request.body)
+ request_json = json.loads(request.body)
if request_json.get('simulate_error') == 'data':
error = {'statut': 'ERREUR_DONNEES', 'erreur': 'Demande vide...'}
return {'content': json.dumps(error), 'status_code': 400}
@@ -60,7 +59,7 @@ def mocked_http(url, request):
}
return {'content': json.dumps(content), 'status_code': 200}
if url.path == '/clu/ws/modifierCodeSecret':
- request_json = json_loads(request.body)
+ request_json = json.loads(request.body)
if request_json.get('simulate_error') == 'wrong num serie':
error = {'statut': 'ERREUR_NUM_SERIE', 'erreur': 'Le numero de serie...'}
return {'content': json.dumps(error), 'status_code': 404}
@@ -72,13 +71,13 @@ def mocked_http(url, request):
return {'content': json.dumps(error), 'status_code': 404}
return {'content': json.dumps({'message': 'Le mot de passe est valide'}), 'status_code': 200}
if url.path in ('/clu/ws/revoquerCarte', '/clu/ws/revoquerAbonnement'):
- request_json = json_loads(request.body)
+ request_json = json.loads(request.body)
if request_json.get('simulate_error') == 'doublon':
error = {'erreur': 'La demande xx existe...'}
return {'content': json.dumps(error), 'status_code': 409}
return {'content': json.dumps({'message': 'ok'}), 'status_code': 200}
if url.path == '/clu/ws/renouvelerAbonnements':
- request_json = json_loads(request.body)
+ request_json = json.loads(request.body)
if request_json.get('simulate_error') == 'wrong num serie':
error = {'statut': 'ERREUR_NUM_SERIE', 'erreur': 'Le numero de serie...'}
return {'content': json.dumps(error), 'status_code': 409}
diff --git a/tests/test_manager.py b/tests/test_manager.py
index 5a392550..27af26da 100644
--- a/tests/test_manager.py
+++ b/tests/test_manager.py
@@ -2,13 +2,13 @@ import datetime
import json
import re
import uuid
+from io import StringIO
import freezegun
import pytest
from django.contrib.contenttypes.models import ContentType
from django.core.files import File
from django.utils.encoding import force_bytes
-from django.utils.six import StringIO
from django.utils.timezone import now
from webtest import Upload
diff --git a/tests/test_mdel.py b/tests/test_mdel.py
index 860b2959..ba43798f 100644
--- a/tests/test_mdel.py
+++ b/tests/test_mdel.py
@@ -18,6 +18,7 @@ from __future__ import unicode_literals
import base64
import copy
+import json
import os
import shutil
import zipfile
@@ -30,7 +31,6 @@ import tests.utils
from passerelle.apps.mdel.mdel import AttachedFile, Description, Message, get_resource_base_dir
from passerelle.apps.mdel.models import MDEL, Demand
from passerelle.apps.mdel.utils import parse_date
-from passerelle.compat import json_loads
from passerelle.utils import SFTP
AEC_XSD = 'ActeEtatCivil-V1.A.xsd'
@@ -69,9 +69,9 @@ def setup(db):
@pytest.fixture(
params=[
- json_loads(get_file_from_test_base_dir('formdata_aec_naiss.json')),
- json_loads(get_file_from_test_base_dir('formdata_aec_mariage.json')),
- json_loads(get_file_from_test_base_dir('formdata_aec_deces.json')),
+ json.loads(get_file_from_test_base_dir('formdata_aec_naiss.json')),
+ json.loads(get_file_from_test_base_dir('formdata_aec_mariage.json')),
+ json.loads(get_file_from_test_base_dir('formdata_aec_deces.json')),
],
ids=['naissance', 'mariage', 'deces'],
)
@@ -79,7 +79,7 @@ def aec_payload(request):
return request.param
-ILE_PAYLOAD = json_loads(get_file_from_test_base_dir('formdata.json'))
+ILE_PAYLOAD = json.loads(get_file_from_test_base_dir('formdata.json'))
def test_message():
@@ -344,7 +344,7 @@ def test_create_aec_demand_with_input_sftp(app, setup, aec_payload, sftpserver):
def test_create_aec_demand_type_without_date_acte(app, setup):
- payload = json_loads(get_file_from_test_base_dir('formdata_aec_deces.json'))
+ payload = json.loads(get_file_from_test_base_dir('formdata_aec_deces.json'))
payload['fields'].pop('date_acte')
resp = app.post_json('/mdel/test/create', params=payload, status=200)
assert resp.json['err_desc'] == ' is required'
@@ -506,13 +506,13 @@ def test_create_ile_demand_type(app, setup):
def test_create_ile_demand_type_invalid_document_proof(app, setup):
# test with missing key
- payload = json_loads(get_file_from_test_base_dir('formdata.json'))
+ payload = json.loads(get_file_from_test_base_dir('formdata.json'))
payload['fields'].pop('justificatif_domicile_hebergeur')
resp = app.post_json('/mdel/test/create', params=payload, status=200)
assert resp.json['err_desc'] == 'justificatif_domicile and all its attributes are required'
# test with invalid content
- payload = json_loads(get_file_from_test_base_dir('formdata.json'))
+ payload = json.loads(get_file_from_test_base_dir('formdata.json'))
payload['fields']['justificatif_identite'] = None
payload['fields']['justificatif_identite_verso'] = None
resp = app.post_json('/mdel/test/create', params=payload, status=200)
@@ -658,7 +658,7 @@ def test_date_parsing():
def test_aec_filenames_and_routing(app, setup):
- aec_payload = json_loads(get_file_from_test_base_dir('formdata_aec_naiss.json'))
+ aec_payload = json.loads(get_file_from_test_base_dir('formdata_aec_naiss.json'))
resp = app.post_json('/mdel/test/create', params=aec_payload, status=200)
assert resp.json['data']['demand_id'] == '15-4-AEC-LA'
diff --git a/tests/test_misc.py b/tests/test_misc.py
index 4dd6311d..95bf7a25 100644
--- a/tests/test_misc.py
+++ b/tests/test_misc.py
@@ -1,4 +1,5 @@
import datetime
+from io import StringIO
import mock
import pytest
@@ -8,7 +9,6 @@ from django.db import connection
from django.db.migrations.executor import MigrationExecutor
from django.urls import reverse
from django.utils import timezone
-from django.utils.six import StringIO
from mock import patch
from requests.exceptions import ReadTimeout
diff --git a/tests/test_nancypoll.py b/tests/test_nancypoll.py
index f70afb35..c14fa330 100644
--- a/tests/test_nancypoll.py
+++ b/tests/test_nancypoll.py
@@ -1,12 +1,13 @@
+import json
+from io import StringIO
+
import pytest
from django.contrib.contenttypes.models import ContentType
from django.core.files import File
from django.test import Client
from django.urls import reverse
-from django.utils.six import StringIO
from passerelle.base.models import AccessRight, ApiUser
-from passerelle.compat import json_loads
from passerelle.contrib.nancypoll.models import NancyPoll
data = """
@@ -30,7 +31,7 @@ data = """
def parse_response(response):
- return json_loads(response.content)['data']
+ return json.loads(response.content)['data']
@pytest.fixture
@@ -50,7 +51,7 @@ def setup(db):
def test_failure(setup):
url, client = setup
qs = {'street_no': '37000', 'street_name': 'Rue du Marechal Juin'}
- resp = json_loads(client.get(url, qs).content)
+ resp = json.loads(client.get(url, qs).content)
assert resp['err_desc'] == 'Polling Station Not Found'
assert int(resp['err']) != 0
@@ -60,8 +61,8 @@ def test_no_params(setup):
qs = {}
resp = client.get(url, qs)
assert resp.status_code == 200
- assert json_loads(resp.content)['err_desc'] == 'All parameters are required'
- assert int(json_loads(resp.content)['err']) != 0
+ assert json.loads(resp.content)['err_desc'] == 'All parameters are required'
+ assert int(json.loads(resp.content)['err']) != 0
def test_invalid_street_no(setup):
@@ -69,8 +70,8 @@ def test_invalid_street_no(setup):
qs = {'street_no': 'lol', 'street_name': 'whatever'}
resp = client.get(url, qs)
assert resp.status_code == 200
- assert json_loads(resp.content)['err_desc'] == 'Invalid street no value'
- assert int(json_loads(resp.content)['err']) != 0
+ assert json.loads(resp.content)['err_desc'] == 'Invalid street no value'
+ assert int(json.loads(resp.content)['err']) != 0
def test_success_i_side(setup):
diff --git a/tests/test_proxylogger.py b/tests/test_proxylogger.py
index 697ec366..c8205b1e 100644
--- a/tests/test_proxylogger.py
+++ b/tests/test_proxylogger.py
@@ -8,7 +8,6 @@ import pytest
import requests
from django.core.exceptions import ValidationError
from django.utils.log import AdminEmailHandler
-from django.utils.six import PY2
from httmock import HTTMock
import tests.utils
@@ -315,10 +314,7 @@ def test_logged_requests_and_responses_max_size(app, db, monkeypatch, settings):
assert not ResourceLog.objects.all()[1].extra.get('response_content')
# - connector error
- if PY2:
- assert ResourceLog.objects.all()[2].extra['body'] == "'user_query_var=11111111111111111111'"
- else:
- assert ResourceLog.objects.all()[2].extra['body'] == 'user_query_var=11111111111111111111'
+ assert ResourceLog.objects.all()[2].extra['body'] == 'user_query_var=11111111111111111111'
assert (
ResourceLog.objects.all()[2].extra['exception'] == "{'connector_error_var': '44444444444444444444'}"
)
@@ -334,16 +330,10 @@ def test_logged_requests_and_responses_max_size(app, db, monkeypatch, settings):
# - connector POST queries
assert ResourceLog.objects.all()[1].extra['request_payload'] == "connector_query_var=22222222222222222222"
assert ResourceLog.objects.all()[1].extra.get('response_headers') == {'Content-Type': 'foo/bar'}
- if PY2:
- assert (
- ResourceLog.objects.all()[1].extra.get('response_content')
- == '{"service_reply_var": "33333333333333333333"}'
- )
- else:
- assert (
- ResourceLog.objects.all()[1].extra.get('response_content')
- == '{"service_reply_var": "33333333333333333333"}'
- )
+ assert (
+ ResourceLog.objects.all()[1].extra.get('response_content')
+ == '{"service_reply_var": "33333333333333333333"}'
+ )
# log troncated payloads
parameters = connector.logging_parameters
@@ -361,10 +351,7 @@ def test_logged_requests_and_responses_max_size(app, db, monkeypatch, settings):
assert ResourceLog.objects.all()[1].extra['request_payload'] == 'connector_query_var=22222'
# - connector error
- if PY2:
- assert ResourceLog.objects.all()[2].extra['body'] == "'user_query_var=1111111111'"
- else:
- assert ResourceLog.objects.all()[2].extra['body'] == 'user_query_var=1111111111'
+ assert ResourceLog.objects.all()[2].extra['body'] == 'user_query_var=1111111111'
# log troncated service response
parameters = connector.logging_parameters
@@ -376,10 +363,7 @@ def test_logged_requests_and_responses_max_size(app, db, monkeypatch, settings):
assert len(ResourceLog.objects.all()) == 3
# - connector POST queries
- if PY2:
- assert ResourceLog.objects.all()[1].extra.get('response_content') == '{"service_reply_var": "33'
- else:
- assert ResourceLog.objects.all()[1].extra.get('response_content') == '{"service_reply_var": "33'
+ assert ResourceLog.objects.all()[1].extra.get('response_content') == '{"service_reply_var": "33'
def test_proxy_logger_email_traceback(app, db, email_handler, settings, mailoutbox, connector, monkeypatch):
diff --git a/tests/test_sector.py b/tests/test_sector.py
index 28ba3111..8a12c675 100644
--- a/tests/test_sector.py
+++ b/tests/test_sector.py
@@ -16,6 +16,7 @@
import datetime
import os
+from io import StringIO
from posix import stat_result
from stat import ST_MTIME
@@ -26,7 +27,6 @@ from django.core.files import File
from django.core.management import call_command
from django.urls import reverse
from django.utils.encoding import force_str, force_text
-from django.utils.six import StringIO
from django.utils.timezone import now
import tests.utils
diff --git a/tests/test_solis.py b/tests/test_solis.py
index 582273b7..abfaf5a8 100644
--- a/tests/test_solis.py
+++ b/tests/test_solis.py
@@ -1,10 +1,11 @@
# -*- coding: utf-8 -*-
+from io import StringIO
+
import mock
import pytest
from django.contrib.contenttypes.models import ContentType
from django.core.files import File
-from django.utils.six import StringIO
import tests.utils
from passerelle.apps.solis.models import Solis, SolisAPALink, SolisRSALink, unflat
diff --git a/tests/test_templatetags.py b/tests/test_templatetags.py
index 9ba28f06..a2a0a8c8 100644
--- a/tests/test_templatetags.py
+++ b/tests/test_templatetags.py
@@ -17,7 +17,7 @@
import inspect
from django.apps import apps
-from django.utils import six, translation
+from django.utils import translation
from passerelle.base.templatetags.passerelle import render_body_schemas, render_json_schema
@@ -25,7 +25,6 @@ from passerelle.base.templatetags.passerelle import render_body_schemas, render_
def test_render_body_schemas(db):
# FIXME: db should be required but the way ProxyLogger is initialized force an access to the DB
def collect_schemas():
- predicate = inspect.isfunction if six.PY3 else inspect.ismethod
for app in apps.get_app_configs():
connector_model = None
if not hasattr(app, 'get_connector_model'):
@@ -33,7 +32,7 @@ def test_render_body_schemas(db):
connector_model = app.get_connector_model()
if connector_model is None:
continue
- for _, method in inspect.getmembers(connector_model, predicate):
+ for _, method in inspect.getmembers(connector_model, inspect.isfunction):
if not hasattr(method, 'endpoint_info'):
continue
if method.endpoint_info.post and method.endpoint_info.post.get('request_body', {}).get(
diff --git a/tests/utils.py b/tests/utils.py
index 2ef9d3e7..46637cbe 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -7,7 +7,6 @@ from django.contrib.contenttypes.models import ContentType
from django.urls import reverse
from passerelle.base.models import AccessRight, ApiUser
-from passerelle.compat import json_loads
def generic_endpoint_url(connector, endpoint, slug='test'):
@@ -25,7 +24,7 @@ class FakedResponse(mock.Mock):
headers = {}
def json(self):
- return json_loads(self.content)
+ return json.loads(self.content)
def mock_url(url=None, response='', status_code=200, headers=None, reason=None, exception=None, qs=None):
diff --git a/tests/wcs/conftest.py b/tests/wcs/conftest.py
index 4be8621f..099c7761 100644
--- a/tests/wcs/conftest.py
+++ b/tests/wcs/conftest.py
@@ -16,6 +16,7 @@
# along with this program. If not, see .
+import configparser
import contextlib
import os
import pickle
@@ -29,7 +30,6 @@ import time
import httmock
import psycopg2
import pytest
-from django.utils.six.moves import configparser as ConfigParser
def find_free_tcp_port():
@@ -157,7 +157,7 @@ class WcsHost(object):
@property
@contextlib.contextmanager
def site_options(self):
- config = ConfigParser.ConfigParser()
+ config = configparser.ConfigParser()
site_options_path = os.path.join(self.app_dir, 'site-options.cfg')
if os.path.exists(site_options_path):