Source code for worldline.acquiring.sdk.communicator_configuration

from configparser import ConfigParser, NoOptionError
from typing import Optional, Union
from urllib.parse import urlparse, ParseResult

from .proxy_configuration import ProxyConfiguration

from worldline.acquiring.sdk.authentication.authorization_type import AuthorizationType
from worldline.acquiring.sdk.domain.shopping_cart_extension import ShoppingCartExtension


# pylint: disable=too-many-instance-attributes
# Necessary to load information from config
[docs] class CommunicatorConfiguration(object): """ Configuration for the communicator. """ # The default number of maximum connections. DEFAULT_MAX_CONNECTIONS = 10 __api_endpoint: Optional[ParseResult] = None __connect_timeout: Optional[int] = None __socket_timeout: Optional[int] = None __max_connections: Optional[int] = None __authorization_type: Optional[str] = None __authorization_id: Optional[str] = None __authorization_secret: Optional[str] = None __oauth2_token_uri: Optional[str] = None __proxy_configuration: Optional[ProxyConfiguration] = None __integrator: Optional[str] = None __shopping_cart_extension: Optional[ShoppingCartExtension] = None
[docs] def __init__(self, properties: Optional[ConfigParser] = None, api_endpoint: Union[str, ParseResult, None] = None, authorization_id: Optional[str] = None, authorization_secret: Optional[str] = None, oauth2_client_id: Optional[str] = None, oauth2_client_secret: Optional[str] = None, oauth2_token_uri: Optional[str] = None, authorization_type: Optional[str] = None, connect_timeout: Optional[int] = None, socket_timeout: Optional[int] = None, max_connections: Optional[int] = None, proxy_configuration: Optional[ProxyConfiguration] = None, integrator: Optional[str] = None, shopping_cart_extension: Optional[ShoppingCartExtension] = None): """ :param properties: a ConfigParser.ConfigParser object containing configuration data :param connect_timeout: connection timeout for the network communication in seconds :param socket_timeout: socket timeout for the network communication in seconds :param max_connections: The maximum number of connections in the connection pool """ if properties and properties.sections() and properties.options("AcquiringSDK"): self.__api_endpoint = self.__get_endpoint(properties) authorization = properties.get("AcquiringSDK", "acquiring.api.authorizationType") self.__authorization_type = AuthorizationType.get_authorization(authorization) self.__connect_timeout = int(properties.get("AcquiringSDK", "acquiring.api.connectTimeout")) self.__socket_timeout = int(properties.get("AcquiringSDK", "acquiring.api.socketTimeout")) self.__max_connections = self.__get_property(properties, "acquiring.api.maxConnections", self.DEFAULT_MAX_CONNECTIONS) try: self.oauth2_token_uri = properties.get("AcquiringSDK", "acquiring.api.oauth2.tokenUri") except NoOptionError: self.oauth2_token_uri = None try: proxy_uri = properties.get("AcquiringSDK", "acquiring.api.proxy.uri") except NoOptionError: proxy_uri = None try: proxy_user = properties.get("AcquiringSDK", "acquiring.api.proxy.username") except NoOptionError: proxy_user = None try: proxy_pass = properties.get("AcquiringSDK", "acquiring.api.proxy.password") except NoOptionError: proxy_pass = None if proxy_uri is not None: self.__proxy_configuration = ProxyConfiguration.from_uri(proxy_uri, proxy_user, proxy_pass) else: self.__proxy_configuration = None try: self.__integrator = properties.get("AcquiringSDK", "acquiring.api.integrator") except NoOptionError: self.__integrator = None try: self.__shopping_cart_extension = self.__get_shopping_cart_extension(properties) except NoOptionError: self.__shopping_cart_extension = None if api_endpoint: self.api_endpoint = api_endpoint if authorization_id: self.authorization_id = authorization_id if authorization_secret: self.authorization_secret = authorization_secret if oauth2_client_id: self.oauth2_client_id = oauth2_client_id if oauth2_client_secret: self.oauth2_client_secret = oauth2_client_secret if oauth2_token_uri: self.oauth2_token_uri = oauth2_token_uri if authorization_type: self.authorization_type = authorization_type if connect_timeout: self.connect_timeout = connect_timeout if socket_timeout: self.socket_timeout = socket_timeout if max_connections: self.max_connections = max_connections if proxy_configuration: self.proxy_configuration = proxy_configuration if integrator: self.integrator = integrator if shopping_cart_extension: self.shopping_cart_extension = shopping_cart_extension
@staticmethod def __get_property(properties: ConfigParser, key: str, default_value: int) -> int: try: property_value = properties.get("AcquiringSDK", key) except NoOptionError: property_value = None if property_value is not None: return int(property_value) else: return default_value def __get_endpoint(self, properties: ConfigParser) -> ParseResult: host = properties.get("AcquiringSDK", "acquiring.api.endpoint.host") try: scheme = properties.get("AcquiringSDK", "acquiring.api.endpoint.scheme") except NoOptionError: scheme = None try: port = properties.get("AcquiringSDK", "acquiring.api.endpoint.port") except NoOptionError: port = None if scheme: if port: return self.__create_uri(scheme, host, int(port)) else: return self.__create_uri(scheme, host, -1) elif port: return self.__create_uri("https", host, int(port)) else: return self.__create_uri("https", host, -1) @staticmethod def __create_uri(scheme: str, host: str, port: int) -> ParseResult: if port != -1: uri = scheme + "://" + host + ":" + str(port) else: uri = scheme + "://" + host url = urlparse(uri) if not url.scheme.lower() in ["http", "https"] or not url.netloc: raise ValueError("Unable to construct endpoint URI") return url @staticmethod def __get_shopping_cart_extension(properties: ConfigParser) -> Optional[ShoppingCartExtension]: try: creator = properties.get("AcquiringSDK", "acquiring.api.shoppingCartExtension.creator") except NoOptionError: creator = None try: name = properties.get("AcquiringSDK", "acquiring.api.shoppingCartExtension.name") except NoOptionError: name = None try: version = properties.get("AcquiringSDK", "acquiring.api.shoppingCartExtension.version") except NoOptionError: version = None try: extension_id = properties.get("AcquiringSDK", "acquiring.api.shoppingCartExtension.extensionId") except NoOptionError: extension_id = None if creator is None and name is None and version is None and extension_id is None: return None else: return ShoppingCartExtension(creator, name, version, extension_id) @property def api_endpoint(self) -> Optional[ParseResult]: """ The Worldline Acquiring platform API endpoint URI. """ return self.__api_endpoint @api_endpoint.setter def api_endpoint(self, api_endpoint: Union[str, ParseResult, None]) -> None: if isinstance(api_endpoint, str): api_endpoint = urlparse(str(api_endpoint)) if api_endpoint is not None and api_endpoint.path: raise ValueError("apiEndpoint should not contain a path") if api_endpoint is not None and \ (api_endpoint.username is not None or api_endpoint.query or api_endpoint.fragment): raise ValueError("apiEndpoint should not contain user info, query or fragment") self.__api_endpoint = api_endpoint @property def authorization_id(self) -> Optional[str]: """ An id used for authorization. The meaning of this id is different for each authorization type. For instance, for OAuth2 this is the client id. """ return self.__authorization_id @authorization_id.setter def authorization_id(self, authorization_id: Optional[str]) -> None: self.__authorization_id = authorization_id @property def authorization_secret(self) -> Optional[str]: """ A secret used for authorization. The meaning of this secret is different for each authorization type. For instance, for OAuth2 this is the client secret. """ return self.__authorization_secret @authorization_secret.setter def authorization_secret(self, authorization_secret: Optional[str]) -> None: self.__authorization_secret = authorization_secret @ property def oauth2_client_id(self) -> Optional[str]: """ The OAuth2 client id. This property is an alias for authorization_id """ return self.authorization_id @ oauth2_client_id.setter def oauth2_client_id(self, oauth2_client_id: Optional[str]) -> None: self.authorization_id = oauth2_client_id @ property def oauth2_client_secret(self) -> Optional[str]: """ The OAuth2 client secret. This property is an alias for authorization_secret """ return self.__authorization_secret @ oauth2_client_secret.setter def oauth2_client_secret(self, oauth2_client_secret: Optional[str]) -> None: self.authorization_secret = oauth2_client_secret @ property def oauth2_token_uri(self) -> Optional[str]: return self.__oauth2_token_uri @ oauth2_token_uri.setter def oauth2_token_uri(self, oauth2_token_uri: Optional[str]) -> None: self.__oauth2_token_uri = oauth2_token_uri @property def authorization_type(self) -> Optional[str]: return self.__authorization_type @authorization_type.setter def authorization_type(self, authorization_type: Optional[str]) -> None: self.__authorization_type = authorization_type @property def connect_timeout(self) -> Optional[int]: """Connection timeout for the underlying network communication in seconds""" return self.__connect_timeout @connect_timeout.setter def connect_timeout(self, connect_timeout: Optional[int]) -> None: self.__connect_timeout = connect_timeout @property def socket_timeout(self) -> Optional[int]: """Socket timeout for the underlying network communication in seconds""" return self.__socket_timeout @socket_timeout.setter def socket_timeout(self, socket_timeout: Optional[int]) -> None: self.__socket_timeout = socket_timeout @property def max_connections(self) -> Optional[int]: return self.__max_connections @max_connections.setter def max_connections(self, max_connections: Optional[int]) -> None: self.__max_connections = max_connections @property def proxy_configuration(self) -> Optional[ProxyConfiguration]: return self.__proxy_configuration @proxy_configuration.setter def proxy_configuration(self, proxy_configuration: Optional[ProxyConfiguration]) -> None: self.__proxy_configuration = proxy_configuration @property def integrator(self) -> Optional[str]: return self.__integrator @integrator.setter def integrator(self, integrator: Optional[str]) -> None: self.__integrator = integrator @property def shopping_cart_extension(self) -> Optional[ShoppingCartExtension]: return self.__shopping_cart_extension @shopping_cart_extension.setter def shopping_cart_extension(self, shopping_cart_extension: Optional[ShoppingCartExtension]) -> None: self.__shopping_cart_extension = shopping_cart_extension