misc: remove usage of "six" module (#63682)

This commit is contained in:
Valentin Deniaud 2022-04-20 12:18:04 +02:00
parent add77fa39a
commit 347944babf
79 changed files with 206 additions and 320 deletions

View File

@ -1,10 +1,10 @@
import base64 import base64
import hashlib import hashlib
import os import os
import urllib.parse
import pytest import pytest
import requests import requests
from django.utils.six.moves.urllib import parse as urlparse
SPECIAL_CHARS = '!#$%&+-^_`;[]{}+=' SPECIAL_CHARS = '!#$%&+-^_`;[]{}+='
@ -25,7 +25,7 @@ def test_uploadfile(cmisclient, cmis_connector, cmis_tmpdir, tmpdir, monkeypatch
orig_file = tmpdir.join(file_name) orig_file = tmpdir.join(file_name)
with orig_file.open('wb') as f: with orig_file.open('wb') as f:
f.write(os.urandom(1024)) 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: with orig_file.open('rb') as f:
file_b64_content = base64.b64encode(f.read()) file_b64_content = base64.b64encode(f.read())
response = requests.post( 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): 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') file_b64_content = base64.b64encode('file_content')
response = requests.post( response = requests.post(
url, url,

View File

@ -1,13 +1,13 @@
import pprint import pprint
import random import random
import urllib.parse
import requests import requests
from django.utils.six.moves.urllib import parse
def test_main(conn): def test_main(conn):
# get days # 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'} {'start_days': 1, 'end_days': 90, 'start_time': '10:00', 'end_time': '11:00', 'display': 'date'}
) )
url = conn + '/getfreegaps?%s' % query_string url = conn + '/getfreegaps?%s' % query_string
@ -19,7 +19,7 @@ def test_main(conn):
assert data assert data
# get places # 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'} {'start_days': 1, 'end_days': 90, 'start_time': '10:00', 'end_time': '11:00', 'display': 'place'}
) )
url = conn + '/getfreegaps?%s' % query_string url = conn + '/getfreegaps?%s' % query_string
@ -32,7 +32,7 @@ def test_main(conn):
place = data[random.randint(0, len(data) - 1)]['id'] place = data[random.randint(0, len(data) - 1)]['id']
# get days on one place # get days on one place
query_string = parse.urlencode( query_string = urllib.parse.urlencode(
{ {
'start_days': 1, 'start_days': 1,
'end_days': 90, 'end_days': 90,

View File

@ -16,6 +16,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import contextlib import contextlib
import json
import os import os
import stat import stat
import tempfile import tempfile
@ -28,7 +29,6 @@ from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
from passerelle.utils.conversion import ensure_encoding from passerelle.utils.conversion import ensure_encoding
from passerelle.utils.jsonresponse import APIError from passerelle.utils.jsonresponse import APIError
@ -53,7 +53,7 @@ class ActesWeb(BaseResource):
@endpoint(perm='can_access', methods=['post'], description=_('Create demand')) @endpoint(perm='can_access', methods=['post'], description=_('Create demand'))
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
try: try:
payload = json_loads(request.body) payload = json.loads(request.body)
except (ValueError,): except (ValueError,):
raise APIError('Invalid payload format: json expected') raise APIError('Invalid payload format: json expected')

View File

@ -18,6 +18,8 @@
https://entreprise.api.gouv.fr https://entreprise.api.gouv.fr
''' '''
import urllib.parse
import requests import requests
from django.core import signing from django.core import signing
from django.db import models from django.db import models
@ -25,7 +27,6 @@ from django.http import Http404, HttpResponse
from django.urls import reverse from django.urls import reverse
from django.utils.timezone import datetime, make_aware, timedelta from django.utils.timezone import datetime, make_aware, timedelta
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from six.moves.urllib_parse import urljoin
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
@ -97,7 +98,7 @@ class APIEntreprise(BaseResource):
params['recipient'] = kwargs.get('recipient') or self.recipient params['recipient'] = kwargs.get('recipient') or self.recipient
if kwargs.get('non_diffusables'): if kwargs.get('non_diffusables'):
params['non_diffusables'] = 'true' params['non_diffusables'] = 'true'
url = urljoin(self.url, path) url = urllib.parse.urljoin(self.url, path)
try: try:
response = self.requests.get(url, data=params, cache_duration=300) response = self.requests.get(url, data=params, cache_duration=300)
except requests.RequestException as e: except requests.RequestException as e:

View File

@ -32,7 +32,6 @@ except ImportError:
from django.contrib.postgres.fields import ArrayField from django.contrib.postgres.fields import ArrayField
from django.core.cache import cache from django.core.cache import cache
from django.db import models from django.db import models
from django.utils import six
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
@ -96,7 +95,7 @@ class APIParticulier(BaseResource):
data={ data={
'code': 'connection-error', 'code': 'connection-error',
'platform': self.platform, 'platform': self.platform,
'error': six.text_type(e), 'error': str(e),
}, },
) )
try: try:
@ -110,7 +109,7 @@ class APIParticulier(BaseResource):
data={ data={
'code': 'non-json', 'code': 'non-json',
'status_code': response.status_code, 'status_code': response.status_code,
'exception': six.text_type(e), 'exception': str(e),
'platform': self.platform, 'platform': self.platform,
'content': content, 'content': content,
}, },

View File

@ -18,7 +18,7 @@ import json
from urllib import parse as urlparse from urllib import parse as urlparse
from django.db import models 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.dateparse import parse_date, parse_time
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from requests import RequestException from requests import RequestException
@ -67,7 +67,7 @@ class ArpegeECP(BaseResource):
if result.get('Data'): if result.get('Data'):
if 'AccessToken' not in result['Data']: if 'AccessToken' not in result['Data']:
raise APIError('Error on LoginParSubOIDC: missing Data/AccessToken') 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') raise APIError('Error on LoginParSubOIDC: Data/AccessToken is not string')
return result['Data']['AccessToken'] return result['Data']['AccessToken']
raise APIError('%s (%s)' % (result.get('LibErreur'), result.get('CodErreur'))) raise APIError('%s (%s)' % (result.get('LibErreur'), result.get('CodErreur')))

View File

@ -21,7 +21,6 @@ from urllib import parse as urlparse
import requests import requests
from django.contrib.postgres.fields import JSONField from django.contrib.postgres.fields import JSONField
from django.db import models from django.db import models
from django.utils import six
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource, HTTPResource from passerelle.base.models import BaseResource, HTTPResource
@ -73,11 +72,11 @@ class Resource(BaseResource, HTTPResource):
response = self.requests.get(url, *args, **kwargs) response = self.requests.get(url, *args, **kwargs)
response.raise_for_status() response.raise_for_status()
except requests.RequestException as e: 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: try:
root = ET.fromstring(response.content) root = ET.fromstring(response.content)
except ET.ParseError as e: 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': if root.tag != 'return':
raise APIError('root XML node is not return', data={'content': response.text[:1024]}) raise APIError('root XML node is not return', data={'content': response.text[:1024]})
return root, response return root, response

View File

@ -3,7 +3,6 @@ from contextlib import contextmanager
from django.core.cache import cache from django.core.cache import cache
from django.db import transaction from django.db import transaction
from django.utils import six
from passerelle.utils.jsonresponse import APIError from passerelle.utils.jsonresponse import APIError
@ -43,7 +42,7 @@ class RowLockedCache:
if self.row: if self.row:
keys.append(str(self.row.pk)) keys.append(str(self.row.pk))
for arg in args: for arg in args:
if isinstance(arg, six.string_types): if isinstance(arg, str):
keys.append(arg) keys.append(arg)
else: else:
keys.append(hash(arg)) keys.append(hash(arg))

View File

@ -1,18 +1,18 @@
import datetime import datetime
import gzip import gzip
import json
from io import StringIO
from urllib import parse as urlparse from urllib import parse as urlparse
from django.contrib.postgres.fields import JSONField from django.contrib.postgres.fields import JSONField
from django.db import connection, models from django.db import connection, models
from django.db.models import Q 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.http import urlencode
from django.utils.six import StringIO
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from requests import RequestException from requests import RequestException
from passerelle.address.models import AddressResource from passerelle.address.models import AddressResource
from passerelle.compat import json_loads
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
from passerelle.utils.conversion import simplify from passerelle.utils.conversion import simplify
from passerelle.utils.jsonresponse import APIError from passerelle.utils.jsonresponse import APIError
@ -452,13 +452,10 @@ class BaseAdresse(AddressResource):
if ban_gz.status_code != 200: if ban_gz.status_code != 200:
continue continue
if six.PY3: ban_file = StringIO(gzip.decompress(ban_gz.content).decode('utf-8'))
ban_file = StringIO(gzip.decompress(ban_gz.content).decode('utf-8'))
else:
ban_file = gzip.GzipFile(fileobj=StringIO(ban_gz.content))
line = _not_found = object() line = _not_found = object()
for line in ban_file: for line in ban_file:
street_info = json_loads(line) street_info = json.loads(line)
if street_info['type'] != 'street': if street_info['type'] != 'street':
continue continue
ban_id = street_info.get('id') ban_id = street_info.get('id')
@ -466,7 +463,7 @@ class BaseAdresse(AddressResource):
continue continue
for key in ('postcode', 'name', 'city'): for key in ('postcode', 'name', 'city'):
if isinstance(street_info[key], list): 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): if not street_info['postcode'] or not street_info['postcode'].startswith(zipcodes):
continue continue
citycode = ban_id.split('_', 1)[0] citycode = ban_id.split('_', 1)[0]
@ -580,7 +577,6 @@ class UnaccentNameMixin:
super().save(*args, **kwargs) super().save(*args, **kwargs)
@six.python_2_unicode_compatible
class StreetModel(UnaccentNameMixin, models.Model): class StreetModel(UnaccentNameMixin, models.Model):
ban_id = models.CharField(_('BAN Identifier'), max_length=32, blank=True) ban_id = models.CharField(_('BAN Identifier'), max_length=32, blank=True)
@ -601,7 +597,6 @@ class StreetModel(UnaccentNameMixin, models.Model):
return self.name return self.name
@six.python_2_unicode_compatible
class RegionModel(UnaccentNameMixin, models.Model): class RegionModel(UnaccentNameMixin, models.Model):
name = models.CharField(_('Region name'), max_length=150) name = models.CharField(_('Region name'), max_length=150)
@ -627,7 +622,6 @@ class RegionModel(UnaccentNameMixin, models.Model):
return '%s %s' % (self.code, self.name) return '%s %s' % (self.code, self.name)
@six.python_2_unicode_compatible
class DepartmentModel(UnaccentNameMixin, models.Model): class DepartmentModel(UnaccentNameMixin, models.Model):
name = models.CharField(_('Department name'), max_length=100) name = models.CharField(_('Department name'), max_length=100)
@ -656,7 +650,6 @@ class DepartmentModel(UnaccentNameMixin, models.Model):
return '%s %s' % (self.code, self.name) return '%s %s' % (self.code, self.name)
@six.python_2_unicode_compatible
class CityModel(UnaccentNameMixin, models.Model): class CityModel(UnaccentNameMixin, models.Model):
name = models.CharField(_('City name'), max_length=150) name = models.CharField(_('City name'), max_length=150)

View File

@ -1,9 +1,10 @@
import json
from django.http import Http404 from django.http import Http404
from django.views.generic.base import View from django.views.generic.base import View
from django.views.generic.detail import DetailView, SingleObjectMixin from django.views.generic.detail import DetailView, SingleObjectMixin
from passerelle import utils from passerelle import utils
from passerelle.compat import json_loads
from .models import Bdp from .models import Bdp
@ -40,7 +41,7 @@ class PostAdherentView(View, SingleObjectMixin):
@utils.protected_api('can_access') @utils.protected_api('can_access')
@utils.to_json() @utils.to_json()
def post(self, request, *args, **kwargs): 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') date_de_naissance = data['fields'].get('date_de_naissance')
# force 1973-04-18T00:00:00Z # force 1973-04-18T00:00:00Z
date_de_naissance = date_de_naissance[:10] + 'T00:00:00Z' date_de_naissance = date_de_naissance[:10] + 'T00:00:00Z'

View File

@ -3,7 +3,6 @@ import json
import requests import requests
from django.db import models from django.db import models
from django.utils.six import string_types
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.sms.models import SMSResource from passerelle.sms.models import SMSResource
@ -95,6 +94,6 @@ class ChoositSMSGateway(SMSResource):
results.append('Choosit error: %s' % output['error']) results.append('Choosit error: %s' % output['error'])
else: else:
results.append(output) 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))) raise APIError('Choosit error: some destinations failed', data=list(zip(destinations, results)))
# credit consumed is unknown # credit consumed is unknown

