From c70226b6061e5da26351df9935bb0d67414de3a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Tue, 9 Oct 2018 15:19:50 +0200 Subject: [PATCH] misc: move duplicated soap utility functions to main soap.py (#27140) --- passerelle/contrib/greco/models.py | 17 +-------- passerelle/contrib/maarch/soap.py | 40 +-------------------- passerelle/contrib/maarch/views.py | 7 ++-- passerelle/contrib/seisin_by_email/soap.py | 38 -------------------- passerelle/contrib/seisin_by_email/views.py | 7 ++-- passerelle/contrib/teamnet_axel/models.py | 3 +- passerelle/contrib/teamnet_axel/soap.py | 40 --------------------- passerelle/soap.py | 39 ++++++++++++++++++++ 8 files changed, 51 insertions(+), 140 deletions(-) diff --git a/passerelle/contrib/greco/models.py b/passerelle/contrib/greco/models.py index ebb5286..b906b46 100644 --- a/passerelle/contrib/greco/models.py +++ b/passerelle/contrib/greco/models.py @@ -34,6 +34,7 @@ from django.core.cache import cache from passerelle.base.models import BaseResource from passerelle.utils.api import endpoint, APIError +from passerelle.soap import sudsobject_to_dict from .formdata import FormData, CREATION_SCHEMA, list_schema_fields @@ -56,22 +57,6 @@ def fill_sudsobject_with_dict(sudsobject, fields, prefix=None): # sudsobject.foo.bar <- fields['foo_bar'] setattr(sudsobject, key, fields[attr]) -def sudsobject_to_dict(sudsobject): - out = {} - for key, value in suds.sudsobject.asdict(sudsobject).iteritems(): - if hasattr(value, '__keylist__'): - out[key] = sudsobject_to_dict(value) - elif isinstance(value, list): - out[key] = [] - for item in value: - if hasattr(item, '__keylist__'): - out[key].append(sudsobject_to_dict(item)) - else: - out[key].append(item) - else: - out[key] = value - return out - class Greco(BaseResource): application = models.CharField(_('Application identifier'), max_length=200) diff --git a/passerelle/contrib/maarch/soap.py b/passerelle/contrib/maarch/soap.py index 5f2e948..cf374a8 100644 --- a/passerelle/contrib/maarch/soap.py +++ b/passerelle/contrib/maarch/soap.py @@ -28,7 +28,7 @@ from django.conf import settings from suds.transport.http import HttpAuthenticated from suds.transport import Reply from suds.client import Client -from suds.sudsobject import asdict + class Transport(HttpAuthenticated): def __init__(self, model, **kwargs): @@ -63,41 +63,3 @@ class Transport(HttpAuthenticated): def get_client(model): transport = Transport(model) return Client(model.wsdl_url, transport=transport, cache=None) - -def client_to_jsondict(client): - """return description of the client, as dict (for json export)""" - res = {} - for i, sd in enumerate(client.sd): - d = {} - d['tns'] = sd.wsdl.tns[1] - d['prefixes'] = dict(p for p in sd.prefixes) - d['ports'] = {} - for p in sd.ports: - d['ports'][p[0].name] = {} - for m in p[1]: - d['ports'][p[0].name][m[0]] = dict( - (mp[0], sd.xlate(mp[1])) for mp in m[1]) - d['types'] = {} - for t in sd.types: - ft = client.factory.create(sd.xlate(t[0])) - d['types'][sd.xlate(t[0])] = unicode(ft) - res[sd.service.name] = d - return res - -def recursive_asdict(d): - """Convert Suds object into serializable format.""" - out = {} - for k, v in asdict(d).iteritems(): - if hasattr(v, '__keylist__'): - out[k] = recursive_asdict(v) - elif isinstance(v, list): - out[k] = [] - for item in v: - if hasattr(item, '__keylist__'): - out[k].append(recursive_asdict(item)) - else: - out[k].append(item) - else: - out[k] = v - return out - diff --git a/passerelle/contrib/maarch/views.py b/passerelle/contrib/maarch/views.py index c097ae7..2485e6b 100644 --- a/passerelle/contrib/maarch/views.py +++ b/passerelle/contrib/maarch/views.py @@ -25,8 +25,9 @@ from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt from passerelle import utils +from passerelle.soap import sudsobject_to_dict, sudsclient_to_jsondict -from .soap import get_client, client_to_jsondict, recursive_asdict +from .soap import get_client from .models import Maarch logger = logging.getLogger('passerelle.contrib.maarch') @@ -59,7 +60,7 @@ class PingView(DetailView): client = self.get_client() res = {'ping': 'pong'} if 'debug' in request.GET: - res['client'] = client_to_jsondict(client) + res['client'] = sudsclient_to_jsondict(client) return res @@ -223,7 +224,7 @@ class ResourceView(DetailView): results = client.service.storeResource( encodedFile, metadata, collId, table, fileFormat, status) - data = recursive_asdict(results) + data = sudsobject_to_dict(results) logger.debug('storeResource result: %r', data) resId = data.get('resId') diff --git a/passerelle/contrib/seisin_by_email/soap.py b/passerelle/contrib/seisin_by_email/soap.py index 5c10945..67968a7 100644 --- a/passerelle/contrib/seisin_by_email/soap.py +++ b/passerelle/contrib/seisin_by_email/soap.py @@ -28,7 +28,6 @@ from django.conf import settings from suds.transport.http import HttpAuthenticated from suds.transport import Reply from suds.client import Client -from suds.sudsobject import asdict class Transport(HttpAuthenticated): @@ -64,40 +63,3 @@ class Transport(HttpAuthenticated): def get_client(model): transport = Transport(model) return Client(model.wsdl_url, transport=transport, cache=None) - -def client_to_jsondict(client): - """return description of the client, as dict (for json export)""" - res = {} - for i, sd in enumerate(client.sd): - d = {} - d['tns'] = sd.wsdl.tns[1] - d['prefixes'] = dict(p for p in sd.prefixes) - d['ports'] = {} - for p in sd.ports: - d['ports'][p[0].name] = {} - for m in p[1]: - d['ports'][p[0].name][m[0]] = dict( - (mp[0], sd.xlate(mp[1])) for mp in m[1]) - d['types'] = {} - for t in sd.types: - ft = client.factory.create(sd.xlate(t[0])) - d['types'][sd.xlate(t[0])] = unicode(ft) - res[sd.service.name] = d - return res - -def recursive_asdict(d): - """Convert Suds object into serializable format.""" - out = {} - for k, v in asdict(d).iteritems(): - if hasattr(v, '__keylist__'): - out[k] = recursive_asdict(v) - elif isinstance(v, list): - out[k] = [] - for item in v: - if hasattr(item, '__keylist__'): - out[k].append(recursive_asdict(item)) - else: - out[k].append(item) - else: - out[k] = v - return out diff --git a/passerelle/contrib/seisin_by_email/views.py b/passerelle/contrib/seisin_by_email/views.py index 2ef2660..1cdb732 100644 --- a/passerelle/contrib/seisin_by_email/views.py +++ b/passerelle/contrib/seisin_by_email/views.py @@ -21,8 +21,9 @@ from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt from passerelle import utils +from passerelle.soap import sudsobject_to_dict, sudsclient_to_jsondict -from .soap import get_client, client_to_jsondict, recursive_asdict +from .soap import get_client from .models import SeisinByEmailManagement @@ -51,7 +52,7 @@ class PingView(DetailView): client = self.get_client() res = {'ping': 'pong'} if 'debug' in request.GET: - res['client'] = client_to_jsondict(client) + res['client'] = sudsclient_to_jsondict(client) return res @@ -120,7 +121,7 @@ class ResourceView(DetailView): request_object, data, attachmentData) - data = recursive_asdict(results) + data = sudsobject_to_dict(results) if debug: data['debug'] = debug_output diff --git a/passerelle/contrib/teamnet_axel/models.py b/passerelle/contrib/teamnet_axel/models.py index 11d623a..e3532e5 100644 --- a/passerelle/contrib/teamnet_axel/models.py +++ b/passerelle/contrib/teamnet_axel/models.py @@ -29,6 +29,7 @@ from django.utils.encoding import smart_text from jsonfield import JSONField from passerelle.base.models import BaseResource +from passerelle.soap import sudsclient_to_jsondict from passerelle.utils.api import endpoint from passerelle.utils.jsonresponse import APIError from passerelle.views import WrongParameter @@ -172,7 +173,7 @@ class TeamnetAxel(BaseResource): raise APIError('Client Error: %s' % exc.message) res = {'ping': 'pong'} if 'debug' in request.GET: - res['client'] = soap.client_to_jsondict(client) + res['client'] = sudsclient_to_jsondict(client) return {'data': res} @endpoint(perm='can_access') diff --git a/passerelle/contrib/teamnet_axel/soap.py b/passerelle/contrib/teamnet_axel/soap.py index 0ec1748..44b0ef1 100644 --- a/passerelle/contrib/teamnet_axel/soap.py +++ b/passerelle/contrib/teamnet_axel/soap.py @@ -25,7 +25,6 @@ except ImportError: from suds.transport.http import HttpAuthenticated from suds.transport import Reply from suds.client import Client -from suds.sudsobject import asdict class Transport(HttpAuthenticated): @@ -64,45 +63,6 @@ def get_client(model): return Client(model.wsdl_url, transport=transport, cache=None) -def client_to_jsondict(client): - """return description of the client, as dict (for json export)""" - res = {} - for i, sd in enumerate(client.sd): - d = {} - d['tns'] = sd.wsdl.tns[1] - d['prefixes'] = dict(p for p in sd.prefixes) - d['ports'] = {} - for p in sd.ports: - d['ports'][p[0].name] = {} - for m in p[1]: - d['ports'][p[0].name][m[0]] = dict( - (mp[0], sd.xlate(mp[1])) for mp in m[1]) - d['types'] = {} - for t in sd.types: - ft = client.factory.create(sd.xlate(t[0])) - d['types'][sd.xlate(t[0])] = unicode(ft) - res[sd.service.name] = d - return res - - -def recursive_asdict(d): - """Convert Suds object into serializable format.""" - out = {} - for k, v in asdict(d).iteritems(): - if hasattr(v, '__keylist__'): - out[k] = recursive_asdict(v) - elif isinstance(v, list): - out[k] = [] - for item in v: - if hasattr(item, '__keylist__'): - out[k].append(recursive_asdict(item)) - else: - out[k].append(item) - else: - out[k] = v - return out - - def xml_to_dict(result): """Converts AXEL simple XML responses into dict()""" d = {} diff --git a/passerelle/soap.py b/passerelle/soap.py index 34ef8f4..821520a 100644 --- a/passerelle/soap.py +++ b/passerelle/soap.py @@ -6,6 +6,7 @@ import requests from suds.client import Client from suds.transport.http import HttpAuthenticated from suds.transport import Reply +import suds.sudsobject class Transport(HttpAuthenticated): @@ -116,3 +117,41 @@ class Soap(object): domains=self.domains), plugins=self.plugins, cache=self.cache) + + +def sudsclient_to_jsondict(client): + """return description of the client, as dict (for json export)""" + res = {} + for i, sd in enumerate(client.sd): + d = {} + d['tns'] = sd.wsdl.tns[1] + d['prefixes'] = dict(p for p in sd.prefixes) + d['ports'] = {} + for p in sd.ports: + d['ports'][p[0].name] = {} + for m in p[1]: + d['ports'][p[0].name][m[0]] = dict( + (mp[0], sd.xlate(mp[1])) for mp in m[1]) + d['types'] = {} + for t in sd.types: + ft = client.factory.create(sd.xlate(t[0])) + d['types'][sd.xlate(t[0])] = unicode(ft) + res[sd.service.name] = d + return res + + +def sudsobject_to_dict(sudsobject): + out = {} + for key, value in suds.sudsobject.asdict(sudsobject).iteritems(): + if hasattr(value, '__keylist__'): + out[key] = sudsobject_to_dict(value) + elif isinstance(value, list): + out[key] = [] + for item in value: + if hasattr(item, '__keylist__'): + out[key].append(sudsobject_to_dict(item)) + else: + out[key].append(item) + else: + out[key] = value + return out -- 2.19.1