Allgemeines
Der Module Reader wandelt die für den Benutzer sichtbaren Daten eines PLANTA-Moduls in reines JSON um – wahlweise die Daten selbst oder ein JSON-Schema, das deren Struktur beschreibt. Dabei durchläuft er die Datenbereiche des Moduls genauso, wie der Client sie darstellen würde: Das Customizing (Sichtbarkeit, Überschriften, feldweise Konfiguration) wird berücksichtigt, Felder, die kein Benutzer sehen soll, werden übersprungen. Ist ein Datenfeld als Diagramm konfiguriert, wird es – sofern die Lese-Session dies zulässt – zusätzlich als Base64-kodiertes Bild mit ausgegeben.
Dieser Ansatz kann als eine umfangreichere Alternative zur Transformation der Daten über Web-Entitäten gesehen werden, deren Möglichkeiten dadurch beschränkt sind, dass sich Web-Entitäten immer auf eine Tabelle beziehen und dadurch komplexe Modulkonstruktionen nicht über sie abgebildet werden können.
Auch kann der Ansatz zum vereinfachten Customizing verwendet werden, da der gesamte Customizing-Baukasten (Formate, Verdichtung, Gruppierung, virtuelle Felder, ...) zur Verfügung steht.
Der Module Reader ist auf zwei Wegen erreichbar:
-
Über das Web, über den Endpunkt
/module/{module_id}, der in einer Clientless-Session ein dediziertes Makromodul öffnet und dieses das Zielmodul auslesen lässt. -
Direkt im Backend-Python-Code, da
Base.read_module_data_for_web– die Methode, die der Web-Endpunkt letztlich aufruft – auf der gemeinsamen Wrapper-Klasse jeder PLANTA-Modulinstanz definiert ist. Jedes Modul, egal wie geöffnet, kann so mit einem einzigen Methodenaufruf seinen eigenen JSON-Export erzeugen – ganz ohne Web-Request.
Modul-Endpunkt
Über den Modul-Endpunkt ModuleReaderImplementation kann ein freigegebenes Modul übers Web ausgelesen werden. Die Query-Parameter werden an die Modulklasse weitergegeben. Standardmäßig bekommt man die Daten zu einem Modul als JSON. Übergibt man „format=json-schema", bekommt man eine JSON-Schema-Datei zum Modul, statt den Moduldaten.
Die Implementation prüft, ob das angeforderte Modul für das Web freigegeben ist. Wenn ja, wird es über ein Makromodul (009DVH) in einer Clientless-Session geöffnet und die read_module_data_for_web()-Methode aufgerufen.
Konfiguration im Customizing
Im Modul Weitere Modulparameter muss für das Modul, dessen Daten exportiert werden sollen, die Checkbox Web-Export aktiviert werden.
Die Datenbereiche des Moduls, die beim Export berücksichtigt werden sollen, müssen eine Python-ID und Datenfelder in Fenster 1/2/3 haben.
Ist für einen Datenbereich auf oberster Ebene die Checkbox Nie Anzeigen aktiviert, wird er übersprungen.
Über die Datenfeld-Konfiguration kann das Verhalten für einzelne Felder angepasst werden:
-
get-tech-value: Liest den technischen Wert aus dem Feld, statt die String-Repräsentation -
use-df-heading: Statt der Python-ID wird die DF-Überschrift als Schlüssel verwendet
Beispiel
from ppms import ppms
from ppms.customizer.module_reader import ModuleReader
macro = ppms.get_macro_module()
with macro.open_module('002858') as replanning_module:
reader = ModuleReader(module=replanning_module)
schema = reader.get_json_schema_definition()
data = reader.read_module_data_as_dictionary()
Da jedes Modul sich bereits selbst auslesen kann, geht es auch kürzer:
with macro.open_module('002858') as replanning_module:
data = replanning_module.read_module_data_for_web({'format': 'json'})
Individuelle Kundencustomizings
Die Methode read_module_data_for_web(self, query_parameters) auf der Modulklasse ist dafür verantwortlich, die Daten auszulesen und zurückzugeben. Sie kann in einer Modulunterklasse überschrieben werden, um das Verhalten anzupassen und z. B. über die Query-Parameter die Filter im Modul zu setzen.
class ExampleCustomerReader(Base):
def read_module_data_for_web(self, query_parameters):
# Read a project_id from the query parameters and set it as search criteria in a specific DA
project_id = query_parameters.get('project_id', None)
if project_id is not None:
self.project.get_customizing().pr_id.set_search_criteria(project_id, project_id)
return super().read_module_data_for_web(query_parameters)