View File

@ -18,7 +18,6 @@ import os
import stat import stat
from django.core.files.storage import default_storage from django.core.files.storage import default_storage
from django.utils import six
from django.utils.dateparse import parse_date from django.utils.dateparse import parse_date
from django.utils.encoding import force_bytes from django.utils.encoding import force_bytes
from lxml import etree from lxml import etree
@ -86,7 +85,7 @@ class BaseType:
attr = getattr(self, subelt, None) attr = getattr(self, subelt, None)
if not attr: if not attr:
continue continue
if isinstance(attr, six.string_types): if isinstance(attr, str):
tag.append(self.make_element(subelt, attr, namespace=self.namespace)) tag.append(self.make_element(subelt, attr, namespace=self.namespace))
else: else:
xml = attr.xml xml = attr.xml

View File

@ -14,13 +14,13 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import json
import os import os
from django.core.files.storage import default_storage from django.core.files.storage import default_storage
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
from passerelle.utils.jsonresponse import APIError from passerelle.utils.jsonresponse import APIError
@ -47,7 +47,7 @@ class CityWeb(BaseResource):
@endpoint(perm='can_access', methods=['post'], description=_('Create a demand')) @endpoint(perm='can_access', methods=['post'], description=_('Create a demand'))
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
payload = json_loads(request.body) payload = json.loads(request.body)
# check mandatory keys # check mandatory keys
for key in ('application_id', 'application_time', 'certificate_type'): for key in ('application_id', 'application_time', 'certificate_type'):
if key not in payload: if key not in payload:

View File

@ -1,9 +1,10 @@
import json
from django.views.generic.base import View from django.views.generic.base import View
from django.views.generic.detail import DetailView, SingleObjectMixin from django.views.generic.detail import DetailView, SingleObjectMixin
from passerelle import utils from passerelle import utils
from passerelle.apps.clicrdv.models import ClicRdv from passerelle.apps.clicrdv.models import ClicRdv
from passerelle.compat import json_loads
class ClicRdvDetailView(DetailView): class ClicRdvDetailView(DetailView):
@ -87,7 +88,7 @@ class CreateAppointmentView(View, SingleObjectMixin):
def post(self, request, intervention_id=None, *args, **kwargs): def post(self, request, intervention_id=None, *args, **kwargs):
if intervention_id is None: if intervention_id is None:
intervention_id = self.request.GET.get('intervention') intervention_id = self.request.GET.get('intervention')
data = json_loads(request.body) data = json.loads(request.body)
return { return {
'data': self.get_object().create_appointment( 'data': self.get_object().create_appointment(
intervention_id, self.request.GET.get('websource'), data intervention_id, self.request.GET.get('websource'), data

View File

@ -19,6 +19,7 @@ import binascii
import functools import functools
import re import re
from contextlib import contextmanager from contextlib import contextmanager
from io import BytesIO
from urllib import error as urllib2 from urllib import error as urllib2
import httplib2 import httplib2
@ -32,7 +33,6 @@ from cmislib.exceptions import (
) )
from django.db import models from django.db import models
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.utils.six import BytesIO
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource

View File

@ -24,7 +24,6 @@ import tempfile
from collections import OrderedDict from collections import OrderedDict
import pytz import pytz
import six
from django.conf import settings from django.conf import settings
from django.contrib.postgres.fields import JSONField from django.contrib.postgres.fields import JSONField
from django.contrib.postgres.indexes import GinIndex from django.contrib.postgres.indexes import GinIndex
@ -231,7 +230,7 @@ class CsvDataSource(BaseResource):
options = {} options = {}
for k, v in self._dialect_options.items(): for k, v in self._dialect_options.items():
if isinstance(v, six.text_type): if isinstance(v, str):
v = force_str(v.encode('ascii')) v = force_str(v.encode('ascii'))
options[force_str(k.encode('ascii'))] = v options[force_str(k.encode('ascii'))] = v

View File

@ -16,10 +16,10 @@
import csv import csv
import datetime import datetime
import io
from decimal import Decimal from decimal import Decimal
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils import six
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -41,11 +41,8 @@ class Loader:
def load(self, archive): def load(self, archive):
archive_files = archive.namelist() archive_files = archive.namelist()
fd = archive.open('data_full.csv') fd = archive.open('data_full.csv')
if six.PY3: fd = io.TextIOWrapper(fd, 'iso-8859-15')
import io csvfile = io.StringIO(fd.read())
fd = io.TextIOWrapper(fd, 'iso-8859-15')
csvfile = six.StringIO(fd.read())
csvreader = csv.reader(csvfile, delimiter='\t') csvreader = csv.reader(csvfile, delimiter='\t')
first_row = next(csvreader) first_row = next(csvreader)
csvfile.seek(0) csvfile.seek(0)

View File

@ -15,12 +15,13 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import csv import csv
import io
import os import os
from decimal import Decimal from decimal import Decimal
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.files.storage import DefaultStorage 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.encoding import force_text
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -123,10 +124,7 @@ class Loader:
def csvread(self, filename): def csvread(self, filename):
fd = self.archive.open(filename) fd = self.archive.open(filename)
if six.PY3: fd = io.TextIOWrapper(fd, 'iso-8859-15')
import io
fd = io.TextIOWrapper(fd, 'iso-8859-15')
reader = csv.reader(fd, Dialect) reader = csv.reader(fd, Dialect)
# pylint: disable=stop-iteration-return # pylint: disable=stop-iteration-return

View File

@ -16,10 +16,10 @@
import csv import csv
import datetime import datetime
import io
from decimal import Decimal from decimal import Decimal
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils import six
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -41,11 +41,8 @@ class Loader:
def load(self, archive): def load(self, archive):
archive_files = archive.namelist() archive_files = archive.namelist()
fd = archive.open('publipostage.csv') fd = archive.open('publipostage.csv')
if six.PY3: fd = io.TextIOWrapper(fd, 'iso-8859-15')
import io csvfile = io.StringIO(fd.read())
fd = io.TextIOWrapper(fd, 'iso-8859-15')
csvfile = six.StringIO(fd.read())
csvreader = csv.reader(csvfile, delimiter=';') csvreader = csv.reader(csvfile, delimiter=';')
first_row = next(csvreader) first_row = next(csvreader)
csvfile.seek(0) csvfile.seek(0)

View File

@ -16,6 +16,7 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import json
import os import os
import sys import sys
import zipfile import zipfile
@ -27,12 +28,10 @@ from django.core.exceptions import ValidationError
from django.core.files.storage import default_storage from django.core.files.storage import default_storage
from django.db import models, transaction from django.db import models, transaction
from django.http import Http404, HttpResponse from django.http import Http404, HttpResponse
from django.utils import six
from django.utils.timezone import datetime, make_aware, now from django.utils.timezone import datetime, make_aware, now
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
SEXES = ( SEXES = (
@ -212,7 +211,7 @@ class GenericFamily(BaseResource):
adults = [] adults = []
for f in family_files: for f in family_files:
family_data = json_loads(archive.read(f)) family_data = json.loads(archive.read(f))
families.append(family_data['id']) families.append(family_data['id'])
address = family_data.get('address') or {} address = family_data.get('address') or {}
family_data.update(address) family_data.update(address)
@ -403,7 +402,7 @@ class GenericFamily(BaseResource):
name='regie', methods=['post'], perm='can_access', pattern=r'^invoice/(?P<invoice_id>\w+)/pay/$' name='regie', methods=['post'], perm='can_access', pattern=r'^invoice/(?P<invoice_id>\w+)/pay/$'
) )
def pay_invoice(self, request, invoice_id, **kwargs): def pay_invoice(self, request, invoice_id, **kwargs):
data = json_loads(request.body) data = json.loads(request.body)
invoice = self.get_invoice(invoice_id) invoice = self.get_invoice(invoice_id)
if not invoice: if not invoice:
return {'data': False} return {'data': False}
@ -454,7 +453,6 @@ class Family(models.Model):
return self.external_id return self.external_id
@six.python_2_unicode_compatible
class Person(models.Model): class Person(models.Model):
family = models.ForeignKey('Family', on_delete=models.CASCADE) family = models.ForeignKey('Family', on_delete=models.CASCADE)
external_id = models.CharField(_('Person\'s external id'), max_length=32, db_index=True) external_id = models.CharField(_('Person\'s external id'), max_length=32, db_index=True)

View File

@ -15,12 +15,13 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import json
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.views.generic.base import View from django.views.generic.base import View
from django.views.generic.detail import DetailView, SingleObjectMixin from django.views.generic.detail import DetailView, SingleObjectMixin
from passerelle import utils from passerelle import utils
from passerelle.compat import json_loads
from passerelle.utils.conversion import normalize from passerelle.utils.conversion import normalize
from .models import Gdc, phpserialize, phpserialize_loads from .models import Gdc, phpserialize, phpserialize_loads
@ -132,7 +133,7 @@ class PostDemandeView(View, SingleObjectMixin):
# <wsdl:part name='voie_id' type='xsd:string'></wsdl:part> # <wsdl:part name='voie_id' type='xsd:string'></wsdl:part>
# <wsdl:part name='voie_num' type='xsd:string'></wsdl:part> # <wsdl:part name='voie_num' type='xsd:string'></wsdl:part>
# </wsdl:message> # </wsdl:message>
data = json_loads(request.body) data = json.loads(request.body)
voie_id = data['fields'].get('voie_raw') voie_id = data['fields'].get('voie_raw')
voie_str = data['fields'].get('voie') voie_str = data['fields'].get('voie')
insee = data['fields'].get('commune_raw') insee = data['fields'].get('commune_raw')

View File

@ -21,8 +21,6 @@ from collections import OrderedDict
from django.contrib.postgres.fields import JSONField from django.contrib.postgres.fields import JSONField
from django.db import IntegrityError, models, transaction from django.db import IntegrityError, models, transaction
from django.http import Http404 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 django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
@ -239,10 +237,7 @@ class Gesbac(BaseResource):
if not csv_file.startswith(self.input_files_prefix): if not csv_file.startswith(self.input_files_prefix):
continue continue
with client.open(csv_file, 'rb') as fd: with client.open(csv_file, 'rb') as fd:
if six.PY3: content = io.TextIOWrapper(fd, encoding=FILES_ENCODING)
content = io.TextIOWrapper(fd, encoding=FILES_ENCODING)
else:
content = io.BytesIO(force_bytes(fd.read().decode(FILES_ENCODING)))
for row in csv.reader(content, delimiter=CSV_DELIMITER): for row in csv.reader(content, delimiter=CSV_DELIMITER):
data.append(row) data.append(row)
for card_data in data: for card_data in data:
@ -357,16 +352,9 @@ class Form(models.Model):
def send(self): def send(self):
with self.resource.outcoming_sftp.client() as client: with self.resource.outcoming_sftp.client() as client:
with client.open(self.get_filename(), mode='wb') as fd: 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) writer = csv.writer(fd, delimiter=CSV_DELIMITER)
for row in self.demand_data: 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) writer.writerow(row)
self.status = 'sent' self.status = 'sent'
self.save() self.save()

View File

@ -14,6 +14,7 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import json
import uuid import uuid
from django.contrib.postgres.fields import JSONField 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 django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.utils.api import APIError, endpoint from passerelle.utils.api import APIError, endpoint
from passerelle.utils.conversion import simplify from passerelle.utils.conversion import simplify
@ -33,7 +33,7 @@ def get_hex_uuid():
def clean_json_data(data): def clean_json_data(data):
try: try:
payload = json_loads(data) payload = json.loads(data)
if not isinstance(payload, dict): if not isinstance(payload, dict):
raise APIError('payload must be a dict') raise APIError('payload must be a dict')
return payload return payload

View File

@ -15,14 +15,13 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import json
import os import os
from django.db import models from django.db import models
from django.utils import six
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.utils import SFTPField from passerelle.utils import SFTPField
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
from passerelle.utils.files import atomic_write from passerelle.utils.files import atomic_write
@ -93,7 +92,7 @@ class MDEL(BaseResource):
@endpoint(perm='can_access', methods=['post']) @endpoint(perm='can_access', methods=['post'])
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
"""Create a demand""" """Create a demand"""
formdata = json_loads(request.body) formdata = json.loads(request.body)
extra = formdata.pop('extra', {}) extra = formdata.pop('extra', {})
fields = formdata.pop('fields', {}) fields = formdata.pop('fields', {})
@ -193,7 +192,6 @@ class MDEL(BaseResource):
self.get_response_files() self.get_response_files()
@six.python_2_unicode_compatible
class Demand(models.Model): class Demand(models.Model):
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True) updated_at = models.DateTimeField(auto_now=True)

