58 lines
2.5 KiB
Python
58 lines
2.5 KiB
Python
# ruff: noqa: PLC0415
|
|
|
|
_soap_clients = {}
|
|
|
|
|
|
def new_get_soap_client(wsdlurl, timeout=30):
|
|
# stdnum library does not set the timeout for the zeep Transport class correctly
|
|
# (timeout is to fetch the wsdl and operation_timeout is to perform the call),
|
|
# requiring us to monkey patch the get_soap_client function.
|
|
# Can be removed when https://github.com/arthurdejong/python-stdnum/issues/444 is
|
|
# resolved and the version of the dependency is updated.
|
|
# The code is a copy of the original apart for the line related to the Transport class.
|
|
# This was done to keep the code as similar to the original and to reduce the possibility
|
|
# of introducing import errors, even though some imports are not in the requirements.
|
|
# See https://github.com/odoo/odoo/pull/173359 for a more thorough explanation.
|
|
if (wsdlurl, timeout) not in _soap_clients:
|
|
try:
|
|
from zeep.transports import Transport
|
|
transport = Transport(operation_timeout=timeout, timeout=timeout) # operational_timeout added here
|
|
from zeep import CachingClient
|
|
client = CachingClient(wsdlurl, transport=transport).service
|
|
except ImportError:
|
|
# fall back to non-caching zeep client
|
|
try:
|
|
from zeep import Client
|
|
client = Client(wsdlurl, transport=transport).service
|
|
except ImportError:
|
|
# other implementations require passing the proxy config
|
|
try:
|
|
from urllib import getproxies
|
|
except ImportError:
|
|
from urllib.request import getproxies
|
|
# fall back to suds
|
|
try:
|
|
from suds.client import Client
|
|
client = Client(
|
|
wsdlurl, proxy=getproxies(), timeout=timeout).service
|
|
except ImportError:
|
|
# use pysimplesoap as last resort
|
|
try:
|
|
from pysimplesoap.client import SoapClient
|
|
client = SoapClient(
|
|
wsdl=wsdlurl, proxy=getproxies(), timeout=timeout)
|
|
except ImportError:
|
|
raise ImportError(
|
|
'No SOAP library (such as zeep) found')
|
|
_soap_clients[(wsdlurl, timeout)] = client
|
|
return _soap_clients[(wsdlurl, timeout)]
|
|
|
|
|
|
def patch_stdnum():
|
|
try:
|
|
from stdnum import util
|
|
except ImportError:
|
|
return # nothing to patch
|
|
|
|
util.get_soap_client = new_get_soap_client
|