Umfrage: Wie umgehen mit API-Wrappern?

Gerade habe ich im Rahmen eines Projekts diesen Code produziert. Hier werden Workflow-Rollen zu den aktiven Organisationen aus dem enaio ausgelesen und für später in ein dict gespeichert.

from ecmind_blue_client import Job
from ecmind_blue_client.tcp_client import TcpClient as Client
from XmlElement import XmlElement

client = Client(...)

result_get_organisations = client.execute(Job(jobname='wfm.GetOrganisations'))
if not result_get_organisations.return_code == 0:
    raise RuntimeError(result_get_organisations.error_message)

listify = lambda e: e if isinstance(e, list) else [ e ]

organisations = listify(
    XmlElement.from_string(
        result_get_organisations.values['Organisations']
    ).to_dict()['Organisation']
)

active_organisations = { o['@Id']: o['@Name'] for o in organisations if o['@Active'] == 1 }

for org_id in active_organisations:
    result_get_organisations_objects = client.execute(Job(
        jobname='wfm.GetOrganisationObjects',
        OrganisationId=org_id,
        RequestType=4,
        ObjectIds='',
        ObjectName='',
        ClassIds='',
        ClassName='Rolle',
        AttributeId='',
        AttributeValue='',
        RequestData=1
    ))
    if not result_get_organisations_objects.return_code == 0:
        raise RuntimeError(result_get_organisations_objects.error_message)

    roles = {r['@Id']: r['@Name'] for r in listify(
        XmlElement.from_string(
            result_get_organisations_objects.values['Objects']
        ).to_dict()['Object']
    ) }

    print(roles)

Bei solchen Gelegenheiten frage ich mich immer, wie wir mit solchen Fragmenten umgehen sollen.

  • In den ecmind_blue_client integrieren.
  • In ein Sammel-Helper-Modul auslagern, welches parallel zu ecmind_blue_client existiert.
  • Thematisch sortierte einzelne Helper-Module produzieren, z. B. „Workflow“, „Conversion“ etc.
  • Snippets verwalten und jeweils in Code-Form in die laufenden Projekte übernehmen.
  • Mit dem OS_ServerAPI-Handbuch jeweils ad hoc schreiben - die Suche nach Code-Konserven dauert länger.

0 Teilnehmer

Die naheliegende (weil arbeitsarme) Variante 1 - in den ecmind_blue_client integrieren - birgt natürlich das Risiko, dass dieser immer mehr Abhängigkeiten bekommt und übersichtlicher wird. Dafür müsste man nicht lange überlegen, wo eine Funktion zu finden ist. Was meint Ihr? Fehlt eine Option oder habt Ihr eine Idee?

1 Like

Ich habe hier im Rahmen eines anderen Projekts einige Metrics für enaio ausgelesen. Z.B. Anzahl liste aller Sessions, CPB Queues, Dokumentengrösse. Diese basieren auch auf ebenfalls auf enaio Server-API Befehlen und könnten daher auch in diese Helper übergehen.

Auf jeden Fall. Und vielen Dank für Deine Einschätzung in der Umfrage, ich bin mir nicht sicher, was das Ideale vorgehen ist.

Ich sehe gerade, Du hast das von Dir erwähnte Beispiel auch hier hin schon mal hin gepackt, vielen Dank:

Find das eine sehr gute Idee sowas in thematischen Helper-Modulen zu haben! Danke für die Umfrage.

Ich denke eine gewisse thematische Sortierung macht das Ganze etwas übersichtlicher. Ich müsste nächste Woche auch mal schauen was wir schon an Snippets vorliegen haben. Eventuell kann davon etwas verwendet werden.

Hallo zusammen, ich habe einen MVP erstellt, um diesen mit Euch zu diskutieren. Es gäbe jetzt folgende neue Strukturen:

Repo für das erste Zusatzmodul „Workflow“

PyPI-Projekt für das erste Zusatzmodul „Workflow“

Also könnt Ihr das bereits testen, wenn Ihr mögt:

pip install ecmind_blue_client_workflow