View File

@ -28,7 +28,7 @@ from django.contrib.postgres.fields import JSONField
from django.db import IntegrityError, models, transaction from django.db import IntegrityError, models, transaction
from django.http import HttpResponse from django.http import HttpResponse
from django.urls import reverse 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 django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource, SkipJob from passerelle.base.models import BaseResource, SkipJob
@ -214,7 +214,6 @@ class Resource(BaseResource):
return return
@six.python_2_unicode_compatible
class Demand(models.Model): class Demand(models.Model):
STATUS_PENDING = 'pending' STATUS_PENDING = 'pending'
STATUS_PUSHED = 'pushed' STATUS_PUSHED = 'pushed'

View File

@ -19,7 +19,6 @@ from __future__ import unicode_literals
import xmlschema import xmlschema
from django.db import models from django.db import models
from django.utils import six
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
@ -117,7 +116,7 @@ class Resource(abstract.Resource):
else: else:
del d['filiationInconnu'] del d['filiationInconnu']
# convert codeNationalite to array of strings # convert codeNationalite to array of strings
if isinstance(d.get('codeNationalite'), six.text_type): if isinstance(d.get('codeNationalite'), str):
d['codeNationalite'] = [d['codeNationalite']] d['codeNationalite'] = [d['codeNationalite']]
for key in d: for key in d:
if key in ('anneeNaissance', 'jourNaissance', 'moisNaissance'): if key in ('anneeNaissance', 'jourNaissance', 'moisNaissance'):

View File

@ -22,7 +22,6 @@ from django.utils.http import urlencode
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
from passerelle.utils.jsonresponse import APIError from passerelle.utils.jsonresponse import APIError
@ -245,7 +244,7 @@ class Okina(BaseResource):
@endpoint(name='subscriber', methods=['post'], perm='can_access') @endpoint(name='subscriber', methods=['post'], perm='can_access')
def create_subscriber(self, request): def create_subscriber(self, request):
try: try:
payload = json_loads(request.body) payload = json.loads(request.body)
except ValueError: except ValueError:
raise APIError('payload must be a JSON object', http_status=400) raise APIError('payload must be a JSON object', http_status=400)
if not isinstance(payload, dict): if not isinstance(payload, dict):
@ -261,14 +260,14 @@ class Okina(BaseResource):
qrcode = self.request('subscribers/%s/qrcode' % subscriber_id, result_is_json=False) qrcode = self.request('subscribers/%s/qrcode' % subscriber_id, result_is_json=False)
content_type = qrcode.headers.get('Content-Type') content_type = qrcode.headers.get('Content-Type')
if not (content_type and content_type.startswith('image/')): 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']) raise APIError(response['message'], http_status=response['status'], err=response['code'])
return HttpResponse(qrcode.content, content_type=content_type) return HttpResponse(qrcode.content, content_type=content_type)
@endpoint(name='subscription', methods=['post'], perm='can_access') @endpoint(name='subscription', methods=['post'], perm='can_access')
def create_subscription(self, request): def create_subscription(self, request):
try: try:
payload = json_loads(request.body) payload = json.loads(request.body)
except ValueError: except ValueError:
raise APIError('payload must be a JSON object', http_status=400) raise APIError('payload must be a JSON object', http_status=400)
if not isinstance(payload, dict): if not isinstance(payload, dict):

View File

@ -19,7 +19,6 @@ import math
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
import pyproj import pyproj
import six
from django.contrib.postgres.fields import JSONField from django.contrib.postgres.fields import JSONField
from django.core.cache import cache from django.core.cache import cache
from django.db import models, transaction from django.db import models, transaction
@ -396,7 +395,7 @@ class OpenGIS(BaseResource):
for attribute, properties in self.attributes_mapping: for attribute, properties in self.attributes_mapping:
for field in properties: for field in properties:
if closest_feature['properties'].get(field): 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 break
return result return result
raise APIError('Unable to geocode') raise APIError('Unable to geocode')

View File

@ -14,6 +14,7 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import json
from urllib.parse import parse_qsl, urlsplit, urlunsplit from urllib.parse import parse_qsl, urlsplit, urlunsplit
from django.core.cache import cache from django.core.cache import cache
@ -24,7 +25,6 @@ from django.utils.translation import ugettext_lazy as _
from requests import RequestException from requests import RequestException
from passerelle.base.models import BaseQuery, BaseResource, HTTPResource from passerelle.base.models import BaseQuery, BaseResource, HTTPResource
from passerelle.compat import json_loads
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
from passerelle.utils.http_authenticators import HttpBearerAuth from passerelle.utils.http_authenticators import HttpBearerAuth
from passerelle.utils.json import unflatten from passerelle.utils.json import unflatten
@ -303,7 +303,7 @@ class PloneRestApi(BaseResource, HTTPResource):
) )
def create(self, request, uri, publish=False): def create(self, request, uri, publish=False):
try: try:
post_data = json_loads(request.body) post_data = json.loads(request.body)
except ValueError as e: except ValueError as e:
raise ParameterTypeError(str(e)) raise ParameterTypeError(str(e))
post_data = unflatten(post_data) post_data = unflatten(post_data)
@ -330,7 +330,7 @@ class PloneRestApi(BaseResource, HTTPResource):
) )
def update(self, request, uid, uri=''): def update(self, request, uid, uri=''):
try: try:
post_data = json_loads(request.body) post_data = json.loads(request.body)
except ValueError as e: except ValueError as e:
raise ParameterTypeError(str(e)) raise ParameterTypeError(str(e))
post_data = unflatten(post_data) post_data = unflatten(post_data)

View File

@ -16,6 +16,7 @@
import base64 import base64
import copy import copy
import json
from django.db import models from django.db import models
from django.template.loader import get_template 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 django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
from passerelle.utils.conversion import simplify, to_pdf from passerelle.utils.conversion import simplify, to_pdf
from passerelle.utils.jsonresponse import APIError from passerelle.utils.jsonresponse import APIError
@ -276,7 +276,7 @@ class Solis(BaseResource):
) )
def apa_link(self, request): def apa_link(self, request):
try: try:
data = json_loads(request.body) data = json.loads(request.body)
except ValueError: except ValueError:
raise APIError('payload is not a JSON dict') raise APIError('payload is not a JSON dict')
if not isinstance(data, dict): if not isinstance(data, dict):
@ -302,7 +302,7 @@ class Solis(BaseResource):
) )
def apa_unlink(self, request): def apa_unlink(self, request):
try: try:
data = json_loads(request.body) data = json.loads(request.body)
except ValueError: except ValueError:
raise APIError('payload is not a JSON dict') raise APIError('payload is not a JSON dict')
if not isinstance(data, dict): if not isinstance(data, dict):
@ -411,7 +411,7 @@ class Solis(BaseResource):
) )
def apa_integration(self, request): def apa_integration(self, request):
try: try:
payload = json_loads(request.body) payload = json.loads(request.body)
except ValueError: except ValueError:
raise APIError('payload is not a JSON object', http_status=400) raise APIError('payload is not a JSON object', http_status=400)
if not isinstance(payload, dict): if not isinstance(payload, dict):
@ -566,7 +566,7 @@ class Solis(BaseResource):
) )
def rsa_link(self, request): def rsa_link(self, request):
try: try:
data = json_loads(request.body) data = json.loads(request.body)
except ValueError: except ValueError:
raise APIError('payload is not a JSON dict') raise APIError('payload is not a JSON dict')
if not isinstance(data, dict): if not isinstance(data, dict):
@ -593,7 +593,7 @@ class Solis(BaseResource):
) )
def rsa_unlink(self, request): def rsa_unlink(self, request):
try: try:
data = json_loads(request.body) data = json.loads(request.body)
except ValueError: except ValueError:
raise APIError('payload is not a JSON dict') raise APIError('payload is not a JSON dict')
if not isinstance(data, dict): if not isinstance(data, dict):

View File

@ -28,7 +28,6 @@ from django.core.files import File
from django.db import models, transaction from django.db import models, transaction
from django.template import engines from django.template import engines
from django.urls import reverse from django.urls import reverse
from django.utils import six
from django.utils.translation import ugettext from django.utils.translation import ugettext
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from lxml import etree as ET from lxml import etree as ET
@ -77,8 +76,8 @@ def simplify(s):
'''Simplify XML node tag names because XSD from DGME are garbage''' '''Simplify XML node tag names because XSD from DGME are garbage'''
if not s: if not s:
return '' return ''
if not isinstance(s, six.text_type): if not isinstance(s, str):
s = six.text_type(s, 'utf-8', 'ignore') s = str(s, 'utf-8', 'ignore')
s = normalize(s) s = normalize(s)
s = re.sub(r'[^\w\s\'-_]', '', s) s = re.sub(r'[^\w\s\'-_]', '', s)
s = s.replace('-', '_') s = s.replace('-', '_')
@ -536,7 +535,6 @@ def default_rule():
return {} return {}
@six.python_2_unicode_compatible
class Mapping(models.Model): class Mapping(models.Model):
resource = models.ForeignKey( resource = models.ForeignKey(
Resource, verbose_name=_('Resource'), related_name='mappings', on_delete=models.CASCADE Resource, verbose_name=_('Resource'), related_name='mappings', on_delete=models.CASCADE

View File

@ -17,7 +17,6 @@
import datetime import datetime
import isodate import isodate
from django.utils import six
from lxml import etree as ET from lxml import etree as ET
from zeep.utils import qname_attr from zeep.utils import qname_attr
@ -57,7 +56,7 @@ ANY_TYPE = ET.QName(XSD, 'anyType')
TYPE_CASTER = { TYPE_CASTER = {
BOOLEAN: parse_bool, BOOLEAN: parse_bool,
STRING: six.text_type, STRING: str,
DATE: parse_date, DATE: parse_date,
INT: int, INT: int,
INTEGER: int, INTEGER: int,
@ -245,7 +244,7 @@ class Schema:
def qname_display(self, name): def qname_display(self, name):
if name.namespace in self.reverse_nsmap: if name.namespace in self.reverse_nsmap:
name = '%s:%s' % (self.reverse_nsmap[name.namespace], name.localname) name = '%s:%s' % (self.reverse_nsmap[name.namespace], name.localname)
return six.text_type(name) return str(name)
def paths(self): def paths(self):
roots = sorted(self.elements.keys()) roots = sorted(self.elements.keys())
@ -292,7 +291,6 @@ class Schema:
yield path yield path
@six.python_2_unicode_compatible
class Path: class Path:
def __init__(self, path, xsd_type): def __init__(self, path, xsd_type):
assert path assert path
@ -301,7 +299,7 @@ class Path:
try: try:
self.caster = TYPE_CASTER[xsd_type] self.caster = TYPE_CASTER[xsd_type]
except KeyError: except KeyError:
raise KeyError(six.text_type(xsd_type)) raise KeyError(str(xsd_type))
def resolve(self, root): def resolve(self, root):
def helper(node, path): def helper(node, path):
@ -319,4 +317,4 @@ class Path:
return self.caster(child.text) return self.caster(child.text)
def __str__(self): def __str__(self):
return '.'.join(six.text_type(name) for name in self.path) return '.'.join(str(name) for name in self.path)

View File

@ -26,7 +26,7 @@ from django.forms.models import modelform_factory
from django.forms.widgets import ClearableFileInput from django.forms.widgets import ClearableFileInput
from django.test import override_settings from django.test import override_settings
from django.urls import reverse 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.encoding import force_text
from django.utils.log import AdminEmailHandler from django.utils.log import AdminEmailHandler
from django.utils.text import slugify from django.utils.text import slugify
@ -71,7 +71,6 @@ BASE_EXPORT_FIELDS = (
) )
@six.python_2_unicode_compatible
class ApiUser(models.Model): class ApiUser(models.Model):
username = models.CharField(max_length=128, verbose_name=_('Username'), unique=True) username = models.CharField(max_length=128, verbose_name=_('Username'), unique=True)
fullname = models.CharField(max_length=50, verbose_name=_('Full Name')) 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)) return self.filter(Q(users=None) | Q(users=apiuser))
@six.python_2_unicode_compatible
class BaseResource(models.Model): class BaseResource(models.Model):
title = models.CharField(max_length=50, verbose_name=_('Title')) title = models.CharField(max_length=50, verbose_name=_('Title'))
slug = models.SlugField(verbose_name=_('Identifier'), unique=True) slug = models.SlugField(verbose_name=_('Identifier'), unique=True)
@ -653,7 +651,6 @@ class BaseResource(models.Model):
).exists() ).exists()
@six.python_2_unicode_compatible
class AccessRight(models.Model): class AccessRight(models.Model):
codename = models.CharField(max_length=100, verbose_name='codename') codename = models.CharField(max_length=100, verbose_name='codename')
resource_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) resource_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
@ -798,7 +795,7 @@ class Job(models.Model):
def set_after_timestamp(self, value): def set_after_timestamp(self, value):
if isinstance(value, datetime.datetime): if isinstance(value, datetime.datetime):
self.after_timestamp = value 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) self.after_timestamp = timezone.now() + datetime.timedelta(seconds=value)
elif isinstance(value, datetime.timedelta): elif isinstance(value, datetime.timedelta):
self.after_timestamp = timezone.now() + value self.after_timestamp = timezone.now() + value
@ -849,7 +846,6 @@ class Job(models.Model):
self.save() self.save()
@six.python_2_unicode_compatible
class ResourceLog(models.Model): class ResourceLog(models.Model):
timestamp = models.DateTimeField(auto_now_add=True) timestamp = models.DateTimeField(auto_now_add=True)
appname = models.CharField(max_length=128, verbose_name='appname', null=True) appname = models.CharField(max_length=128, verbose_name='appname', null=True)
@ -1063,7 +1059,6 @@ class HTTPResource(models.Model):
abstract = True abstract = True
@six.python_2_unicode_compatible
class BaseQuery(models.Model): class BaseQuery(models.Model):
"""Base for building custom queries. """Base for building custom queries.

