# Copyright (c) 2023 Thomas Tuerk (kontakt@thomas-tuerk.de) # # This file is part of PyAPplus64 (see https://www.thomas-tuerk.de/de/pyapplus64). # # Use of this source code is governed by an MIT-style # license that can be found in the LICENSE file or at # https://opensource.org/licenses/MIT. from requests import Session # type: ignore from requests.auth import HTTPBasicAuth # type: ignore # or HTTPDigestAuth, or OAuth1, etc. from zeep import Client from zeep.transports import Transport from zeep.cache import SqliteCache from typing import Optional, Dict class APplusAppServerSettings: """ Einstellungen, mit welchem APplus App-Server sich verbunden werden soll. """ def __init__(self, appserver: str, appserverPort: int, user: str, env: Optional[str] = None): self.appserver = appserver self.appserverPort = appserverPort self.user = user self.env = env class APplusWebServerSettings: """ Einstellungen, mit welchem APplus Web-Server sich verbunden werden soll. """ def __init__(self, baseurl: Optional[str] = None): self.baseurl: Optional[str] = baseurl try: assert (isinstance(self.baseurl, str)) if not (self.baseurl is None) and not (self.baseurl[-1] == "/"): self.baseurl = self.baseurl + "/" except: pass class APplusServerConnection: """Verbindung zu einem APplus APP-Server :param settings: die Einstellungen für die Verbindung mit dem APplus Server :type settings: APplusAppServerSettings """ def __init__(self, settings: APplusAppServerSettings) -> None: userEnv = settings.user if (settings.env): userEnv += "|" + settings.env session = Session() session.auth = HTTPBasicAuth(userEnv, "") self.transport = Transport(cache=SqliteCache(), session=session) # self.transport = Transport(session=session) self.clientCache: Dict[str, Client] = {} self.settings = settings self.appserverUrl = "http://" + settings.appserver + ":" + str(settings.appserverPort) + "/" def getClient(self, package: str, name: str) -> Client: """Erzeugt einen zeep - Client. Mittels dieses Clients kann die WSDL Schnittstelle angesprochen werden. Wird als *package* "p2core" und als *name* "Table" verwendet und der resultierende client "client" genannt, dann kann z.B. mittels "client.service.getCompleteSQL(sql)" vom AppServer ein Vervollständigen des SQLs angefordert werden. :param package: das Packet, z.B. "p2core" :type package: str :param name: der Name im Packet, z.B. "Table" :type package: string :return: den Client :rtype: Client """ url = package+"/"+name try: return self.clientCache[url] except: fullClientUrl = self.appserverUrl + url + ".jws?wsdl" client = Client(fullClientUrl, transport=self.transport) self.clientCache[url] = client return client