ScriptTool erweitert und Beispiel hinzugefügt

This commit is contained in:
Thomas Türk 2023-05-06 19:23:20 +02:00
parent 77e472e016
commit d88469e711
5 changed files with 107 additions and 6 deletions

View File

@ -58,7 +58,7 @@ der für die Umgebung korrekte Mandant automatisch verwendet wird.
Anbindung eigener Tools Anbindung eigener Tools
----------------------- -----------------------
Ursprünglich wurde `PyAPplus64` für die Anbindung einer APplus-Anpassung geschrieben. Dieses ist Ursprünglich wurde `PyAPplus64` für die Anbindung einer APplus-Anpassung geschrieben. Diese Anpassung ist
als Windows-Service auf einem eigenen Rechner installiert und überwacht dort ein bestimmtes Verzeichnis. als Windows-Service auf einem eigenen Rechner installiert und überwacht dort ein bestimmtes Verzeichnis.
Bei Änderungen an Dateien in diesem Verzeichnis (Hinzufügen, Ändern, Löschen) werden die Dateien verarbeitet Bei Änderungen an Dateien in diesem Verzeichnis (Hinzufügen, Ändern, Löschen) werden die Dateien verarbeitet
und die Ergebnisse an APplus gemeldet. Dafür werden DB-Operationen aber auch SOAP-Calls benutzt. und die Ergebnisse an APplus gemeldet. Dafür werden DB-Operationen aber auch SOAP-Calls benutzt.

View File

@ -17,7 +17,7 @@ das Deploy-, das Test- und das Prod-System. Ein Beispiel ist im Unterverzeichnis
:linenos: :linenos:
Damit nicht in jedem Script immer wieder neu die Konfig-Dateien ausgewählt werden müssen, werden die Konfigs für Damit nicht in jedem Script immer wieder neu die Konfig-Dateien ausgewählt werden müssen, werden die Konfigs für
das Prod-, Test- und Deploy-System in ``examples/applus_configs.py`` hinterlegt. Diese wird in allen Scripten importiert, das Prod-, Test- und Deploy-System in ``examples/applus_configs.py`` hinterlegt. Diese Datei wird in allen Scripten importiert,
so dass das Config-Verzeichnis und die darin enthaltenen Configs einfach zur Verfügung stehen. so dass das Config-Verzeichnis und die darin enthaltenen Configs einfach zur Verfügung stehen.
.. literalinclude:: ../../examples/applus_configs.py .. literalinclude:: ../../examples/applus_configs.py
@ -26,6 +26,15 @@ so dass das Config-Verzeichnis und die darin enthaltenen Configs einfach zur Ver
:linenos: :linenos:
``read_settings.py``
-----------------------
Einfaches Beispiel für Auslesen der SysConf und bestimmter Einstellungen.
.. literalinclude:: ../../examples/read_settings.py
:language: python
:lines: 9-
:linenos:
``check_dokumente.py`` ``check_dokumente.py``
----------------------- -----------------------
Einfaches Beispiel für lesenden und schreibenden Zugriff auf APplus Datenbank. Einfaches Beispiel für lesenden und schreibenden Zugriff auf APplus Datenbank.

View File

@ -10,9 +10,12 @@ import pathlib
import PyAPplus64 import PyAPplus64
import applus_configs import applus_configs
def main(confFile : pathlib.Path, docDir:str, updateDB:bool) -> None: def main(confFile : pathlib.Path, updateDB:bool, docDir:str|None = None) -> None:
server = PyAPplus64.applus.applusFromConfigFile(confFile) server = PyAPplus64.applus.applusFromConfigFile(confFile)
if docDir is None:
docDir = str(server.scripttool.getInstallPathWebServer().joinpath("DocLib"))
sql = PyAPplus64.sql_utils.SqlStatementSelect("ARTIKEL"); sql = PyAPplus64.sql_utils.SqlStatementSelect("ARTIKEL");
sql.addFields("ID", "ARTIKEL", "DOCUMENTS"); sql.addFields("ID", "ARTIKEL", "DOCUMENTS");
sql.where.addConditionFieldStringNotEmpty("DOCUMENTS"); sql.where.addConditionFieldStringNotEmpty("DOCUMENTS");
@ -28,4 +31,4 @@ def main(confFile : pathlib.Path, docDir:str, updateDB:bool) -> None:
upd.update(); upd.update();
if __name__ == "__main__": if __name__ == "__main__":
main(applus_configs.serverConfYamlTest, "somedir\\WebServer\\DocLib", False) main(applus_configs.serverConfYamlTest, False)

52
examples/read_settings.py Normal file
View File