View File

@ -5,7 +5,6 @@ import hmac
import random import random
from urllib import parse as urlparse from urllib import parse as urlparse
from django.utils import six
from django.utils.encoding import smart_bytes from django.utils.encoding import smart_bytes
from django.utils.http import quote, urlencode 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'): def sign_string(s, key, algo='sha256'):
digestmod = getattr(hashlib, algo) digestmod = getattr(hashlib, algo)
if isinstance(key, six.text_type): if isinstance(key, str):
key = key.encode('utf-8') key = key.encode('utf-8')
hash = hmac.HMAC(smart_bytes(key), digestmod=digestmod, msg=smart_bytes(s)) hash = hmac.HMAC(smart_bytes(key), digestmod=digestmod, msg=smart_bytes(s))
return hash.digest() return hash.digest()
@ -74,10 +73,6 @@ def check_string(s, signature, key, algo='sha256'):
if len(signature2) != len(signature): if len(signature2) != len(signature):
return False return False
res = 0 res = 0
if six.PY3: for a, b in zip(signature, signature2):
for a, b in zip(signature, signature2): res |= a ^ b
res |= a ^ b
else:
for a, b in zip(signature, signature2):
res |= ord(a) ^ ord(b)
return res == 0 return res == 0

View File

@ -29,8 +29,6 @@ from django.utils.timezone import make_aware
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, DeleteView, DetailView, FormView, ListView, UpdateView, View 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 ..utils import ImportSiteError, export_site, get_trusted_services, import_site
from ..views import GenericConnectorMixin from ..views import GenericConnectorMixin
from .forms import AccessRightForm, ApiUserForm, AvailabilityParametersForm, ImportSiteForm from .forms import AccessRightForm, ApiUserForm, AvailabilityParametersForm, ImportSiteForm
@ -332,7 +330,7 @@ class ImportSiteView(FormView):
def form_valid(self, form): def form_valid(self, form):
try: try:
site_json = json_loads(self.request.FILES['site_json'].read()) site_json = json.loads(self.request.FILES['site_json'].read())
except ValueError: except ValueError:
form.add_error('site_json', _('File is not in the expected JSON format.')) form.add_error('site_json', _('File is not in the expected JSON format.'))
return self.form_invalid(form) return self.form_invalid(form)

View File

@ -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)

View File

@ -18,18 +18,18 @@ from __future__ import unicode_literals
import base64 import base64
import datetime import datetime
import json
import pytz import pytz
from django.conf import settings from django.conf import settings
from django.core.cache import cache from django.core.cache import cache
from django.db import models 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 django.utils.translation import ugettext_lazy as _
from zeep.exceptions import Fault as WebFault from zeep.exceptions import Fault as WebFault
from zeep.helpers import serialize_object from zeep.helpers import serialize_object
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
from passerelle.utils.conversion import to_pdf from passerelle.utils.conversion import to_pdf
from passerelle.utils.jsonresponse import APIError from passerelle.utils.jsonresponse import APIError
@ -201,7 +201,6 @@ def get_client(instance):
return instance.soap_client() return instance.soap_client()
@six.python_2_unicode_compatible
class DPark(BaseResource): class DPark(BaseResource):
log_requests_errors = False log_requests_errors = False
@ -290,7 +289,7 @@ class DPark(BaseResource):
@endpoint(perm='can_access', methods=['post'], description=_('Register a subscription application')) @endpoint(perm='can_access', methods=['post'], description=_('Register a subscription application'))
def register(self, request, *args, **kwargs): def register(self, request, *args, **kwargs):
data = json_loads(request.body) data = json.loads(request.body)
is_erroneous( is_erroneous(
data, data,
( (
@ -348,7 +347,7 @@ class DPark(BaseResource):
@endpoint(perm='can_access', methods=['post'], description=_('Link user to a subscription')) @endpoint(perm='can_access', methods=['post'], description=_('Link user to a subscription'))
def link(self, request, *args, **kwargs): def link(self, request, *args, **kwargs):
data = json_loads(request.body) data = json.loads(request.body)
if 'nameid' not in data: if 'nameid' not in data:
raise WrongParameter(['nameid'], []) raise WrongParameter(['nameid'], [])
result = self.check_file_exists(data) result = self.check_file_exists(data)
@ -370,7 +369,7 @@ class DPark(BaseResource):
@endpoint(perm='can_access', methods=['post'], description=_('Unlink user to subscription')) @endpoint(perm='can_access', methods=['post'], description=_('Unlink user to subscription'))
def unlink(self, request, *args, **kwargs): def unlink(self, request, *args, **kwargs):
data = json_loads(request.body) data = json.loads(request.body)
is_erroneous(data, ('nameid',)) is_erroneous(data, ('nameid',))
pairings = Pairing.objects.filter(**data) pairings = Pairing.objects.filter(**data)
if pairings.exists() is False: 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')) @endpoint(name='notify-payment', perm='can_access', methods=['post'], description=_('Notify a payment'))
def payment_notification(self, request, *args, **kwargs): def payment_notification(self, request, *args, **kwargs):
data = json_loads(request.body) data = json.loads(request.body)
is_erroneous( is_erroneous(
data, data,
( (
@ -519,7 +518,7 @@ class DPark(BaseResource):
) )
def send_files(self, request, *args, **kwargs): def send_files(self, request, *args, **kwargs):
try: try:
data = json_loads(request.body) data = json.loads(request.body)
except ValueError as exc: except ValueError as exc:
raise APIError(str(exc), http_status=400) raise APIError(str(exc), http_status=400)
@ -568,7 +567,6 @@ class DPark(BaseResource):
return {'data': True} return {'data': True}
@six.python_2_unicode_compatible
class Pairing(models.Model): class Pairing(models.Model):
INFO_CACHE_DURATION = 5 * 60 INFO_CACHE_DURATION = 5 * 60
PAYMENT_INFO_CACHE_DURATION = 20 * 60 PAYMENT_INFO_CACHE_DURATION = 20 * 60

View File

@ -20,12 +20,10 @@ import re
from django.db import models from django.db import models
from django.utils.dateparse import parse_date, parse_datetime 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.timezone import get_fixed_timezone, is_naive, make_aware, utc
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
from passerelle.utils.jsonresponse import APIError from passerelle.utils.jsonresponse import APIError
@ -68,7 +66,7 @@ def parse_gdema_datetime(value):
def normalize(value): def normalize(value):
'''convert /Date()/ to datetime, integers to strings''' '''convert /Date()/ to datetime, integers to strings'''
if isinstance(value, string_types): if isinstance(value, str):
datetime = parse_gdema_datetime(value) datetime = parse_gdema_datetime(value)
if datetime: if datetime:
return datetime return datetime
@ -253,7 +251,7 @@ class Gdema(BaseResource):
) )
def create_request(self, request): def create_request(self, request):
try: try:
payload = json_loads(request.body) payload = json.loads(request.body)
except ValueError: except ValueError:
raise APIError('payload must be a JSON object', http_status=400) raise APIError('payload must be a JSON object', http_status=400)
if not isinstance(payload, dict): if not isinstance(payload, dict):

View File

@ -14,6 +14,7 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import json
import re import re
from django.db import models from django.db import models
@ -22,7 +23,6 @@ from django.utils.text import slugify
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
COMMUNE_EXTRA_MAPPING = {'Vaulx-en-Velin': 'VAULX'} COMMUNE_EXTRA_MAPPING = {'Vaulx-en-Velin': 'VAULX'}
@ -123,7 +123,7 @@ class GrandLyonStreetSections(BaseResource):
sections = self.requests.get( sections = self.requests.get(
'https://download.data.grandlyon.com/ws/grandlyon/adr_voie_lieu.adraxevoie/all.json?maxfeatures=1000000' 'https://download.data.grandlyon.com/ws/grandlyon/adr_voie_lieu.adraxevoie/all.json?maxfeatures=1000000'
).content ).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'): if not value.get('codefuv') or not value.get('codetroncon'):
continue continue
section, dummy = StreetSection.objects.get_or_create( section, dummy = StreetSection.objects.get_or_create(

View File

@ -14,6 +14,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import base64 import base64
import json
import re import re
from email.mime.base import MIMEBase from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart from email.mime.multipart import MIMEMultipart
@ -28,7 +29,6 @@ from suds.transport import Reply
from suds.transport.http import HttpAuthenticated from suds.transport.http import HttpAuthenticated
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.soap import sudsobject_to_dict from passerelle.soap import sudsobject_to_dict
from passerelle.utils.api import APIError, endpoint from passerelle.utils.api import APIError, endpoint
@ -258,7 +258,7 @@ Response :
def create(self, request): def create(self, request):
# get creation fields from payload # get creation fields from payload
try: try:
formdata = FormData(json_loads(request.body), CREATION_SCHEMA) formdata = FormData(json.loads(request.body), CREATION_SCHEMA)
except ValueError as e: except ValueError as e:
raise ParameterTypeError(str(e)) raise ParameterTypeError(str(e))
# create suds object from formdata # create suds object from formdata
@ -329,7 +329,7 @@ Response :
) )
def add_information(self, request, iddemande=None, idgreco=None, information=None): def add_information(self, request, iddemande=None, idgreco=None, information=None):
if request.body: if request.body:
payload = json_loads(request.body) payload = json.loads(request.body)
if not isinstance(payload, dict): if not isinstance(payload, dict):
raise ParameterTypeError('payload must be a dict') raise ParameterTypeError('payload must be a dict')
idgreco = payload.get('idgreco') or idgreco idgreco = payload.get('idgreco') or idgreco
@ -356,7 +356,7 @@ Response :
) )
def update(self, request, iddemande=None, idgreco=None, comment=None): def update(self, request, iddemande=None, idgreco=None, comment=None):
if request.body: if request.body:
payload = json_loads(request.body) payload = json.loads(request.body)
if not isinstance(payload, dict): if not isinstance(payload, dict):
raise ParameterTypeError('payload must be a dict') raise ParameterTypeError('payload must be a dict')
idgreco = payload.get('idgreco') or idgreco idgreco = payload.get('idgreco') or idgreco
@ -383,7 +383,7 @@ Response :
display_order=7, display_order=7,
) )
def add_confirmation(self, request): def add_confirmation(self, request):
payload = json_loads(request.body) payload = json.loads(request.body)
if not isinstance(payload, dict): if not isinstance(payload, dict):
raise ParameterTypeError('payload must be a dict') raise ParameterTypeError('payload must be a dict')
idgreco = payload.get('idgreco') idgreco = payload.get('idgreco')