Beispielhafte Nutzung

Im MVP gibt es bisher genau eine Funktion im Modul workflow. Ich hätte jetzt hier keine Classes erwartet, deshalb müssen wir der Helper-Funktion workflow.get_organisations() unser Client-Objekt übergeben:

from ecmind_blue_client.tcp_client import TcpClient as Client
from ecmind_blue_client_workflow import workflow

client = Client(hostname='enaio-rk-2021', port=4000, appname='unittest', username='root', password='optimal')
print(workflow.get_organisations(client, only_active=True))

grafik


Was meint Ihr zur Benennung, zur Struktur, zum Vorgehen usw.?

Hallo, bis wir das abgestimmt haben, werfe ich hier noch was ein, was später verarbeitet werden könnte:

        def get_user_list(client:Client):
            user_list_result = client.execute(Job('mng.GetUserList', Flags=0))
            users_element = XmlElement.from_string(user_list_result.values['UserList']).find('Users')
            users_element.find('User').flag_as_list = True
            result = {}
            for user_entry in users_element.to_dict()['User']:
                result[user_entry['@benutzer']] = {
                    'id': user_entry['@id'],
                    'login': user_entry['@benutzer'],
                    'name': user_entry['@name'],
                    'guid': user_entry['@osguid'],
                    'mail': user_entry['@osemail'],
                    'locked': True if user_entry['@locked'] == 1 else False,
                    'profile': user_entry['@profil'],
                    }
            return result

Ich finde es als separate Module am logisch auch wegen der möglichen Abhängigkeiten.

1 Like

Cool, ich mache einfach mal. Ich habe bereits eine Methode ergänzt und auf 0.0.2 gebumpt.

Und schon gibt es ein rudimentäres manage-Modul nach gleichem Muster:

Siehe dazu auch PyPI:

Bzw. langfristig vermutlich so:

Ich habe gerade dem Modul ecmind_blue_client_workflow folgende Methoden hinzugefügt:

admin_get_process_list()

Diese Methode liefert einem die Liste aller laufenden Prozesse eines Workflows zurück.
Interessant ist diese insbesondere zur Überwachung abgebrochener Workflows.
Ein Code Beispiel ist in der README.md hinzugefügt.

admin_get_workflow_list()

Diese Methode liefert einem die Liste aktiven Workflow-Modelle und deren Anzahl an laufenden Prozessen zurück. Diese Methode kann zum Beispiel für die Statistik von Monitoring Systemen relevant. Ein Code Beispiel ist in der README.md hinzugefügt.

Diese Methoden entsprechen den Listen aus dem Workflow-Administrator.

1 Like

Und mit dem Modul ecmind_blue_client_objdef

bzw. bei PyPI

gibt es jetzt eine neue Möglichkeit, die Objektdefinition von enaio zu laden/parsen/durchlaufen:

1 Like

Ich habe ecmind_blue_client_workflow in Version 0.0.3 wie von @uw erweitert auf PyPI gepackt:

Noch eine kleine Erweiterung für das Modul ecmind_blue_client_manage:

Die neue Methode get_sessions liefert einem alle laufenden Sessions auf dem verbundenen Server zurück. Dies kann auch für Monitoring Zwecke interessant sein. Ein Beispiel-Code habe ich in die README.md hinzugefügt.

Ist auf PyPI:

1 Like

Hallo zusammen, nachdem das jetzt so eigentlich ganz aufgeräumt ist, würde ich beliebt machen, dass wir praktisch alle Helper-Funktionen aus dem heutigen client.py rausräumen.

Ich würde mir einen ecmind_blue_client_dms-Modul vorstellen, welches diese Funktionen übernimmt:

  • get_object_type_by_id
  • store_in_cache
  • store_in_cache_by_id
  • xml_import
  • get_object_details
  • lol_query

Würde Euch dieser Umbau noch passen, würde uns das unglücklich machen, ist es überhaupt eine gute Idee oder ist das die „Kernkompetenz“ der Bibliothek?

Ich bin dafür auch wenn es dann etwas umgebaut werden muss.