class SOAP_BGService: """ Описывает WEB-сервис билинга """ def __init__(self, bgserver, package, module): self.bgserver = bgserver self.package = package self.module = module self.service = Client(self.wsdl()).service def wsdl(self): """ Возвращает URL WSDL-схемы сервера """ return "{bgserver_url:s}/{package:s}/{module:s}?wsdl".format( bgserver_url=self.bgserver.url, package=self.package, module=self.module) def __getattr__(self, item): """ Все прочие вызовы проксирует на SOAP-сервис. Первым параметром при вызове сервиса должен быть объект BGUser, содержащий параметры """ def f(*args, **kwargs): return self.service.__getattr__(item).__call__( _soapheaders=[args[0].get_auth_header()], *args[1:], **kwargs) return f
class ServiceClient(object): """ That is a wrapper over the original zeep.Client """ def __init__(self, wsdl): self._client = Client(wsdl).service def __getattr__(self, item): """ Returns a converted dict response body instead of xml-based string :type item: zeep.client.OperationProxy :return: dict """ try: operation = self._client.__getattr__(item) def wrapper(*args): result = operation(*args) if isinstance(result, str): parsed = loads(dumps(xmltodict.parse(result))) return parsed return result return wrapper except AttributeError: sys.exit("The service does not support the requested operation: %s." % item)