View File

@ -14,6 +14,7 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import json
import re import re
from urllib import parse as urlparse from urllib import parse as urlparse
@ -26,7 +27,6 @@ from django.utils.translation import ugettext_lazy as _
from lxml import etree from lxml import etree
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
from passerelle.utils.jsonresponse import APIError from passerelle.utils.jsonresponse import APIError
from passerelle.views import WrongParameter 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')) @endpoint(name='create-demand', perm='can_access', methods=['post'], description=_('Create a demand'))
def create_demand(self, request, *args, **kwargs): def create_demand(self, request, *args, **kwargs):
try: try:
payload = self.build_gru_params(json_loads(request.body)) payload = self.build_gru_params(json.loads(request.body))
except (KeyError, ValueError) as e: except (KeyError, ValueError) as e:
raise APIError(e) raise APIError(e)
response = self.request('ws_creation_demande.php', payload) response = self.request('ws_creation_demande.php', payload)
@ -253,7 +253,7 @@ class GrenobleGRU(BaseResource):
pattern=r'(?P<demand_id>[\w-]+)/add-attachment/$', pattern=r'(?P<demand_id>[\w-]+)/add-attachment/$',
) )
def add_attachment_to_demand(self, request, demand_id, **kwargs): 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: if 'file' not in data:
raise WrongParameter(['file'], []) raise WrongParameter(['file'], [])
file_data = data['file'] file_data = data['file']

View File

