From ae09ae97b60d0f2c2aba72f2a47421476611d48d Mon Sep 17 00:00:00 2001 From: Emmanuel Cazenave Date: Thu, 23 Jan 2020 15:31:49 +0100 Subject: [PATCH] use json_loads() instead of json.loads() (#38781) json.loads expects str in python >= 3, < 3.6. --- passerelle/apps/actesweb/models.py | 4 ++-- passerelle/apps/base_adresse/models.py | 4 ++-- passerelle/apps/bdp/views.py | 5 ++--- passerelle/apps/cityweb/models.py | 4 ++-- passerelle/apps/clicrdv/views.py | 5 ++--- passerelle/apps/cmis/models.py | 4 ++-- passerelle/apps/family/models.py | 6 +++--- passerelle/apps/gdc/views.py | 4 ++-- passerelle/apps/jsondatastore/models.py | 4 ++-- passerelle/apps/mdel/models.py | 4 ++-- passerelle/apps/okina/models.py | 7 ++++--- passerelle/apps/pastell/views.py | 5 ++--- passerelle/apps/solis/models.py | 12 ++++++------ passerelle/compat.py | 10 ++++++++++ passerelle/contrib/agoraplus/views.py | 14 +++++++------- passerelle/contrib/dpark/models.py | 12 ++++++------ passerelle/contrib/gdema/models.py | 3 ++- .../contrib/grandlyon_streetsections/models.py | 4 ++-- passerelle/contrib/greco/models.py | 8 ++++---- passerelle/contrib/grenoble_gru/models.py | 7 +++---- passerelle/contrib/lille_urban_card/models.py | 4 ++-- passerelle/contrib/maarch/views.py | 4 ++-- .../contrib/meyzieu_newsletters/views.py | 5 ++--- passerelle/contrib/seisin_by_email/views.py | 5 ++--- passerelle/contrib/solis_apa/models.py | 3 ++- passerelle/contrib/strasbourg_eu/models.py | 8 ++++---- passerelle/contrib/teamnet_axel/models.py | 4 ++-- passerelle/contrib/toulouse_axel/models.py | 4 ++-- passerelle/sms/__init__.py | 4 ++-- passerelle/views.py | 3 ++- tests/test_actesweb.py | 2 +- tests/test_arcgis_nancy.py | 4 ++-- tests/test_cartads_cs.py | 5 +++-- tests/test_cityweb.py | 2 +- tests/test_csv_datasource.py | 14 +++++++------- tests/test_import_export.py | 5 +++-- tests/test_jsonresponse.py | 12 ++++++------ tests/test_lille_urban_card.py | 3 ++- tests/test_mdel.py | 18 +++++++++--------- tests/test_nancypoll.py | 15 +++++++-------- tests/utils.py | 3 ++- 41 files changed, 132 insertions(+), 121 deletions(-) create mode 100644 passerelle/compat.py diff --git a/passerelle/apps/actesweb/models.py b/passerelle/apps/actesweb/models.py index 5f8a6785..828f1b57 100644 --- a/passerelle/apps/actesweb/models.py +++ b/passerelle/apps/actesweb/models.py @@ -15,7 +15,6 @@ # along with this program. If not, see . from __future__ import unicode_literals -import json import os import stat import tempfile @@ -29,6 +28,7 @@ from django.utils.timezone import now from django.utils.translation import ugettext_lazy as _ from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint from passerelle.utils.jsonresponse import APIError from passerelle.utils.conversion import ensure_encoding @@ -52,7 +52,7 @@ class ActesWeb(BaseResource): @endpoint(perm='can_access', methods=['post'], description=_('Create demand')) def create(self, request, *args, **kwargs): try: - payload = json.loads(request.body) + payload = json_loads(request.body) except (ValueError,): raise APIError('Invalid payload format: json expected') diff --git a/passerelle/apps/base_adresse/models.py b/passerelle/apps/base_adresse/models.py index 4ef283bd..65d70158 100644 --- a/passerelle/apps/base_adresse/models.py +++ b/passerelle/apps/base_adresse/models.py @@ -1,5 +1,4 @@ import bz2 -import json import unicodedata from requests import RequestException @@ -13,6 +12,7 @@ from django.utils import six from django.utils.six.moves.urllib import parse as urlparse from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint from passerelle.utils.conversion import simplify from passerelle.utils.jsonresponse import APIError @@ -288,7 +288,7 @@ class BaseAdresse(BaseResource): line = _not_found = object() for line in bz2.decompress(ban_file.content).splitlines(): - street_info = json.loads(line) + street_info = json_loads(line) if street_info['type'] == 'street' and street_info['postcode'].startswith(zipcodes): if type(street_info['citycode']) is list: street_info['citycode'] = six.text_type(street_info['citycode'][0]) diff --git a/passerelle/apps/bdp/views.py b/passerelle/apps/bdp/views.py index d3491141..9fea8b8c 100644 --- a/passerelle/apps/bdp/views.py +++ b/passerelle/apps/bdp/views.py @@ -1,9 +1,8 @@ -import json - from django.http import Http404 from django.views.generic.base import View from django.views.generic.detail import SingleObjectMixin, DetailView +from passerelle.compat import json_loads import passerelle.utils as utils from .models import Bdp @@ -41,7 +40,7 @@ class PostAdherentView(View, SingleObjectMixin): @utils.protected_api('can_access') @utils.to_json() def post(self, request, *args, **kwargs): - data = json.loads(request.body) # JSON w.c.s. formdata + data = json_loads(request.body) # JSON w.c.s. formdata date_de_naissance = data['fields'].get('date_de_naissance') # force 1973-04-18T00:00:00Z date_de_naissance = date_de_naissance[:10] + 'T00:00:00Z' diff --git a/passerelle/apps/cityweb/models.py b/passerelle/apps/cityweb/models.py index 0474039a..879aeaf0 100644 --- a/passerelle/apps/cityweb/models.py +++ b/passerelle/apps/cityweb/models.py @@ -15,12 +15,12 @@ # along with this program. If not, see . import os -import json from django.utils.translation import ugettext_lazy as _ from django.core.files.storage import default_storage from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint from passerelle.utils.jsonresponse import APIError @@ -40,7 +40,7 @@ class CityWeb(BaseResource): @endpoint(perm='can_access', methods=['post'], description=_('Create a demand')) def create(self, request, *args, **kwargs): - payload = json.loads(request.body) + payload = json_loads(request.body) # check mandatory keys for key in ('application_id', 'application_time', 'certificate_type'): if key not in payload: diff --git a/passerelle/apps/clicrdv/views.py b/passerelle/apps/clicrdv/views.py index 1b2a5e1f..4d67d9e3 100644 --- a/passerelle/apps/clicrdv/views.py +++ b/passerelle/apps/clicrdv/views.py @@ -1,8 +1,7 @@ -import json - from django.views.generic.base import View from django.views.generic.detail import SingleObjectMixin, DetailView +from passerelle.compat import json_loads import passerelle.utils as utils from passerelle.apps.clicrdv.models import ClicRdv @@ -85,7 +84,7 @@ class CreateAppointmentView(View, SingleObjectMixin): def post(self, request, intervention_id=None, *args, **kwargs): if intervention_id is None: intervention_id = self.request.GET.get('intervention') - data = json.loads(request.body) + data = json_loads(request.body) return {'data': self.get_object().create_appointment( intervention_id, self.request.GET.get('websource'), diff --git a/passerelle/apps/cmis/models.py b/passerelle/apps/cmis/models.py index 9a7a992a..2729f108 100644 --- a/passerelle/apps/cmis/models.py +++ b/passerelle/apps/cmis/models.py @@ -18,7 +18,6 @@ import base64 import binascii import functools import httplib2 -import json import re from cmislib import CmisClient @@ -32,6 +31,7 @@ from django.utils.six import StringIO, text_type from django.utils.six.moves.urllib import error as urllib2 from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint from passerelle.utils.jsonresponse import APIError @@ -78,7 +78,7 @@ class CmisConnector(BaseResource): return a tuple (error, error_msg, data) """ try: - data = json.loads(body) + data = json_loads(body) except ValueError as e: return True, "could not decode body to json: %s" % e, None if 'file' not in data: diff --git a/passerelle/apps/family/models.py b/passerelle/apps/family/models.py index 30731a64..c4985b08 100644 --- a/passerelle/apps/family/models.py +++ b/passerelle/apps/family/models.py @@ -17,7 +17,6 @@ # along with this program. If not, see . from datetime import date, time -import json import os import shutil import sys @@ -34,6 +33,7 @@ from django.db import models, transaction from django.utils.timezone import make_aware, datetime, get_current_timezone, now, is_naive from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint SEXES = ( @@ -187,7 +187,7 @@ class GenericFamily(BaseResource): adults = [] for f in family_files: - family_data = json.loads(archive.read(f)) + family_data = json_loads(archive.read(f)) families.append(family_data['id']) address = family_data.get('address') or {} family_data.update(address) @@ -366,7 +366,7 @@ class GenericFamily(BaseResource): @endpoint(name='regie', methods=['post'], perm='can_access', pattern='^invoice/(?P\w+)/pay/$') def pay_invoice(self, request, invoice_id, **kwargs): - data = json.loads(request.body) + data = json_loads(request.body) invoice = self.get_invoice(invoice_id) if not invoice: return {'data': False} diff --git a/passerelle/apps/gdc/views.py b/passerelle/apps/gdc/views.py index f6b1d401..ae9af14d 100644 --- a/passerelle/apps/gdc/views.py +++ b/passerelle/apps/gdc/views.py @@ -1,10 +1,10 @@ -import json import unicodedata from django.http import Http404 from django.views.generic.base import View from django.views.generic.detail import SingleObjectMixin, DetailView +from passerelle.compat import json_loads import passerelle.utils as utils from .models import Gdc, phpserialize, phpserialize_loads, SOAPpy @@ -125,7 +125,7 @@ class PostDemandeView(View, SingleObjectMixin): # if SOAPpy is None: raise Http404 - data = json.loads(request.body) + data = json_loads(request.body) server = SOAPpy.SOAPProxy(self.get_object().service_url) voie_id = data['fields'].get('voie_raw') voie_str = data['fields'].get('voie') diff --git a/passerelle/apps/jsondatastore/models.py b/passerelle/apps/jsondatastore/models.py index 65880d6b..0e335e9e 100644 --- a/passerelle/apps/jsondatastore/models.py +++ b/passerelle/apps/jsondatastore/models.py @@ -14,7 +14,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import json import uuid from django.db import models @@ -24,6 +23,7 @@ from django.utils.translation import ugettext_lazy as _ from jsonfield import JSONField from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint, APIError from passerelle.utils.conversion import simplify @@ -34,7 +34,7 @@ def get_hex_uuid(): def clean_json_data(data): try: - payload = json.loads(data) + payload = json_loads(data) if not isinstance(payload, dict): raise APIError('payload must be a dict') return payload diff --git a/passerelle/apps/mdel/models.py b/passerelle/apps/mdel/models.py index 7d7ead93..78b322bd 100644 --- a/passerelle/apps/mdel/models.py +++ b/passerelle/apps/mdel/models.py @@ -16,13 +16,13 @@ # along with this program. If not, see . import os -import json from django.db import models from django.utils import six from django.utils.translation import ugettext_lazy as _ from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint from passerelle.utils.jsonresponse import APIError @@ -87,7 +87,7 @@ class MDEL(BaseResource): def create(self, request, *args, **kwargs): """Create a demand """ - formdata = json.loads(request.body) + formdata = json_loads(request.body) extra = formdata.pop('extra', {}) fields = formdata.pop('fields', {}) diff --git a/passerelle/apps/okina/models.py b/passerelle/apps/okina/models.py index 76257f75..64989d8c 100644 --- a/passerelle/apps/okina/models.py +++ b/passerelle/apps/okina/models.py @@ -21,6 +21,7 @@ from django.http import HttpResponse from django.utils.translation import ugettext_lazy as _ from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint from passerelle.utils.jsonresponse import APIError @@ -190,7 +191,7 @@ class Okina(BaseResource): @endpoint(name='subscriber', methods=['post'], perm='can_access') def create_subscriber(self, request): try: - payload = json.loads(request.body) + payload = json_loads(request.body) except ValueError: raise APIError('payload must be a JSON object', http_status=400) if not isinstance(payload, dict): @@ -208,7 +209,7 @@ class Okina(BaseResource): qrcode = self.request('subscribers/%s/qrcode' % subscriber_id, result_is_json=False) content_type = qrcode.headers.get('Content-Type') if not (content_type and content_type.startswith('image/')): - response = json.loads(qrcode.content) + response = json_loads(qrcode.content) raise APIError(response['message'], http_status=response['status'], err=response['code']) @@ -217,7 +218,7 @@ class Okina(BaseResource): @endpoint(name='subscription', methods=['post'], perm='can_access') def create_subscription(self, request): try: - payload = json.loads(request.body) + payload = json_loads(request.body) except ValueError: raise APIError('payload must be a JSON object', http_status=400) if not isinstance(payload, dict): diff --git a/passerelle/apps/pastell/views.py b/passerelle/apps/pastell/views.py index c4ba70d1..c030185d 100644 --- a/passerelle/apps/pastell/views.py +++ b/passerelle/apps/pastell/views.py @@ -1,9 +1,8 @@ -import json - from django.views.generic.base import View from django.views.generic.detail import SingleObjectMixin, DetailView from django.views.generic.edit import UpdateView +from passerelle.compat import json_loads import passerelle.utils as utils from .models import Pastell @@ -14,7 +13,7 @@ class PostView(View, SingleObjectMixin): @utils.protected_api('can_post_document') def post(self, request, *args, **kwargs): - data = json.loads(request.body) + data = json_loads(request.body) self.get_object().create_document(data) result = {'result': 'ok'} return utils.response_for_json(request, result) diff --git a/passerelle/apps/solis/models.py b/passerelle/apps/solis/models.py index 788195f8..951acfe1 100644 --- a/passerelle/apps/solis/models.py +++ b/passerelle/apps/solis/models.py @@ -16,7 +16,6 @@ import base64 import copy -import json import re import unicodedata @@ -27,6 +26,7 @@ from django.utils.translation import ugettext_lazy as _ from django.utils.http import urlencode from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint from passerelle.utils.jsonresponse import APIError from passerelle.utils.conversion import to_pdf @@ -264,7 +264,7 @@ class Solis(BaseResource): 'Solis APA. Payload: name_id, user_id, code')) def apa_link(self, request): try: - data = json.loads(request.body) + data = json_loads(request.body) except ValueError: raise APIError('payload is not a JSON dict') if not isinstance(data, dict): @@ -289,7 +289,7 @@ class Solis(BaseResource): description=_('Delete a Solis APA link. Payload: name_id, user_id')) def apa_unlink(self, request): try: - data = json.loads(request.body) + data = json_loads(request.body) except ValueError: raise APIError('payload is not a JSON dict') if not isinstance(data, dict): @@ -391,7 +391,7 @@ class Solis(BaseResource): description=_('Send data to "integrationDemandeApa"')) def apa_integration(self, request): try: - payload = json.loads(request.body) + payload = json_loads(request.body) except ValueError: raise APIError('payload is not a JSON object', http_status=400) if not isinstance(payload, dict): @@ -533,7 +533,7 @@ class Solis(BaseResource): 'Solis RSA. Payload: name_id, user_id, code, dob (optionnal)')) def rsa_link(self, request): try: - data = json.loads(request.body) + data = json_loads(request.body) except ValueError: raise APIError('payload is not a JSON dict') if not isinstance(data, dict): @@ -561,7 +561,7 @@ class Solis(BaseResource): description=_('Delete a Solis RSA link. Payload: name_id, user_id')) def rsa_unlink(self, request): try: - data = json.loads(request.body) + data = json_loads(request.body) except ValueError: raise APIError('payload is not a JSON dict') if not isinstance(data, dict): diff --git a/passerelle/compat.py b/passerelle/compat.py new file mode 100644 index 00000000..e987c028 --- /dev/null +++ b/passerelle/compat.py @@ -0,0 +1,10 @@ +import json + +from django.utils import six +from django.utils.encoding import force_text + + +def json_loads(value): + if six.PY3: + value = force_text(value) + return json.loads(value) diff --git a/passerelle/contrib/agoraplus/views.py b/passerelle/contrib/agoraplus/views.py index c130c714..fcc74fae 100644 --- a/passerelle/contrib/agoraplus/views.py +++ b/passerelle/contrib/agoraplus/views.py @@ -14,7 +14,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import json import unicodedata import logging @@ -26,6 +25,7 @@ from django.http import HttpResponse, HttpResponseBadRequest, Http404, HttpRespo from django.utils.translation import ugettext_lazy as _ from django.utils.http import urlencode +from passerelle.compat import json_loads import passerelle.utils as utils from .models import AgoraPlus, AgoraPlusLink, AgoraAPIError @@ -356,7 +356,7 @@ class SasView(DetailView): def post(self, request, *args, **kwargs): self.object = self.get_object() self.set_user_from_request(request) - data = json.loads(request.body) + data = json_loads(request.body) formdata = Formdata(data) name_id = formdata.get('NameID') if not name_id: @@ -469,7 +469,7 @@ class PostFormdataView(DetailView): def post(self, request, *args, **kwargs): self.object = self.get_object() self.set_user_from_request(request) - data = json.loads(request.body) + data = json_loads(request.body) formdata = Formdata(data) return {'data': self.post_data(formdata)} @@ -538,7 +538,7 @@ class PeriscolAddReservationView(DetailView): def post(self, request, *args, **kwargs): self.object = self.get_object() try: - data = json.loads(request.body) + data = json_loads(request.body) enrollment_id = int(data['enrollment_id']) dates = data['dates'] tarif_id = int(data['tarif_id']) @@ -557,7 +557,7 @@ class PeriscolDeleteReservationsView(DetailView): @utils.protected_api('can_access') def post(self, request, *args, **kwargs): self.object = self.get_object() - data = json.loads(request.body) + data = json_loads(request.body) return self.object.delete_periscol_enrollment_reservations(data['activity_id'], data['dates']) @@ -584,7 +584,7 @@ class InvoicePayView(DetailView): @utils.protected_api('can_access') def post(self, request, *args, **kwargs): self.object = self.get_object() - data = json.loads(request.body) + data = json_loads(request.body) return {'data': self.object.pay_invoice(kwargs['invoice_id'], data['transaction_id'], data['transaction_date'])} @@ -614,7 +614,7 @@ class DocumentView(DetailView): def post(self, request, *args, **kwargs): self.object = self.get_object() try: - data = json.loads(request.body) + data = json_loads(request.body) uri = data['uri'] content_type = data['content_type'] except (ValueError, TypeError, KeyError) as e: diff --git a/passerelle/contrib/dpark/models.py b/passerelle/contrib/dpark/models.py index cec289a7..d34c36eb 100644 --- a/passerelle/contrib/dpark/models.py +++ b/passerelle/contrib/dpark/models.py @@ -17,7 +17,6 @@ from __future__ import unicode_literals import base64 -import json from django.conf import settings from django.db import models @@ -29,6 +28,7 @@ from zeep.exceptions import Fault as WebFault from zeep.helpers import serialize_object from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint from passerelle.utils.jsonresponse import APIError from passerelle.utils.conversion import to_pdf @@ -262,7 +262,7 @@ class DPark(BaseResource): @endpoint(perm='can_access', methods=['post'], description=_('Register a subscription application')) def register(self, request, *args, **kwargs): - data = json.loads(request.body) + data = json_loads(request.body) is_erroneous( data, ( 'application_id', 'applicant_title', 'applicant_lastname', 'applicant_firstnames', @@ -312,7 +312,7 @@ class DPark(BaseResource): @endpoint(perm='can_access', methods=['post'], description=_('Link user to a subscription')) def link(self, request, *args, **kwargs): - data = json.loads(request.body) + data = json_loads(request.body) if 'nameid' not in data: raise WrongParameter(['nameid'], []) result = self.check_file_exists(data) @@ -326,7 +326,7 @@ class DPark(BaseResource): @endpoint(perm='can_access', methods=['post'], description=_('Unlink user to subscription')) def unlink(self, request, *args, **kwargs): - data = json.loads(request.body) + data = json_loads(request.body) is_erroneous(data, ('nameid',)) pairings = Pairing.objects.filter(**data) if pairings.exists() is False: @@ -406,7 +406,7 @@ class DPark(BaseResource): @endpoint(name='notify-payment', perm='can_access', methods=['post'], description=_('Notify a payment')) def payment_notification(self, request, *args, **kwargs): - data = json.loads(request.body) + data = json_loads(request.body) is_erroneous( data, ('nameid', 'filenumber', @@ -436,7 +436,7 @@ class DPark(BaseResource): @endpoint(name='send-files', perm='can_access', methods=['post'], description=_('Send supporting documents')) def send_files(self, request, *args, **kwargs): try: - data = json.loads(request.body) + data = json_loads(request.body) except ValueError as exc: raise APIError(str(exc), http_status=400) diff --git a/passerelle/contrib/gdema/models.py b/passerelle/contrib/gdema/models.py index 2642a8bc..66d129ef 100644 --- a/passerelle/contrib/gdema/models.py +++ b/passerelle/contrib/gdema/models.py @@ -25,6 +25,7 @@ from django.utils.six import string_types from django.utils.translation import ugettext_lazy as _ from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint from passerelle.utils.jsonresponse import APIError @@ -235,7 +236,7 @@ class Gdema(BaseResource): methods=['post'], perm='can_access') def create_request(self, request): try: - payload = json.loads(request.body) + payload = json_loads(request.body) except ValueError: raise APIError('payload must be a JSON object', http_status=400) if not isinstance(payload, dict): diff --git a/passerelle/contrib/grandlyon_streetsections/models.py b/passerelle/contrib/grandlyon_streetsections/models.py index 1b39d7da..fd3171db 100644 --- a/passerelle/contrib/grandlyon_streetsections/models.py +++ b/passerelle/contrib/grandlyon_streetsections/models.py @@ -14,7 +14,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import json import re from django.db import models @@ -23,6 +22,7 @@ from django.utils.text import slugify from django.utils.translation import ugettext_lazy as _ from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint COMMUNE_EXTRA_MAPPING = { @@ -85,7 +85,7 @@ class GrandLyonStreetSections(BaseResource): update_start = timezone.now() sections = self.requests.get( 'https://download.data.grandlyon.com/ws/grandlyon/adr_voie_lieu.adraxevoie/all.json?maxfeatures=1000000').content - for value in json.loads(sections).get('values'): + for value in json_loads(sections).get('values'): section, created = StreetSection.objects.get_or_create( codefuv=value.get('codefuv'), codetroncon=value.get('codetroncon')) diff --git a/passerelle/contrib/greco/models.py b/passerelle/contrib/greco/models.py index f4ad82fd..595d61e7 100644 --- a/passerelle/contrib/greco/models.py +++ b/passerelle/contrib/greco/models.py @@ -14,7 +14,6 @@ # along with this program. If not, see . import base64 -import json import re from email import encoders @@ -35,6 +34,7 @@ from django.utils.translation import ugettext_lazy as _ from django.core.cache import cache from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint, APIError from passerelle.soap import sudsobject_to_dict @@ -198,7 +198,7 @@ class Greco(BaseResource): def create(self, request): # get creation fields from payload try: - formdata = FormData(json.loads(request.body), CREATION_SCHEMA) + formdata = FormData(json_loads(request.body), CREATION_SCHEMA) except ValueError as e: raise ParameterTypeError(str(e)) # create suds object from formdata @@ -244,7 +244,7 @@ class Greco(BaseResource): methods=['get', 'post', 'put', 'patch']) def add_information(self, request, iddemande=None, idgreco=None, information=None): if request.body: - payload = json.loads(request.body) + payload = json_loads(request.body) if not isinstance(payload, dict): raise ParameterTypeError('payload must be a dict') idgreco = payload.get('idgreco') or idgreco @@ -263,7 +263,7 @@ class Greco(BaseResource): methods=['get', 'post', 'put', 'patch']) def update(self, request, iddemande=None, idgreco=None, comment=None): if request.body: - payload = json.loads(request.body) + payload = json_loads(request.body) if not isinstance(payload, dict): raise ParameterTypeError('payload must be a dict') idgreco = payload.get('idgreco') or idgreco diff --git a/passerelle/contrib/grenoble_gru/models.py b/passerelle/contrib/grenoble_gru/models.py index 3b4782f9..777800b6 100644 --- a/passerelle/contrib/grenoble_gru/models.py +++ b/passerelle/contrib/grenoble_gru/models.py @@ -14,8 +14,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import json - from lxml import etree from django.core.cache import cache @@ -26,6 +24,7 @@ from django.utils.http import urlencode from django.utils.six.moves.urllib import parse as urlparse from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint from passerelle.utils.jsonresponse import APIError from passerelle.views import WrongParameter @@ -184,7 +183,7 @@ class GrenobleGRU(BaseResource): @endpoint(name='create-demand', perm='can_access', methods=['post'], description=_('Create a demand')) def create_demand(self, request, *args, **kwargs): try: - payload = self.build_gru_params(json.loads(request.body)) + payload = self.build_gru_params(json_loads(request.body)) except (KeyError, ValueError) as e: raise APIError(e) response = self.request('ws_creation_demande.php', payload) @@ -195,7 +194,7 @@ class GrenobleGRU(BaseResource): @endpoint(name='demand', perm='can_access', methods=['post'], description=_('Add attachment to a demand'), pattern=r'(?P[\w-]+)/add-attachment/$',) def add_attachment_to_demand(self, request, demand_id, **kwargs): - data = json.loads(request.body) + data = json_loads(request.body) if 'file' not in data: raise WrongParameter(['file'], []) file_data = data['file'] diff --git a/passerelle/contrib/lille_urban_card/models.py b/passerelle/contrib/lille_urban_card/models.py index 7afa3d98..30bb4895 100644 --- a/passerelle/contrib/lille_urban_card/models.py +++ b/passerelle/contrib/lille_urban_card/models.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import json import re from django.db import models @@ -24,6 +23,7 @@ from django.utils.six.moves.urllib_parse import urljoin from django.utils.translation import ugettext_lazy as _ from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint from passerelle.utils.http_authenticators import HttpBearerAuth from passerelle.utils.jsonresponse import APIError @@ -82,7 +82,7 @@ class LilleUrbanCard(BaseResource): @endpoint(perm='can_access', description=_('Card Request'), methods=['post']) def card_request(self, request, *args, **kwargs): - data = json.loads(request.body) + data = json_loads(request.body) for kind_of_optional_field in ('nom_naissance', 'telephone', 'complement_numero_voie'): if not data.get(kind_of_optional_field): data[kind_of_optional_field] = '' diff --git a/passerelle/contrib/maarch/views.py b/passerelle/contrib/maarch/views.py index 0486a281..ca2d692f 100644 --- a/passerelle/contrib/maarch/views.py +++ b/passerelle/contrib/maarch/views.py @@ -14,7 +14,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import json import requests from datetime import datetime import logging @@ -24,6 +23,7 @@ from django.utils.decorators import method_decorator from django.utils.six.moves.urllib import parse as urlparse from django.views.decorators.csrf import csrf_exempt +from passerelle.compat import json_loads import passerelle.utils as utils from passerelle.soap import sudsobject_to_dict, client_to_jsondict @@ -72,7 +72,7 @@ class ResourceView(DetailView): @utils.protected_api('can_access') def post(self, request, *args, **kwargs): client = self.get_client() - formdata = json.loads(request.body) + formdata = json_loads(request.body) extras = formdata.get('extra', {}) debug = 'debug' in request.GET diff --git a/passerelle/contrib/meyzieu_newsletters/views.py b/passerelle/contrib/meyzieu_newsletters/views.py index 9a1aedea..2d0c1a95 100644 --- a/passerelle/contrib/meyzieu_newsletters/views.py +++ b/passerelle/contrib/meyzieu_newsletters/views.py @@ -14,11 +14,10 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import json - from django.views.generic import DetailView as GenericDetailView, View from django.views.decorators.csrf import csrf_exempt +from passerelle.compat import json_loads import passerelle.utils as utils from .models import MeyzieuNewsletters @@ -69,7 +68,7 @@ class NewslettersSubscriptionsView(DetailView): def post(self, request, *args, **kwargs): email = request.GET.get('email') assert email, 'missing email parameter' - data = json.loads(request.body) + data = json_loads(request.body) return {'data': self.get_object().set_subscriptions(email, data)} def get_data(self, request, *args, **kwargs): diff --git a/passerelle/contrib/seisin_by_email/views.py b/passerelle/contrib/seisin_by_email/views.py index 2711b95d..ba122f91 100644 --- a/passerelle/contrib/seisin_by_email/views.py +++ b/passerelle/contrib/seisin_by_email/views.py @@ -14,12 +14,11 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import json - from django.views.generic import DetailView as GenericDetailView from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt +from passerelle.compat import json_loads import passerelle.utils as utils from passerelle.soap import sudsobject_to_dict, client_to_jsondict @@ -64,7 +63,7 @@ class ResourceView(DetailView): @utils.protected_api('can_access') def post(self, request, *args, **kwargs): client = self.get_client() - formdata = json.loads(request.body) + formdata = json_loads(request.body) fields = formdata.get('fields', {}) extras = formdata.get('extra', {}) diff --git a/passerelle/contrib/solis_apa/models.py b/passerelle/contrib/solis_apa/models.py index aa772bea..5d19870b 100644 --- a/passerelle/contrib/solis_apa/models.py +++ b/passerelle/contrib/solis_apa/models.py @@ -26,6 +26,7 @@ from django.utils.translation import ugettext_lazy as _ from django.http import HttpResponse from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.contrib.solis_apa import conciliation, suivi, integration HEADERS = { @@ -315,7 +316,7 @@ class SolisAPA(BaseResource): uri = 'importFlow?flow=ImportIntegrationDemande&application=%s' %APPLICATION url = self.get_resource_url(uri) - data = {'ImportInputWSDemandeApa': integration.build_message(json.loads(data))} + data = {'ImportInputWSDemandeApa': integration.build_message(json_loads(data))} data = json.dumps(data) self.logger.debug('Demande APA: %s' % data, extra={'solis_apa_demande': data}) response = self.requests.post(url, data=data, headers=HEADERS) diff --git a/passerelle/contrib/strasbourg_eu/models.py b/passerelle/contrib/strasbourg_eu/models.py index 80dafb6d..5855b07e 100644 --- a/passerelle/contrib/strasbourg_eu/models.py +++ b/passerelle/contrib/strasbourg_eu/models.py @@ -15,7 +15,6 @@ # along with this program. If not, see . import datetime -import json from django.db import models from django.utils.encoding import force_text @@ -23,6 +22,7 @@ from django.utils.six.moves.urllib import parse as urlparse from django.utils.translation import ugettext_lazy as _ from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint, APIError @@ -49,7 +49,7 @@ class StrasbourgEu(BaseResource): if name_id is None: raise APIError('missing name_id') # expected content: {"interests": ["123", "456"]} - response = json.loads(request.body) + response = json_loads(request.body) if 'error ' in response: return {'err': 1, 'err_desc': response.get('error')} interests = response.get('interests') @@ -102,7 +102,7 @@ class StrasbourgEu(BaseResource): else: # expected content: {"title": ..., "description": ..., "url": ..., # ...}, cf https://strasbourgeurometropole.github.io/slate/#ajout-d-39-une-notification - notification = json.loads(request.body) + notification = json_loads(request.body) notification['userId'] = name_id url = urlparse.urljoin(self.liferay_api_url, 'jsonws/notification.notification/add-notification') response = self.requests.post(url, data=notification).json() @@ -128,7 +128,7 @@ class StrasbourgEu(BaseResource): else: # expected content: {"title": ..., "url": ..., ...}, # cf https://strasbourgeurometropole.github.io/slate/?shell#ajout-d-39-un-favori - favorite = json.loads(request.body) + favorite = json_loads(request.body) # change type to typeId types_url = urlparse.urljoin(self.liferay_api_url, 'jsonws/favorite.favorite/get-types') types = self.requests.get(types_url).json() diff --git a/passerelle/contrib/teamnet_axel/models.py b/passerelle/contrib/teamnet_axel/models.py index 1d240fa7..6cee3bf4 100644 --- a/passerelle/contrib/teamnet_axel/models.py +++ b/passerelle/contrib/teamnet_axel/models.py @@ -16,7 +16,6 @@ import base64 from datetime import datetime -import json import logging import xml.etree.ElementTree as ET @@ -29,6 +28,7 @@ from django.utils.encoding import smart_text from jsonfield import JSONField from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.soap import client_to_jsondict from passerelle.utils.api import endpoint from passerelle.utils.jsonresponse import APIError @@ -316,7 +316,7 @@ class TeamnetAxel(BaseResource): @endpoint(name='regie', methods=['post'], perm='can_access', pattern='^(?P\w+)/invoice/(?P[\w,-]+)/pay/$') def pay_invoice(self, request, regie_id, invoice_id, **kwargs): - data = json.loads(request.body) + data = json_loads(request.body) transaction_id = data.get('transaction_id') transaction_date = data.get('transaction_date') email = data.get('email') diff --git a/passerelle/contrib/toulouse_axel/models.py b/passerelle/contrib/toulouse_axel/models.py index ffa8af78..25e31fd1 100644 --- a/passerelle/contrib/toulouse_axel/models.py +++ b/passerelle/contrib/toulouse_axel/models.py @@ -17,7 +17,6 @@ import base64 import copy import datetime -import json import logging import os import re @@ -33,6 +32,7 @@ from django.utils.translation import ugettext_lazy as _ import xmlschema from passerelle.base.models import BaseResource +from passerelle.compat import json_loads from passerelle.utils.api import endpoint from passerelle.utils.jsonresponse import APIError from passerelle.utils.xml import JSONSchemaFromXMLSchema @@ -959,7 +959,7 @@ class ToulouseAxel(BaseResource): } }) def pay_invoice(self, request, regie_id, invoice_id, **kwargs): - data = json.loads(request.body) + data = json_loads(request.body) dui, invoice_id = invoice_id.split('-') invoice = self.get_invoice(regie_id=regie_id, dui=dui, invoice_id=invoice_id) diff --git a/passerelle/sms/__init__.py b/passerelle/sms/__init__.py index 35d86ea3..5e5c1b24 100644 --- a/passerelle/sms/__init__.py +++ b/passerelle/sms/__init__.py @@ -1,9 +1,9 @@ -import json import logging import re from django.utils import six from django.utils.translation import ugettext_lazy as _ +from passerelle.compat import json_loads from passerelle.utils.api import endpoint from passerelle.utils.jsonresponse import APIError @@ -40,7 +40,7 @@ class SMSGatewayMixin(object): @endpoint(perm='can_send_messages', methods=['post']) def send(self, request, *args, **kwargs): try: - data = json.loads(request.body) + data = json_loads(request.body) assert isinstance(data, dict), 'JSON payload is not a dict' assert 'message' in data, 'missing "message" in JSON payload' assert 'from' in data, 'missing "from" in JSON payload' diff --git a/passerelle/views.py b/passerelle/views.py index 6ebd766f..2065f13b 100644 --- a/passerelle/views.py +++ b/passerelle/views.py @@ -46,6 +46,7 @@ from dateutil import parser as date_parser from jsonschema import validate, ValidationError from passerelle.base.models import BaseResource, ResourceLog +from passerelle.compat import json_loads from passerelle.utils.jsonresponse import APIError from passerelle.utils.json import unflatten @@ -350,7 +351,7 @@ class GenericEndpointView(GenericConnectorMixin, SingleObjectMixin, View): merge_extra = hasattr(json_schema, 'items') and json_schema.get('merge_extra', False) pre_process = hasattr(json_schema, 'items') and json_schema.get('pre_process') try: - data = json.loads(request.body) + data = json_loads(request.body) except ValueError as e: raise APIError("could not decode body to json: %s" % e, http_status=400) if must_unflatten: diff --git a/tests/test_actesweb.py b/tests/test_actesweb.py index 34717401..77c88329 100644 --- a/tests/test_actesweb.py +++ b/tests/test_actesweb.py @@ -36,7 +36,7 @@ def get_test_base_dir(name): def get_file_from_test_base_dir(filename): path = os.path.join(get_test_base_dir('actesweb'), filename) - with open(path, 'rb') as fd: + with open(path, 'r') as fd: return fd.read() diff --git a/tests/test_arcgis_nancy.py b/tests/test_arcgis_nancy.py index 5bbd73d7..3c2ba694 100644 --- a/tests/test_arcgis_nancy.py +++ b/tests/test_arcgis_nancy.py @@ -1,5 +1,4 @@ import os -import json import pytest import mock @@ -9,6 +8,7 @@ from django.core.urlresolvers import reverse from django.contrib.contenttypes.models import ContentType from passerelle.apps.arcgis.models import ArcGIS +from passerelle.compat import json_loads from passerelle.base.models import ApiUser, AccessRight @@ -23,7 +23,7 @@ def get_file_content(filename): class MockedRequestsResponse(mock.Mock): def json(self): - return json.loads(self.content) + return json_loads(self.content) @pytest.fixture diff --git a/tests/test_cartads_cs.py b/tests/test_cartads_cs.py index 063da303..5c2d4f1c 100644 --- a/tests/test_cartads_cs.py +++ b/tests/test_cartads_cs.py @@ -13,6 +13,7 @@ from django.core.files.storage import default_storage from django.test import override_settings from passerelle.apps.cartads_cs.models import CartaDSCS, CartaDSFile, CartaDSDossier +from passerelle.compat import json_loads from passerelle.base.models import Job import utils @@ -655,11 +656,11 @@ def test_role_sync(connector, app, cached_data): assert url.netloc == 'idp.example.org' if url.path == '/api/roles/': dossier = CartaDSDossier.objects.all().first() - assert json.loads(request.body) == json.loads( + assert json_loads(request.body) == json.loads( '{"name": "Suivi Cart@DS (%s)", "slug": "_cartads_%s"}' % (dossier.id, dossier.id)) return {'content': json.dumps({'uuid': 'role-uuid'}), 'status_code': 200} elif url.path == '/api/roles/role-uuid/relationships/members/': - body = json.loads(request.body) + body = json_loads(request.body) idp_mock.subscribed_roles = set([x['uuid'] for x in body['data']]) return {'content': json.dumps({'err': 0}), 'status_code': 200} raise Exception('unhandled http call (%s)' % url) diff --git a/tests/test_cityweb.py b/tests/test_cityweb.py index be216593..7e509155 100644 --- a/tests/test_cityweb.py +++ b/tests/test_cityweb.py @@ -41,7 +41,7 @@ def get_test_base_dir(name): def get_file_from_test_base_dir(filename): path = os.path.join(get_test_base_dir('cityweb'), filename) - with open(path, 'rb') as fd: + with open(path, 'r') as fd: return fd.read() diff --git a/tests/test_csv_datasource.py b/tests/test_csv_datasource.py index 8c79221b..0b0f0f72 100644 --- a/tests/test_csv_datasource.py +++ b/tests/test_csv_datasource.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import json import os import time import pytest @@ -34,6 +33,7 @@ from django.utils.six import StringIO from django.utils.six.moves.urllib.parse import urlencode from passerelle.base.models import ApiUser, AccessRight +from passerelle.compat import json_loads from passerelle.apps.csvdatasource.models import CsvDataSource, Query, TableRow from test_manager import login, admin_user @@ -107,7 +107,7 @@ def setup(): def parse_response(response): - return json.loads(response.content)['data'] + return json_loads(response.content)['data'] @pytest.fixture @@ -327,7 +327,7 @@ def test_on_the_fly_dialect_detection(client, setup): csvdata, url = setup(data=StringIO(data)) CsvDataSource.objects.all().update(_dialect_options=None) resp = client.get(url) - result = json.loads(resp.content) + result = json_loads(resp.content) assert result['err'] == 0 assert len(result['data']) == 20 @@ -335,7 +335,7 @@ def test_on_the_fly_dialect_detection(client, setup): def test_missing_columns(client, setup): csvdata, url = setup(data=StringIO(data + 'A;B;C\n')) resp = client.get(url) - result = json.loads(resp.content) + result = json_loads(resp.content) assert result['err'] == 0 assert len(result['data']) == 21 assert result['data'][-1] == {'lname': 'C', 'sex': None, 'id': 'B', 'fname': None, 'fam': 'A'} @@ -346,20 +346,20 @@ def test_unknown_sheet_name(client, setup): csvdata.sheet_name = 'unknown' csvdata.save() resp = client.get(url) - result = json.loads(resp.content) + result = json_loads(resp.content) assert len(result['data']) == 20 def test_cache_new_shorter_file(client, setup): csvdata, url = setup(data=StringIO(data + 'A;B;C\n')) resp = client.get(url) - result = json.loads(resp.content) + result = json_loads(resp.content) assert result['err'] == 0 assert len(result['data']) == 21 csvdata.csv_file = File(StringIO(data), 'data.csv') csvdata.save() resp = client.get(url) - result = json.loads(resp.content) + result = json_loads(resp.content) assert len(result['data']) == 20 diff --git a/tests/test_import_export.py b/tests/test_import_export.py index 33474b22..6dbb0da5 100644 --- a/tests/test_import_export.py +++ b/tests/test_import_export.py @@ -14,6 +14,7 @@ from django.utils.encoding import force_bytes, force_text from django.utils.six import BytesIO, StringIO from passerelle.base.models import ApiUser, AccessRight +from passerelle.compat import json_loads from passerelle.utils import import_site, export_site data = """121;69981;DELANOUE;Eliot;H @@ -76,7 +77,7 @@ def setup(): def parse_response(response): - return json.loads(response.content)['data'] + return json_loads(response.content)['data'] @pytest.fixture @@ -122,7 +123,7 @@ def test_export_csvdatasource(app, setup, filetype): assert first == second output = get_output_of_command('export_site') - third = json.loads(output) + third = json_loads(output) third['resources'][0]['csv_file']['name'] = 'whocares' assert first == third diff --git a/tests/test_jsonresponse.py b/tests/test_jsonresponse.py index ebc25576..c80c7a07 100644 --- a/tests/test_jsonresponse.py +++ b/tests/test_jsonresponse.py @@ -1,14 +1,14 @@ import logging import pytest -import json from django.test.client import RequestFactory from django.http import Http404 from django.core.exceptions import ObjectDoesNotExist, PermissionDenied - +from passerelle.compat import json_loads from passerelle.utils import to_json + class WrappedException(Exception): pass @@ -96,7 +96,7 @@ def test_jsonresponse_log_as_warning_exception(caplog): assert record.method == 'GET' assert "Error occurred while processing request" in record.message assert response.status_code == 488 - data = json.loads(response.content) + data = json_loads(response.content) assert data['err'] == 'logaswarningexception' assert data['err_desc'] == 'log as warning exception' @@ -110,7 +110,7 @@ def test_jsonresponse_error_header(): result = test_func(req) assert result.status_code == 200 - data = json.loads(result.content) + data = json_loads(result.content) assert data == {'test': 'un test', 'err': 0} @to_json() def test_func(req): @@ -119,7 +119,7 @@ def test_jsonresponse_error_header(): raise CustomException result = test_func(req) - data = json.loads(result.content) + data = json_loads(result.content) assert 'err_class' in data assert 'err' in data assert data['err'] == 1 @@ -141,7 +141,7 @@ def test_jsonresponse_with_callback(): content_type = result.get('Content-Type') assert 'application/javascript' in content_type assert result.content.startswith(b'myfunc(') - args = json.loads(result.content[7:-2]) + args = json_loads(result.content[7:-2]) assert args == {'foo': 'bar', 'err': 0} def test_jsonresponse_with_wrong_callback(): diff --git a/tests/test_lille_urban_card.py b/tests/test_lille_urban_card.py index 394e6d5d..65496c93 100644 --- a/tests/test_lille_urban_card.py +++ b/tests/test_lille_urban_card.py @@ -5,6 +5,7 @@ import json import mock import pytest +from passerelle.compat import json_loads from passerelle.contrib.lille_urban_card.models import LilleUrbanCard from passerelle.utils.jsonresponse import APIError @@ -29,7 +30,7 @@ def mocked_http(url, request): if url.path == '/clu/ws/demanderCarte': content = { 'n_demande_clu': 10000005, - 'request': json.loads(request.body), # for tests + 'request': json_loads(request.body), # for tests } return {'content': json.dumps(content), 'status_code': 200} if url.path.startswith('/clu/ws/consulterDemande/'): diff --git a/tests/test_mdel.py b/tests/test_mdel.py index 9dcae2f1..61876f23 100644 --- a/tests/test_mdel.py +++ b/tests/test_mdel.py @@ -18,7 +18,6 @@ from __future__ import unicode_literals import shutil import os -import json import base64 import copy import zipfile @@ -31,6 +30,7 @@ import pytest from passerelle.apps.mdel.models import MDEL, Demand from passerelle.apps.mdel.mdel import Message, Description, AttachedFile, get_resource_base_dir from passerelle.apps.mdel.utils import parse_date +from passerelle.compat import json_loads import utils @@ -69,15 +69,15 @@ def setup(db): @pytest.fixture(params=[ - json.loads(get_file_from_test_base_dir('formdata_aec_naiss.json')), - json.loads(get_file_from_test_base_dir('formdata_aec_mariage.json')), - json.loads(get_file_from_test_base_dir('formdata_aec_deces.json')), + json_loads(get_file_from_test_base_dir('formdata_aec_naiss.json')), + json_loads(get_file_from_test_base_dir('formdata_aec_mariage.json')), + json_loads(get_file_from_test_base_dir('formdata_aec_deces.json')), ], ids=['naissance', 'mariage', 'deces']) def aec_payload(request): return request.param -ILE_PAYLOAD = json.loads(get_file_from_test_base_dir('formdata.json')) +ILE_PAYLOAD = json_loads(get_file_from_test_base_dir('formdata.json')) def test_message(): @@ -306,7 +306,7 @@ def test_create_aec_demand_type(app, setup, aec_payload): def test_create_aec_demand_type_without_date_acte(app, setup): - payload = json.loads(get_file_from_test_base_dir('formdata_aec_deces.json')) + payload = json_loads(get_file_from_test_base_dir('formdata_aec_deces.json')) payload['fields'].pop('date_acte') resp = app.post_json('/mdel/test/create', params=payload, status=200) assert resp.json['err_desc'] == ' is required' @@ -391,13 +391,13 @@ def test_create_ile_demand_type(app, setup): def test_create_ile_demand_type_invalid_document_proof(app, setup): # test with missing key - payload = json.loads(get_file_from_test_base_dir('formdata.json')) + payload = json_loads(get_file_from_test_base_dir('formdata.json')) payload['fields'].pop('justificatif_domicile_hebergeur') resp = app.post_json('/mdel/test/create', params=payload, status=200) assert resp.json['err_desc'] == 'justificatif_domicile and all its attributes are required' # test with invalid content - payload = json.loads(get_file_from_test_base_dir('formdata.json')) + payload = json_loads(get_file_from_test_base_dir('formdata.json')) payload['fields']['justificatif_identite'] = None payload['fields']['justificatif_identite_verso'] = None resp = app.post_json('/mdel/test/create', params=payload, status=200) @@ -534,7 +534,7 @@ def test_date_parsing(): def test_aec_filenames_and_routing(app, setup): - aec_payload = json.loads(get_file_from_test_base_dir('formdata_aec_naiss.json')) + aec_payload = json_loads(get_file_from_test_base_dir('formdata_aec_naiss.json')) resp = app.post_json('/mdel/test/create', params=aec_payload, status=200) assert resp.json['data']['demand_id'] == '15-4-AEC-LA' diff --git a/tests/test_nancypoll.py b/tests/test_nancypoll.py index 608ebd2e..41fa4ed6 100644 --- a/tests/test_nancypoll.py +++ b/tests/test_nancypoll.py @@ -1,5 +1,3 @@ -import json - import pytest from django.core.files import File @@ -10,6 +8,7 @@ from django.utils.six import StringIO from passerelle.base.models import ApiUser, AccessRight +from passerelle.compat import json_loads from passerelle.contrib.nancypoll.models import NancyPoll data = """ @@ -33,7 +32,7 @@ data = """ def parse_response(response): - return json.loads(response.content)['data'] + return json_loads(response.content)['data'] @pytest.fixture @@ -53,7 +52,7 @@ def setup(db): def test_failure(setup): url, client = setup qs = {'street_no': '37000', 'street_name': 'Rue du Marechal Juin'} - resp = json.loads(client.get(url, qs).content) + resp = json_loads(client.get(url, qs).content) assert resp['err_desc'] == 'Polling Station Not Found' assert int(resp['err']) != 0 @@ -63,8 +62,8 @@ def test_no_params(setup): qs = {} resp = client.get(url, qs) assert resp.status_code == 200 - assert json.loads(resp.content)['err_desc'] == 'All parameters are required' - assert int(json.loads(resp.content)['err']) != 0 + assert json_loads(resp.content)['err_desc'] == 'All parameters are required' + assert int(json_loads(resp.content)['err']) != 0 def test_invalid_street_no(setup): @@ -72,8 +71,8 @@ def test_invalid_street_no(setup): qs = {'street_no': 'lol', 'street_name': 'whatever'} resp = client.get(url, qs) assert resp.status_code == 200 - assert json.loads(resp.content)['err_desc'] == 'Invalid street no value' - assert int(json.loads(resp.content)['err']) != 0 + assert json_loads(resp.content)['err_desc'] == 'Invalid street no value' + assert int(json_loads(resp.content)['err']) != 0 def test_success_i_side(setup): diff --git a/tests/utils.py b/tests/utils.py index ca41eb56..d8e56df6 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -8,6 +8,7 @@ from django.core.urlresolvers import reverse from django.utils.six.moves.urllib import parse as urlparse from passerelle.base.models import ApiUser, AccessRight +from passerelle.compat import json_loads def generic_endpoint_url(connector, endpoint, slug='test'): @@ -27,7 +28,7 @@ def setup_access_rights(obj): class FakedResponse(mock.Mock): def json(self): - return json.loads(self.content) + return json_loads(self.content) def mock_url(url=None, response='', status_code=200, headers=None):