ScriptTool erweitert und Beispiel hinzugefügt
This commit is contained in:
		@@ -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.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
									
								
							
							
						
						
									
										52
									
								
								examples/read_settings.py
									
									
									
									
									
										Normal 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)
 | 
				
			||||||
@@ -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())
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user