@ -16,6 +16,7 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import json
import re import re
from urllib.parse import urljoin from urllib.parse import urljoin
@ -23,7 +24,6 @@ from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
from passerelle.utils.http_authenticators import HttpBearerAuth from passerelle.utils.http_authenticators import HttpBearerAuth
from passerelle.utils.jsonresponse import APIError from passerelle.utils.jsonresponse import APIError
@ -134,7 +134,7 @@ class LilleUrbanCard(BaseResource):
@endpoint(perm='can_access', description=_('Card Request'), methods=['post']) @endpoint(perm='can_access', description=_('Card Request'), methods=['post'])
def card_request(self, request, *args, **kwargs): 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_card_request_data(data)
self.preprocess_contact_data(data) self.preprocess_contact_data(data)
self.preprocess_service_data(data) self.preprocess_service_data(data)
@ -169,7 +169,7 @@ class LilleUrbanCard(BaseResource):
@endpoint(perm='can_access', description=_('Add new subscriptions'), methods=['post']) @endpoint(perm='can_access', description=_('Add new subscriptions'), methods=['post'])
def add_subscriptions(self, request, *args, **kwargs): 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_card_request_data(data)
self.preprocess_contact_data(data) self.preprocess_contact_data(data)
self.preprocess_service_data(data) self.preprocess_service_data(data)
@ -193,7 +193,7 @@ class LilleUrbanCard(BaseResource):
@endpoint(perm='can_access', description=_('Code Change'), methods=['post']) @endpoint(perm='can_access', description=_('Code Change'), methods=['post'])
def code_change(self, request, *args, **kwargs): def code_change(self, request, *args, **kwargs):
data = json_loads(request.body) data = json.loads(request.body)
response = self.requests.post( response = self.requests.post(
urljoin(self.base_url, '/clu/ws/modifierCodeSecret'), urljoin(self.base_url, '/clu/ws/modifierCodeSecret'),
json=data, json=data,
@ -211,7 +211,7 @@ class LilleUrbanCard(BaseResource):
@endpoint(perm='can_access', description=_('Code check'), methods=['post']) @endpoint(perm='can_access', description=_('Code check'), methods=['post'])
def code_check(self, request, *args, **kwargs): def code_check(self, request, *args, **kwargs):
data = json_loads(request.body) data = json.loads(request.body)
if 'password' in data: if 'password' in data:
data['code_secret'] = data.pop('password') data['code_secret'] = data.pop('password')
response = self.requests.get( response = self.requests.get(
@ -262,7 +262,7 @@ class LilleUrbanCard(BaseResource):
@endpoint(perm='can_access', description=_('Card Revocation'), methods=['post']) @endpoint(perm='can_access', description=_('Card Revocation'), methods=['post'])
def card_revocation(self, request, *args, **kwargs): def card_revocation(self, request, *args, **kwargs):
data = json_loads(request.body) data = json.loads(request.body)
self.preprocess_contact_data(data) self.preprocess_contact_data(data)
response = self.requests.post( response = self.requests.post(
urljoin(self.base_url, '/clu/ws/revoquerCarte'), json=data, auth=HttpBearerAuth(self.get_token()) 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']) @endpoint(perm='can_access', description=_('Subscription Revocation'), methods=['post'])
def subscription_revocation(self, request, *args, **kwargs): def subscription_revocation(self, request, *args, **kwargs):
data = json_loads(request.body) data = json.loads(request.body)
self.preprocess_contact_data(data) self.preprocess_contact_data(data)
self.preprocess_service_data(data) self.preprocess_service_data(data)
response = self.requests.post( response = self.requests.post(
@ -299,7 +299,7 @@ class LilleUrbanCard(BaseResource):
@endpoint(perm='can_access', description=_('Subscription Renewal'), methods=['post']) @endpoint(perm='can_access', description=_('Subscription Renewal'), methods=['post'])
def subscription_renewal(self, request, *args, **kwargs): def subscription_renewal(self, request, *args, **kwargs):
data = json_loads(request.body) data = json.loads(request.body)
self.preprocess_contact_data(data) self.preprocess_contact_data(data)
response = self.requests.post( response = self.requests.post(
urljoin(self.base_url, '/clu/ws/renouvelerAbonnements'), urljoin(self.base_url, '/clu/ws/renouvelerAbonnements'),

View File

@ -22,7 +22,6 @@ from urllib import parse as urlparse
import requests import requests
from django.db import models, transaction from django.db import models, transaction
from django.utils import six
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource, HTTPResource from passerelle.base.models import BaseResource, HTTPResource
@ -135,7 +134,7 @@ class MDPH13Resource(BaseResource, HTTPResource):
'traitée et expédiée': 'historique', 'traitée et expédiée': 'historique',
'traitée non 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) raise APIError('typologie-must-be-a-string', data=content)
if not all(demande['typologie'].lower() in typologies for demande in demandes): if not all(demande['typologie'].lower() in typologies for demande in demandes):
unknowns = set([demande['typologie'].lower() for demande in demandes]) - set( unknowns = set([demande['typologie'].lower() for demande in demandes]) - set(
@ -158,7 +157,7 @@ class MDPH13Resource(BaseResource, HTTPResource):
def check(value, path): def check(value, path):
if path[-1].startswith('date_'): 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)) errors.append('%s is not a date string' % '.'.join(path))
json_walker(data, check) json_walker(data, check)
@ -297,14 +296,13 @@ class MDPH13Resource(BaseResource, HTTPResource):
raise raise
file_data.update(to_json().err_to_response(e)) file_data.update(to_json().err_to_response(e))
# do it later as get_filter() can modify str(link) # 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) data.append(file_data)
if link_id: if link_id:
return {'data': data[0] if data else None} return {'data': data[0] if data else None}
return {'data': data} return {'data': data}
@six.python_2_unicode_compatible
class Link(models.Model): class Link(models.Model):
resource = models.ForeignKey(MDPH13Resource, on_delete=models.CASCADE) resource = models.ForeignKey(MDPH13Resource, on_delete=models.CASCADE)
name_id = models.CharField(verbose_name=_('NameID'), max_length=256) name_id = models.CharField(verbose_name=_('NameID'), max_length=256)

View File

@ -1,7 +1,6 @@
import csv import csv
from django.db import models from django.db import models
from django.utils import six
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -51,8 +50,7 @@ class NancyPoll(BaseResource):
content = self.csv_file.read() content = self.csv_file.read()
if not content: if not content:
raise APIError('No content found') raise APIError('No content found')
if six.PY3: content = force_text(content)
content = force_text(content)
reader = csv.reader(content.splitlines()) reader = csv.reader(content.splitlines())
next(reader) next(reader)

View File

@ -17,8 +17,6 @@
import calendar import calendar
from datetime import datetime from datetime import datetime
from django.utils import six
ENCODE_TOKENS = { ENCODE_TOKENS = {
'integer': 16, 'integer': 16,
'real': 19, 'real': 19,
@ -228,7 +226,7 @@ class MSTEEncoder:
if ref is not None: if ref is not None:
self._push_token_type('ref') self._push_token_type('ref')
self._push(ref) self._push(ref)
elif isinstance(obj, six.string_types): elif isinstance(obj, str):
self._encode_string(obj) self._encode_string(obj)
elif obj is None: elif obj is None:
self._encode_nil() self._encode_nil()

View File

@ -23,7 +23,6 @@ from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.contrib.solis_apa import conciliation, integration, suivi from passerelle.contrib.solis_apa import conciliation, integration, suivi
from passerelle.utils.jsonresponse import APIError from passerelle.utils.jsonresponse import APIError
@ -314,7 +313,7 @@ class SolisAPA(BaseResource):
uri = 'importFlow?flow=ImportIntegrationDemande&application=%s' % APPLICATION uri = 'importFlow?flow=ImportIntegrationDemande&application=%s' % APPLICATION
url = self.get_resource_url(uri) 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) data = json.dumps(data)
self.logger.debug('Demande APA: %s' % data, extra={'solis_apa_demande': data}) self.logger.debug('Demande APA: %s' % data, extra={'solis_apa_demande': data})
response = self.requests.post(url, data=data, headers=HEADERS) response = self.requests.post(url, data=data, headers=HEADERS)

View File

@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import datetime import datetime
import json
from urllib import parse as urlparse from urllib import parse as urlparse
from django.db import models from django.db import models
@ -23,7 +24,6 @@ from django.utils.translation import ugettext_lazy as _
from requests import RequestException from requests import RequestException
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.utils.api import APIError, endpoint from passerelle.utils.api import APIError, endpoint
@ -52,7 +52,7 @@ class StrasbourgEu(BaseResource):
if name_id is None: if name_id is None:
raise APIError('missing name_id') raise APIError('missing name_id')
# expected content: {"interests": ["123", "456"]} # expected content: {"interests": ["123", "456"]}
response = json_loads(request.body) response = json.loads(request.body)
if 'error ' in response: if 'error ' in response:
return {'err': 1, 'err_desc': response.get('error')} return {'err': 1, 'err_desc': response.get('error')}
interests = response.get('interests') interests = response.get('interests')
@ -134,7 +134,7 @@ class StrasbourgEu(BaseResource):
else: else:
# expected content: {"title": ..., "description": ..., "url": ..., # expected content: {"title": ..., "description": ..., "url": ...,
# ...}, cf https://strasbourgeurometropole.github.io/slate/#ajout-d-39-une-notification # ...}, 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 notification['userId'] = name_id
url = urlparse.urljoin(self.liferay_api_url, 'jsonws/notification.notification/add-notification') url = urlparse.urljoin(self.liferay_api_url, 'jsonws/notification.notification/add-notification')
try: try:
@ -172,7 +172,7 @@ class StrasbourgEu(BaseResource):
else: else:
# expected content: {"title": ..., "url": ..., ...}, # expected content: {"title": ..., "url": ..., ...},
# cf https://strasbourgeurometropole.github.io/slate/?shell#ajout-d-39-un-favori # 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 # change type to typeId
types_url = urlparse.urljoin(self.liferay_api_url, 'jsonws/favorite.favorite/get-types') types_url = urlparse.urljoin(self.liferay_api_url, 'jsonws/favorite.favorite/get-types')
try: try:

View File

@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import base64 import base64
import json
import logging import logging
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
from datetime import datetime from datetime import datetime
@ -26,7 +27,6 @@ from django.utils.encoding import smart_text
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.soap import client_to_jsondict from passerelle.soap import client_to_jsondict
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
from passerelle.utils.jsonresponse import APIError from passerelle.utils.jsonresponse import APIError
@ -315,7 +315,7 @@ class TeamnetAxel(BaseResource):
pattern=r'^(?P<regie_id>\w+)/invoice/(?P<invoice_id>[\w,-]+)/pay/$', pattern=r'^(?P<regie_id>\w+)/invoice/(?P<invoice_id>[\w,-]+)/pay/$',
) )
def pay_invoice(self, request, regie_id, invoice_id, **kwargs): 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_id = data.get('transaction_id')
transaction_date = data.get('transaction_date') transaction_date = data.get('transaction_date')
email = data.get('email') email = data.get('email')

View File

@ -17,7 +17,8 @@
# borrowed from https://pypi.python.org/pypi/suds_requests # 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 # 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.client import Client
from suds.transport import Reply from suds.transport import Reply
from suds.transport.http import HttpAuthenticated from suds.transport.http import HttpAuthenticated

View File

@ -16,6 +16,7 @@
import base64 import base64
import datetime import datetime
import json
import logging import logging
import os import os
@ -27,7 +28,6 @@ from django.utils.dates import WEEKDAYS as WEEKDAYS_LABELS
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource from passerelle.base.models import BaseResource
from passerelle.compat import json_loads
from passerelle.contrib.utils import axel from passerelle.contrib.utils import axel
from passerelle.utils.api import endpoint from passerelle.utils.api import endpoint
from passerelle.utils.jsonresponse import APIError from passerelle.utils.jsonresponse import APIError
@ -873,7 +873,7 @@ class ToulouseAxel(BaseResource):
}, },
) )
def pay_invoice(self, request, regie_id, invoice_id, **kwargs): 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) dui, invoice_id = invoice_id.rsplit('-', 1)
invoice = self.get_invoice(regie_id=regie_id, dui=dui, invoice_id=invoice_id) invoice = self.get_invoice(regie_id=regie_id, dui=dui, invoice_id=invoice_id)

View File

@ -20,8 +20,6 @@ from __future__ import unicode_literals
import datetime import datetime
from collections import OrderedDict from collections import OrderedDict
from django.utils.six import string_types
from passerelle.utils.conversion import normalize from passerelle.utils.conversion import normalize
situation_familiale_mapping = OrderedDict( situation_familiale_mapping = OrderedDict(
@ -92,7 +90,7 @@ def upperize(data):
if isinstance(data, list): if isinstance(data, list):
for i, val in enumerate(data): for i, val in enumerate(data):
data[i] = upperize(val) data[i] = upperize(val)
if isinstance(data, string_types): if isinstance(data, str):
data = normalize(data).upper() data = normalize(data).upper()
return data return data

View File

@ -21,7 +21,6 @@ from django.contrib.postgres.fields import ArrayField
from django.core.validators import RegexValidator from django.core.validators import RegexValidator
from django.db import models from django.db import models
from django.urls import reverse from django.urls import reverse
from django.utils import six
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -250,7 +249,6 @@ class SMSResource(BaseResource):
abstract = True abstract = True
@six.python_2_unicode_compatible
class SMSLog(models.Model): class SMSLog(models.Model):
timestamp = models.DateTimeField(auto_now_add=True) timestamp = models.DateTimeField(auto_now_add=True)
appname = models.CharField(max_length=128, verbose_name='appname', null=True) appname = models.CharField(max_length=128, verbose_name='appname', null=True)

View File

@ -21,6 +21,7 @@ import re
import time import time
import warnings import warnings
from functools import wraps from functools import wraps
from io import BytesIO
from itertools import chain, islice from itertools import chain, islice
from django.conf import settings 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.encoding import force_bytes, force_text
from django.utils.functional import lazy from django.utils.functional import lazy
from django.utils.html import mark_safe from django.utils.html import mark_safe
from django.utils.six import BytesIO
from django.utils.translation import ngettext_lazy from django.utils.translation import ngettext_lazy
from django.views.generic.detail import SingleObjectMixin from django.views.generic.detail import SingleObjectMixin
from requests import Response as RequestResponse from requests import Response as RequestResponse

View File

@ -19,7 +19,6 @@ from __future__ import absolute_import
import inspect import inspect
from django.urls import reverse from django.urls import reverse
from django.utils import six
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
# make APIError available from this module # make APIError available from this module
@ -109,7 +108,7 @@ class endpoint:
def __call__(self, func): def __call__(self, func):
func.endpoint_info = self func.endpoint_info = self
if not self.name: if not self.name:
self.name = func.func_name if six.PY2 else func.__name__ self.name = func.__name__
self.func = func self.func = func
return func return func

View File

@ -19,11 +19,10 @@ import math
import re import re
import unicodedata import unicodedata
import warnings import warnings
from io import BytesIO
import unidecode import unidecode
from django.utils import six
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.six import BytesIO
from PIL import Image from PIL import Image
@ -74,20 +73,20 @@ def to_ascii(s):
def exception_to_text(e): def exception_to_text(e):
try: try:
return six.text_type(e) return str(e)
except Exception: except Exception:
pass pass
try: try:
r = repr(e) r = repr(e)
return six.text_type(r, errors='replace') return str(r, errors='replace')
except Exception: except Exception:
pass pass
try: try:
args = e.args args = e.args
try: try:
content = six.text_type(repr(args)) if args != [] else '' content = str(repr(args)) if args != [] else ''
except Exception: except Exception:
content = '<exception-while-rendering-args>' content = '<exception-while-rendering-args>'
except AttributeError: except AttributeError:

View File

@ -31,8 +31,6 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.utils import six
from passerelle.utils.validation import is_number from passerelle.utils.validation import is_number
FLATTEN_SEPARATOR = '/' FLATTEN_SEPARATOR = '/'
@ -110,7 +108,7 @@ def flatten(data, separator=FLATTEN_SEPARATOR):
for path, value in helper(value): for path, value in helper(value):
yield [str(i)] + path, value yield [str(i)] + path, value
elif isinstance(data, dict): elif isinstance(data, dict):
for key, value in six.iteritems(data): for key, value in data.items():
for path, value in helper(value): for path, value in helper(value):
yield [str(key)] + path, value yield [str(key)] + path, value
else: else:

View File

@ -27,7 +27,6 @@ import paramiko
from django import forms from django import forms
from django.core import validators from django.core import validators
from django.db import models from django.db import models
from django.utils import six
from django.utils.encoding import force_bytes, force_text from django.utils.encoding import force_bytes, force_text
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from paramiko.dsskey import DSSKey from paramiko.dsskey import DSSKey
@ -59,7 +58,6 @@ def _load_private_key(content_or_file, password=None):
pass pass
@six.python_2_unicode_compatible
class SFTP: class SFTP:
def __init__(self, url, private_key_content=None, private_key_password=None): def __init__(self, url, private_key_content=None, private_key_password=None):
self.url = url self.url = url

View File

@ -31,7 +31,6 @@ from django import forms
from django.conf import settings from django.conf import settings
from django.core.cache import cache from django.core.cache import cache
from django.db import models from django.db import models
from django.utils import six
from passerelle.base import signature from passerelle.base import signature
@ -114,7 +113,6 @@ class Evolution(BaseObject):
self.who = EvolutionUser(wcs_api, **self.who) self.who = EvolutionUser(wcs_api, **self.who)
@six.python_2_unicode_compatible
class FormData(BaseObject): class FormData(BaseObject):
geolocations = None geolocations = None
evolution = None evolution = None
@ -411,7 +409,7 @@ class FormDefSubmit:
content_type = kwargs.get('content_type', 'application/octet-stream') content_type = kwargs.get('content_type', 'application/octet-stream')
if hasattr(value, 'read'): if hasattr(value, 'read'):
content = base64.b64encode(value.read()) content = base64.b64encode(value.read())
elif isinstance(value, six.binary_type): elif isinstance(value, bytes):
content = base64.b64encode(value) content = base64.b64encode(value)
elif isinstance(value, dict): elif isinstance(value, dict):
if not set(value).issuperset(set(['filename', 'content'])): if not set(value).issuperset(set(['filename', 'content'])):
@ -428,7 +426,7 @@ class FormDefSubmit:
} }
def _set_type_date(self, varname, field, value): 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() value = datetime.datetime.strptime(value, '%Y-%m-%d').date()
if isinstance(value, datetime.datetime): if isinstance(value, datetime.datetime):
value = value.date() value = value.date()
@ -444,7 +442,7 @@ class FormDefSubmit:
self.data[varname] = value self.data[varname] = value
def _set_type_bool(self, varname, field, 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'] value = value.lower().strip() in ['yes', 'true', 'on']
if not isinstance(value, bool): if not isinstance(value, bool):
raise TypeError('value must be a boolean or a string true, yes, on, false, no, off') raise TypeError('value must be a boolean or a string true, yes, on, false, no, off')
@ -454,7 +452,6 @@ class FormDefSubmit:
raise CancelSubmitError raise CancelSubmitError
@six.python_2_unicode_compatible
class FormDef(BaseObject): class FormDef(BaseObject):
geolocations = None geolocations = None
@ -645,7 +642,6 @@ def get_wcs_choices(session=None):
return choices return choices
@six.python_2_unicode_compatible
class FormDefRef: class FormDefRef:
_formdef = None _formdef = None
_api = None _api = None
@ -655,7 +651,7 @@ class FormDefRef:
if value2: if value2:
self.wcs_slug, self.formdef_slug = value1, value2 self.wcs_slug, self.formdef_slug = value1, value2
else: else:
self.wcs_slug, self.formdef_slug = six.text_type(value1).rsplit(':', 1) self.wcs_slug, self.formdef_slug = str(value1).rsplit(':', 1)
@property @property
def api(self): def api(self):

View File

@ -28,7 +28,6 @@ from django.template import Context, Template, TemplateDoesNotExist, TemplateSyn
from django.template.loader import get_template from django.template.loader import get_template
from django.utils.encoding import force_str from django.utils.encoding import force_str
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.utils.six import python_2_unicode_compatible
from jsonschema import ValidationError, validate from jsonschema import ValidationError, validate
from passerelle.utils.files import atomic_write from passerelle.utils.files import atomic_write
@ -92,7 +91,6 @@ class ZipTemplateSyntaxError(ZipTemplateError):
VARIABLE_RE = re.compile(r'{{ *(\w*)') VARIABLE_RE = re.compile(r'{{ *(\w*)')
@python_2_unicode_compatible
class ZipPart: class ZipPart:
def __init__(self, zip_template, name_template, template_path=None, content_expression=None): def __init__(self, zip_template, name_template, template_path=None, content_expression=None):
self.zip_template = zip_template self.zip_template = zip_template

View File

@ -53,7 +53,6 @@ from django.views.generic.detail import SingleObjectMixin
from jsonschema import ValidationError, validate, validators from jsonschema import ValidationError, validate, validators
from passerelle.base.models import BaseResource, ResourceLog from passerelle.base.models import BaseResource, ResourceLog
from passerelle.compat import json_loads
from passerelle.utils.conversion import normalize from passerelle.utils.conversion import normalize
from passerelle.utils.json import unflatten from passerelle.utils.json import unflatten
from passerelle.utils.jsonresponse import APIError, JSONEncoder 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) 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') pre_process = hasattr(json_schema, 'items') and json_schema.get('pre_process')
try: try:
data = json_loads(request.body) data = json.loads(request.body)
except ValueError as e: except ValueError as e:
raise APIError("could not decode body to json: %s" % e, http_status=400) raise APIError("could not decode body to json: %s" % e, http_status=400)
if must_unflatten: if must_unflatten:

View File

@ -6,14 +6,10 @@ import pytest
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.cache import cache from django.core.cache import cache
from django.core.files import File from django.core.files import File
from django.utils import six
from httmock import HTTMock, remember_called, response, urlmatch from httmock import HTTMock, remember_called, response, urlmatch
from tests.utils import make_resource from tests.utils import make_resource
if six.PY2:
collect_ignore = ['wcs/']
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
def media(settings, tmpdir): def media(settings, tmpdir):

View File

@ -15,11 +15,11 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import json import json
from io import StringIO
import mock import mock
import pytest import pytest
from django.core.files import File from django.core.files import File
from django.utils.six import StringIO
import tests.utils import tests.utils
from passerelle.apps.base_adresse.models import BaseAdresse from passerelle.apps.base_adresse.models import BaseAdresse

View File

@ -13,7 +13,6 @@ from httmock import HTTMock
import tests.utils import tests.utils
from passerelle.apps.cartads_cs.models import CartaDSCS, CartaDSDossier, CartaDSFile from passerelle.apps.cartads_cs.models import CartaDSCS, CartaDSDossier, CartaDSFile
from passerelle.base.models import Job from passerelle.base.models import Job
from passerelle.compat import json_loads
@pytest.fixture @pytest.fixture
@ -716,12 +715,12 @@ def test_role_sync(connector, app, cached_data):
assert url.netloc == 'idp.example.org' assert url.netloc == 'idp.example.org'
if url.path == '/api/roles/': if url.path == '/api/roles/':
dossier = CartaDSDossier.objects.all().first() 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) '{"name": "Suivi Cart@DS (%s)", "slug": "_cartads_%s"}' % (dossier.id, dossier.id)
) )
return {'content': json.dumps({'uuid': 'role-uuid'}), 'status_code': 200} return {'content': json.dumps({'uuid': 'role-uuid'}), 'status_code': 200}
elif url.path == '/api/roles/role-uuid/relationships/members/': 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']]) idp_mock.subscribed_roles = set([x['uuid'] for x in body['data']])
return {'content': json.dumps({'err': 0}), 'status_code': 200} return {'content': json.dumps({'err': 0}), 'status_code': 200}
raise Exception('unhandled http call (%s)' % url) raise Exception('unhandled http call (%s)' % url)

View File

@ -17,16 +17,17 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import datetime import datetime
import json
import os import os
import time import time
import uuid import uuid
from io import StringIO
from posix import stat_result from posix import stat_result
from stat import ST_MTIME from stat import ST_MTIME
from urllib.parse import urlencode from urllib.parse import urlencode
import mock import mock
import pytest import pytest
import six
import webtest import webtest
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.files import File 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.test import Client, override_settings
from django.urls import reverse from django.urls import reverse
from django.utils.encoding import force_bytes, force_str, force_text from django.utils.encoding import force_bytes, force_str, force_text
from django.utils.six import StringIO
from django.utils.timezone import now from django.utils.timezone import now
from passerelle.apps.csvdatasource.models import CsvDataSource, Query, TableRow, upload_to from passerelle.apps.csvdatasource.models import CsvDataSource, Query, TableRow, upload_to
from passerelle.base.models import AccessRight, ApiUser from passerelle.base.models import AccessRight, ApiUser
from passerelle.compat import json_loads
from tests.test_manager import login from tests.test_manager import login
data = """121;69981;DELANOUE;Eliot;H data = """121;69981;DELANOUE;Eliot;H
@ -114,7 +113,7 @@ def setup():
def parse_response(response): def parse_response(response):
return json_loads(response.content)['data'] return json.loads(response.content)['data']
@pytest.fixture @pytest.fixture
@ -345,7 +344,7 @@ def test_on_the_fly_dialect_detection(client, setup):
_, url = setup(data=StringIO(data)) _, url = setup(data=StringIO(data))
CsvDataSource.objects.all().update(_dialect_options=None) CsvDataSource.objects.all().update(_dialect_options=None)
resp = client.get(url) resp = client.get(url)
result = json_loads(resp.content) result = json.loads(resp.content)
assert result['err'] == 0 assert result['err'] == 0
assert len(result['data']) == 20 assert len(result['data']) == 20
@ -353,7 +352,7 @@ def test_on_the_fly_dialect_detection(client, setup):
def test_missing_columns(client, setup): def test_missing_columns(client, setup):
_, url = setup(data=StringIO(data + 'A;B;C\n')) _, url = setup(data=StringIO(data + 'A;B;C\n'))
resp = client.get(url) resp = client.get(url)
result = json_loads(resp.content) result = json.loads(resp.content)
assert result['err'] == 0 assert result['err'] == 0
assert len(result['data']) == 21 assert len(result['data']) == 21
assert result['data'][-1] == {'lname': 'C', 'sex': '', 'id': 'B', 'fname': '', 'fam': 'A'} 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.sheet_name = 'unknown'
csvdata.save() csvdata.save()
resp = client.get(url) resp = client.get(url)
result = json_loads(resp.content) result = json.loads(resp.content)
assert len(result['data']) == 20 assert len(result['data']) == 20
def test_cache_new_shorter_file(client, setup): def test_cache_new_shorter_file(client, setup):
csvdata, url = setup(data=StringIO(data + 'A;B;C\n')) csvdata, url = setup(data=StringIO(data + 'A;B;C\n'))
resp = client.get(url) resp = client.get(url)
result = json_loads(resp.content) result = json.loads(resp.content)
assert result['err'] == 0 assert result['err'] == 0
assert len(result['data']) == 21 assert len(result['data']) == 21
csvdata.csv_file = File(StringIO(data), 'data.csv') csvdata.csv_file = File(StringIO(data), 'data.csv')
csvdata.save() csvdata.save()
resp = client.get(url) resp = client.get(url)
result = json_loads(resp.content) result = json.loads(resp.content)
assert len(result['data']) == 20 assert len(result['data']) == 20
@ -400,7 +399,7 @@ def test_query_array(app, setup, filetype):
for row in response.json['data']: for row in response.json['data']:
assert len(row) == 2 assert len(row) == 2
assert isinstance(row[0], int) 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): 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']: for row in response.json['data']:
assert len(row) == 2 assert len(row) == 2
assert isinstance(row['id'], int) assert isinstance(row['id'], int)
assert isinstance(row['prenom'], six.text_type) assert isinstance(row['prenom'], str)
def test_query_tuples(app, setup, filetype): def test_query_tuples(app, setup, filetype):
@ -473,7 +472,7 @@ def test_query_tuples(app, setup, filetype):
assert row[0][0] == 'id' assert row[0][0] == 'id'
assert isinstance(row[0][1], int) assert isinstance(row[0][1], int)
assert row[1][0] == 'prenom' 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): def test_query_onerow(app, setup, filetype):