@ -0,0 +1,52 @@
# 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.
# Einfaches Script, das verschiedene Werte des Servers ausliest.
# Dies sind SysConfig-Einstellungen, aber auch der aktuelle Mandant,
# Systemnamen, ...
import pathlib
import PyAPplus64
import applus_configs
import lxml.etree as ET # type: ignore
def main(confFile : str|pathlib.Path, user:str|None=None, env:str|None=None) -> None:
server = PyAPplus64.applusFromConfigFile(confFile, user=user, env=env)
print ("\n\nSysConf Lookups:")
print (" Default Auftragsart:", server.sysconf.getString("STAMM", "DEFAULTAUFTRAGSART"))
print (" Auftragsarten:")
arten = server.sysconf.getList("STAMM", "AUFTRAGSART", sep='\n')
if not arten: arten = []
for a in arten:
print (" - " + a)
print (" Firmen-Nr. automatisch vergeben:", server.sysconf.getBoolean("STAMM", "FIRMAAUTOMATIK"))
print (" Anzahl Artikelstellen:", server.sysconf.getInt("STAMM", "ARTKLASSIFNRLAENGE"))
print ("\n\nScriptTool:")
print (" CurrentDate:", server.scripttool.getCurrentDate())
print (" CurrentTime:", server.scripttool.getCurrentTime())
print (" CurrentDateTime:", server.scripttool.getCurrentDateTime())
print (" LoginName:", server.scripttool.getLoginName())
print (" UserName:", server.scripttool.getUserName())
print (" UserFullName:", server.scripttool.getUserFullName())
print (" SystemName:", server.scripttool.getSystemName())
print (" Mandant:", server.scripttool.getMandant())
print (" MandantName:", server.scripttool.getMandantName())
print (" InstallPath:", server.scripttool.getInstallPath())
print (" InstallPathAppServer:", server.scripttool.getInstallPathAppServer())
print (" InstallPathWebServer:", server.scripttool.getInstallPathWebServer())
print (" ServerInfo - Version:", server.scripttool.getServerInfo().find("version").text)
if __name__ == "__main__":
main(applus_configs.serverConfYamlTest)

View File

@ -12,6 +12,7 @@ from .applus import APplusServer
from . import sql_utils from . import sql_utils
import lxml.etree as ET # type: ignore import lxml.etree as ET # type: ignore
from typing import * from typing import *
import pathlib
class XMLDefinition: class XMLDefinition:
"""Repräsentation eines XML-Dokuments""" """Repräsentation eines XML-Dokuments"""
@ -80,6 +81,24 @@ class APplusScriptTool:
def getSystemName(self) -> str: def getSystemName(self) -> str:
return self.client.service.getSystemName() return self.client.service.getSystemName()
def getInstallPath(self) -> str:
"""
Liefert den Installionspfad des Appservers
"""
return self.client.service.getInstallPath()
def getInstallPathAppServer(self) -> pathlib.Path:
"""
Liefert den Installionspfad des Appservers als PathLib-Path
"""
return pathlib.Path(self.getInstallPath());
def getInstallPathWebServer(self) -> pathlib.Path:
"""
Liefert den Installionspfad des Webservers als PathLib-Path
"""
return self.getInstallPathAppServer().parents[0].joinpath("WebServer");
def getXMLDefinitionString(self, obj:str, mandant:str="") -> str: def getXMLDefinitionString(self, obj:str, mandant:str="") -> str:
""" """
Läd die XML-Defintion als String vom APPServer. Auch wenn kein XML-Dokument im Dateisystem gefunden wird, Läd die XML-Defintion als String vom APPServer. Auch wenn kein XML-Dokument im Dateisystem gefunden wird,
@ -103,7 +122,7 @@ class APplusScriptTool:
:type obj: str :type obj: str
:param mandant: der Mandant, dessen XML-Doku geladen werden soll, wenn "" wird der Standard-Mandant verwendet :param mandant: der Mandant, dessen XML-Doku geladen werden soll, wenn "" wird der Standard-Mandant verwendet
:type mandant: str optional :type mandant: str optional
:return: das gefundene und mittels ElementTree geparste XML-Dokument :return: das gefundene und geparste XML-Dokument
:rtype: ET.Element :rtype: ET.Element
""" """
return ET.fromstring(self.getXMLDefinitionString(obj, mandant=mandant)) return ET.fromstring(self.getXMLDefinitionString(obj, mandant=mandant))
@ -118,7 +137,7 @@ class APplusScriptTool:
:type obj: str :type obj: str
:param mandant: der Mandant, dessen XML-Doku geladen werden soll, wenn "" wird der Standard-Mandant verwendet :param mandant: der Mandant, dessen XML-Doku geladen werden soll, wenn "" wird der Standard-Mandant verwendet
:type mandant: str optional :type mandant: str optional
:return: das gefundene und mittels ElementTree geparste XML-Dokument :return: das gefundene und geparste XML-Dokument
:rtype: Optional[XMLDefinition] :rtype: Optional[XMLDefinition]
""" """
e = self.getXMLDefinition(obj, mandant=mandant); e = self.getXMLDefinition(obj, mandant=mandant);
@ -146,3 +165,21 @@ class APplusScriptTool:
Liefert den Namen des aktuellen Mandanten Liefert den Namen des aktuellen Mandanten
""" """
return self.client.service.getCurrentClientProperty("NAME") return self.client.service.getCurrentClientProperty("NAME")
def getServerInfoString(self) -> str:
"""
Liefert Informationen zum Server als String. Dieser String repräsentiert ein XML Dokument.
:return: das XML-Dokument als String
:rtype: str
"""
return self.client.service.getP2plusServerInfo()
def getServerInfo(self) -> Optional[ET.Element]:
"""
Liefert Informationen zum Server als ein XML Dokument.
:return: das gefundene und geparste XML-Dokument
:rtype: ET.Element
"""
return ET.fromstring(self.getServerInfoString())