87 lines
3.1 KiB
Python
87 lines
3.1 KiB
Python
# 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
|