View File

@ -1,10 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from io import BytesIO
import pytest import pytest
from django.core.files import File from django.core.files import File
from django.core.management import call_command from django.core.management import call_command
from django.db import connection from django.db import connection
from django.utils.six import BytesIO
from passerelle.apps.csvdatasource.models import CsvDataSource from passerelle.apps.csvdatasource.models import CsvDataSource
from passerelle.contrib.teamnet_axel.models import TeamnetAxel from passerelle.contrib.teamnet_axel.models import TeamnetAxel

View File

@ -20,7 +20,6 @@ import os
import mock import mock
import pytest import pytest
import six
from django.urls import reverse from django.urls import reverse
import tests.utils 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']) @pytest.fixture(params=['01', '02', '10', '20', '21', '23', '4242'])
def remote_response(request): def remote_response(request):
text = six.text_type(request.param) text = str(request.param)
return tests.utils.FakedResponse(index=request.param_index, text=text) return tests.utils.FakedResponse(index=request.param_index, text=text)

View File

@ -3,6 +3,7 @@ import json
import os import os
import sys import sys
import tempfile import tempfile
from io import BytesIO, StringIO
import pytest import pytest
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
@ -12,7 +13,6 @@ from django.test import Client
from django.urls import reverse from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.utils.encoding import force_bytes, force_text 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.base_adresse.models import BaseAdresse
from passerelle.apps.bdp.models import Bdp 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.ovh.models import OVHSMSGateway
from passerelle.apps.sector.models import SectorResource from passerelle.apps.sector.models import SectorResource
from passerelle.base.models import AccessRight, ApiUser from passerelle.base.models import AccessRight, ApiUser
from passerelle.compat import json_loads
from passerelle.utils import ImportSiteError, export_site, import_site from passerelle.utils import ImportSiteError, export_site, import_site
data = """121;69981;DELANOUE;Eliot;H data = """121;69981;DELANOUE;Eliot;H
@ -91,7 +90,7 @@ def setup():
def parse_response(response): def parse_response(response):
return json_loads(response.content)['data'] return json.loads(response.content)['data']
@pytest.fixture @pytest.fixture
@ -138,7 +137,7 @@ def test_export_csvdatasource(app, setup, filetype):
assert first == second assert first == second
output = get_output_of_command('export_site') output = get_output_of_command('export_site')
third = json_loads(output) third = json.loads(output)
third['resources'][0]['csv_file']['name'] = 'whocares' third['resources'][0]['csv_file']['name'] = 'whocares'
assert first == third assert first == third

View File

@ -1,3 +1,4 @@
import json
import logging import logging
import pytest import pytest
@ -5,7 +6,6 @@ from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
from django.http import Http404 from django.http import Http404
from django.test.client import RequestFactory from django.test.client import RequestFactory
from passerelle.compat import json_loads
from passerelle.utils import to_json from passerelle.utils import to_json
@ -109,7 +109,7 @@ def test_jsonresponse_log_as_warning_exception(caplog):
assert record.method == 'GET' assert record.method == 'GET'
assert "Error occurred while processing request" in record.message assert "Error occurred while processing request" in record.message
assert response.status_code == 488 assert response.status_code == 488
data = json_loads(response.content) data = json.loads(response.content)
assert data['err'] == 'logaswarningexception' assert data['err'] == 'logaswarningexception'
assert data['err_desc'] == 'log as warning exception' assert data['err_desc'] == 'log as warning exception'
@ -124,7 +124,7 @@ def test_jsonresponse_error_header():
result = test_func(req) result = test_func(req)
assert result.status_code == 200 assert result.status_code == 200
data = json_loads(result.content) data = json.loads(result.content)
assert data == {'test': 'un test', 'err': 0} assert data == {'test': 'un test', 'err': 0}
@to_json() @to_json()
@ -135,7 +135,7 @@ def test_jsonresponse_error_header():
raise CustomException raise CustomException
result = test_func2(req) result = test_func2(req)
data = json_loads(result.content) data = json.loads(result.content)
assert 'err_class' in data assert 'err_class' in data
assert 'err' in data assert 'err' in data
assert data['err'] == 1 assert data['err'] == 1
@ -161,7 +161,7 @@ def test_jsonresponse_with_callback():
content_type = result.get('Content-Type') content_type = result.get('Content-Type')
assert 'application/javascript' in content_type assert 'application/javascript' in content_type
assert result.content.startswith(b'myfunc(') 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} assert args == {'foo': 'bar', 'err': 0}

View File

@ -7,7 +7,6 @@ import pytest
from httmock import HTTMock from httmock import HTTMock
import tests.utils import tests.utils
from passerelle.compat import json_loads
from passerelle.contrib.lille_urban_card.models import LilleUrbanCard from passerelle.contrib.lille_urban_card.models import LilleUrbanCard
from passerelle.utils.jsonresponse import APIError from passerelle.utils.jsonresponse import APIError
@ -29,7 +28,7 @@ def mocked_http(url, request):
if url.path == '/clu/ws/auth/connexion': if url.path == '/clu/ws/auth/connexion':
return {'content': TOKEN_RESPONSE, 'status_code': 200} return {'content': TOKEN_RESPONSE, 'status_code': 200}
if url.path == '/clu/ws/demanderCarte': 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': if request_json.get('simulate_error') == 'doublon':
error = {'erreur': 'Demande 113-9166 : 1 demande(s) ...'} error = {'erreur': 'Demande 113-9166 : 1 demande(s) ...'}
return {'content': json.dumps(error), 'status_code': 409} 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} return {'content': json.dumps(content), 'status_code': 200}
if url.path == '/clu/ws/ajouterAbonnements': 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': if request_json.get('simulate_error') == 'data':
error = {'statut': 'ERREUR_DONNEES', 'erreur': 'Demande vide...'} error = {'statut': 'ERREUR_DONNEES', 'erreur': 'Demande vide...'}
return {'content': json.dumps(error), 'status_code': 400} 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} return {'content': json.dumps(content), 'status_code': 200}
if url.path == '/clu/ws/modifierCodeSecret': 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': if request_json.get('simulate_error') == 'wrong num serie':
error = {'statut': 'ERREUR_NUM_SERIE', 'erreur': 'Le numero de serie...'} error = {'statut': 'ERREUR_NUM_SERIE', 'erreur': 'Le numero de serie...'}
return {'content': json.dumps(error), 'status_code': 404} 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(error), 'status_code': 404}
return {'content': json.dumps({'message': 'Le mot de passe est valide'}), 'status_code': 200} return {'content': json.dumps({'message': 'Le mot de passe est valide'}), 'status_code': 200}
if url.path in ('/clu/ws/revoquerCarte', '/clu/ws/revoquerAbonnement'): 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': if request_json.get('simulate_error') == 'doublon':
error = {'erreur': 'La demande xx existe...'} error = {'erreur': 'La demande xx existe...'}
return {'content': json.dumps(error), 'status_code': 409} return {'content': json.dumps(error), 'status_code': 409}
return {'content': json.dumps({'message': 'ok'}), 'status_code': 200} return {'content': json.dumps({'message': 'ok'}), 'status_code': 200}
if url.path == '/clu/ws/renouvelerAbonnements': 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': if request_json.get('simulate_error') == 'wrong num serie':
error = {'statut': 'ERREUR_NUM_SERIE', 'erreur': 'Le numero de serie...'} error = {'statut': 'ERREUR_NUM_SERIE', 'erreur': 'Le numero de serie...'}
return {'content': json.dumps(error), 'status_code': 409} return {'content': json.dumps(error), 'status_code': 409}

View File

@ -2,13 +2,13 @@ import datetime
import json import json
import re import re
import uuid import uuid
from io import StringIO
import freezegun import freezegun
import pytest import pytest
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.files import File from django.core.files import File
from django.utils.encoding import force_bytes from django.utils.encoding import force_bytes
from django.utils.six import StringIO
from django.utils.timezone import now from django.utils.timezone import now
from webtest import Upload from webtest import Upload

View File

@ -18,6 +18,7 @@ from __future__ import unicode_literals
import base64 import base64
import copy import copy
import json
import os import os
import shutil import shutil
import zipfile 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.mdel import AttachedFile, Description, Message, get_resource_base_dir
from passerelle.apps.mdel.models import MDEL, Demand from passerelle.apps.mdel.models import MDEL, Demand
from passerelle.apps.mdel.utils import parse_date from passerelle.apps.mdel.utils import parse_date
from passerelle.compat import json_loads
from passerelle.utils import SFTP from passerelle.utils import SFTP
AEC_XSD = 'ActeEtatCivil-V1.A.xsd' AEC_XSD = 'ActeEtatCivil-V1.A.xsd'
@ -69,9 +69,9 @@ def setup(db):
@pytest.fixture( @pytest.fixture(
params=[ params=[
json_loads(get_file_from_test_base_dir('formdata_aec_naiss.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_mariage.json')),
json_loads(get_file_from_test_base_dir('formdata_aec_deces.json')), json.loads(get_file_from_test_base_dir('formdata_aec_deces.json')),
], ],
ids=['naissance', 'mariage', 'deces'], ids=['naissance', 'mariage', 'deces'],
) )
@ -79,7 +79,7 @@ def aec_payload(request):
return request.param 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(): 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): 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') payload['fields'].pop('date_acte')
resp = app.post_json('/mdel/test/create', params=payload, status=200) resp = app.post_json('/mdel/test/create', params=payload, status=200)
assert resp.json['err_desc'] == '<date_acte> is required' assert resp.json['err_desc'] == '<date_acte> 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): def test_create_ile_demand_type_invalid_document_proof(app, setup):
# test with missing key # 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') payload['fields'].pop('justificatif_domicile_hebergeur')
resp = app.post_json('/mdel/test/create', params=payload, status=200) resp = app.post_json('/mdel/test/create', params=payload, status=200)
assert resp.json['err_desc'] == 'justificatif_domicile and all its attributes are required' assert resp.json['err_desc'] == 'justificatif_domicile and all its attributes are required'
# test with invalid content # 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'] = None
payload['fields']['justificatif_identite_verso'] = None payload['fields']['justificatif_identite_verso'] = None
resp = app.post_json('/mdel/test/create', params=payload, status=200) 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): 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) resp = app.post_json('/mdel/test/create', params=aec_payload, status=200)
assert resp.json['data']['demand_id'] == '15-4-AEC-LA' assert resp.json['data']['demand_id'] == '15-4-AEC-LA'

View File

@ -1,4 +1,5 @@
import datetime import datetime
from io import StringIO
import mock import mock
import pytest import pytest
@ -8,7 +9,6 @@ from django.db import connection
from django.db.migrations.executor import MigrationExecutor from django.db.migrations.executor import MigrationExecutor
from django.urls import reverse from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.utils.six import StringIO
from mock import patch from mock import patch
from requests.exceptions import ReadTimeout from requests.exceptions import ReadTimeout

View File

@ -1,12 +1,13 @@
import json
from io import StringIO
import pytest import pytest
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.files import File from django.core.files import File
from django.test import Client from django.test import Client
from django.urls import reverse from django.urls import reverse
from django.utils.six import StringIO
from passerelle.base.models import AccessRight, ApiUser from passerelle.base.models import AccessRight, ApiUser
from passerelle.compat import json_loads
from passerelle.contrib.nancypoll.models import NancyPoll from passerelle.contrib.nancypoll.models import NancyPoll
data = """ data = """
@ -30,7 +31,7 @@ data = """
def parse_response(response): def parse_response(response):
return json_loads(response.content)['data'] return json.loads(response.content)['data']
@pytest.fixture @pytest.fixture
@ -50,7 +51,7 @@ def setup(db):
def test_failure(setup): def test_failure(setup):
url, client = setup url, client = setup
qs = {'street_no': '37000', 'street_name': 'Rue du Marechal Juin'} 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 resp['err_desc'] == 'Polling Station Not Found'
assert int(resp['err']) != 0 assert int(resp['err']) != 0
@ -60,8 +61,8 @@ def test_no_params(setup):
qs = {} qs = {}
resp = client.get(url, qs) resp = client.get(url, qs)
assert resp.status_code == 200 assert resp.status_code == 200
assert json_loads(resp.content)['err_desc'] == 'All parameters are required' assert json.loads(resp.content)['err_desc'] == 'All parameters are required'
assert int(json_loads(resp.content)['err']) != 0 assert int(json.loads(resp.content)['err']) != 0
def test_invalid_street_no(setup): def test_invalid_street_no(setup):
@ -69,8 +70,8 @@ def test_invalid_street_no(setup):
qs = {'street_no': 'lol', 'street_name': 'whatever'} qs = {'street_no': 'lol', 'street_name': 'whatever'}
resp = client.get(url, qs) resp = client.get(url, qs)
assert resp.status_code == 200 assert resp.status_code == 200
assert json_loads(resp.content)['err_desc'] == 'Invalid street no value' assert json.loads(resp.content)['err_desc'] == 'Invalid street no value'
assert int(json_loads(resp.content)['err']) != 0 assert int(json.loads(resp.content)['err']) != 0
def test_success_i_side(setup): def test_success_i_side(setup):

View File

@ -8,7 +8,6 @@ import pytest
import requests import requests
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.log import AdminEmailHandler from django.utils.log import AdminEmailHandler
from django.utils.six import PY2
from httmock import HTTMock from httmock import HTTMock
import tests.utils 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') assert not ResourceLog.objects.all()[1].extra.get('response_content')
# - connector error # - connector error
if PY2: assert ResourceLog.objects.all()[2].extra['body'] == 'user_query_var=11111111111111111111'
assert ResourceLog.objects.all()[2].extra['body'] == "'user_query_var=11111111111111111111'"
else:
assert ResourceLog.objects.all()[2].extra['body'] == 'user_query_var=11111111111111111111'
assert ( assert (
ResourceLog.objects.all()[2].extra['exception'] == "{'connector_error_var': '44444444444444444444'}" 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 # - connector POST queries
assert ResourceLog.objects.all()[1].extra['request_payload'] == "connector_query_var=22222222222222222222" 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'} assert ResourceLog.objects.all()[1].extra.get('response_headers') == {'Content-Type': 'foo/bar'}
if PY2: assert (
assert ( ResourceLog.objects.all()[1].extra.get('response_content')
ResourceLog.objects.all()[1].extra.get('response_content') == '{"service_reply_var": "33333333333333333333"}'
== '{"service_reply_var": "33333333333333333333"}' )
)
else:
assert (
ResourceLog.objects.all()[1].extra.get('response_content')
== '{"service_reply_var": "33333333333333333333"}'
)
# log troncated payloads # log troncated payloads
parameters = connector.logging_parameters 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' assert ResourceLog.objects.all()[1].extra['request_payload'] == 'connector_query_var=22222'
# - connector error # - connector error
if PY2: assert ResourceLog.objects.all()[2].extra['body'] == 'user_query_var=1111111111'
assert ResourceLog.objects.all()[2].extra['body'] == "'user_query_var=1111111111'"
else:
assert ResourceLog.objects.all()[2].extra['body'] == 'user_query_var=1111111111'
# log troncated service response # log troncated service response
parameters = connector.logging_parameters 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 assert len(ResourceLog.objects.all()) == 3
# - connector POST queries # - connector POST queries
if PY2: 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'
else:
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): def test_proxy_logger_email_traceback(app, db, email_handler, settings, mailoutbox, connector, monkeypatch):

View File

@ -16,6 +16,7 @@
import datetime import datetime
import os import os
from io import StringIO
from posix import stat_result from posix import stat_result
from stat import ST_MTIME from stat import ST_MTIME
@ -26,7 +27,6 @@ from django.core.files import File
from django.core.management import call_command from django.core.management import call_command
from django.urls import reverse from django.urls import reverse
from django.utils.encoding import force_str, force_text from django.utils.encoding import force_str, force_text
from django.utils.six import StringIO
from django.utils.timezone import now from django.utils.timezone import now
import tests.utils import tests.utils

View File

@ -1,10 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from io import StringIO
import mock import mock
import pytest import pytest
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.files import File from django.core.files import File
from django.utils.six import StringIO
import tests.utils import tests.utils
from passerelle.apps.solis.models import Solis, SolisAPALink, SolisRSALink, unflat from passerelle.apps.solis.models import Solis, SolisAPALink, SolisRSALink, unflat

View File

@ -17,7 +17,7 @@
import inspect import inspect
from django.apps import apps 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 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): def test_render_body_schemas(db):
# FIXME: db should be required but the way ProxyLogger is initialized force an access to the DB # FIXME: db should be required but the way ProxyLogger is initialized force an access to the DB
def collect_schemas(): def collect_schemas():
predicate = inspect.isfunction if six.PY3 else inspect.ismethod
for app in apps.get_app_configs(): for app in apps.get_app_configs():
connector_model = None connector_model = None
if not hasattr(app, 'get_connector_model'): if not hasattr(app, 'get_connector_model'):
@ -33,7 +32,7 @@ def test_render_body_schemas(db):
connector_model = app.get_connector_model() connector_model = app.get_connector_model()
if connector_model is None: if connector_model is None:
continue continue
for _, method in inspect.getmembers(connector_model, predicate): for _, method in inspect.getmembers(connector_model, inspect.isfunction):
if not hasattr(method, 'endpoint_info'): if not hasattr(method, 'endpoint_info'):
continue continue
if method.endpoint_info.post and method.endpoint_info.post.get('request_body', {}).get( if method.endpoint_info.post and method.endpoint_info.post.get('request_body', {}).get(

View File

@ -7,7 +7,6 @@ from django.contrib.contenttypes.models import ContentType
from django.urls import reverse from django.urls import reverse
from passerelle.base.models import AccessRight, ApiUser from passerelle.base.models import AccessRight, ApiUser
from passerelle.compat import json_loads
def generic_endpoint_url(connector, endpoint, slug='test'): def generic_endpoint_url(connector, endpoint, slug='test'):
@ -25,7 +24,7 @@ class FakedResponse(mock.Mock):
headers = {} headers = {}
def json(self): 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): def mock_url(url=None, response='', status_code=200, headers=None, reason=None, exception=None, qs=None):

View File

@ -16,6 +16,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import configparser
import contextlib import contextlib
import os import os
import pickle import pickle
@ -29,7 +30,6 @@ import time
import httmock import httmock
import psycopg2 import psycopg2
import pytest import pytest
from django.utils.six.moves import configparser as ConfigParser
def find_free_tcp_port(): def find_free_tcp_port():
@ -157,7 +157,7 @@ class WcsHost(object):
@property @property
@contextlib.contextmanager @contextlib.contextmanager
def site_options(self): def site_options(self):
config = ConfigParser.ConfigParser() config = configparser.ConfigParser()
site_options_path = os.path.join(self.app_dir, 'site-options.cfg') site_options_path = os.path.join(self.app_dir, 'site-options.cfg')
if os.path.exists(site_options_path): if os.path.exists(site_options_path):