Praxisbeispiele
Vollständige Python-Skripte für typische Integrationsszenarien.
Beispiel 1: Mitarbeitende synchronisieren
Synchronisiere Mitarbeitende aus einem externen HR-System.
"""
Mitarbeitende-Synchronisation
Importiert Mitarbeitende aus einem externen System nach ELIZA.
"""
import os
from requests import Session
# Konfiguration
API_TOKEN = os.environ.get("ELIZA_API_TOKEN")
BASE_URL = os.environ.get("ELIZA_BASE_URL", "https://example.myeliza.ch/api")
# Session einrichten
session = Session()
session.headers.update({
"Authorization": f"Token {API_TOKEN}",
"Content-Type": "application/json"
})
def sync_mitarbeitende(externe_daten):
"""
Synchronisiert Mitarbeitende basierend auf remote_key.
Args:
externe_daten: Liste von Dicts mit Mitarbeitenden-Daten
Returns:
Dict mit Statistiken (erstellt, aktualisiert, fehler)
"""
statistik = {"erstellt": 0, "aktualisiert": 0, "fehler": 0}
for person in externe_daten:
remote_key = person.get("externe_id")
# Prüfen ob bereits vorhanden
response = session.get(
f"{BASE_URL}/organisation/mitarbeitende",
params={"remote_key": remote_key}
)
eliza_daten = {
"vorname": person["vorname"],
"nachname": person["nachname"],
"email": person.get("email", ""),
"remote_key": remote_key
}
if response.json():
# Aktualisieren
ma_id = response.json()[0]["id"]
result = session.patch(
f"{BASE_URL}/organisation/mitarbeitende/{ma_id}",
json=eliza_daten
)
if result.status_code == 200:
statistik["aktualisiert"] += 1
print(f"✓ Aktualisiert: {person['vorname']} {person['nachname']}")
else:
statistik["fehler"] += 1
print(f"✗ Fehler bei {person['vorname']}: {result.json()}")
else:
# Neu erstellen
result = session.post(
f"{BASE_URL}/organisation/mitarbeitende",
json=eliza_daten
)
if result.status_code == 201:
statistik["erstellt"] += 1
print(f"+ Erstellt: {person['vorname']} {person['nachname']}")
else:
statistik["fehler"] += 1
print(f"✗ Fehler bei {person['vorname']}: {result.json()}")
return statistik
# Beispiel-Verwendung
if __name__ == "__main__":
# Beispieldaten (normalerweise aus externem System)
externe_mitarbeitende = [
{"externe_id": "HR-001", "vorname": "Hugo", "nachname": "Boss", "email": "hugo@example.com"},
{"externe_id": "HR-002", "vorname": "Anna", "nachname": "Müller", "email": "anna@example.com"},
{"externe_id": "HR-003", "vorname": "Max", "nachname": "Muster", "email": "max@example.com"},
]
statistik = sync_mitarbeitende(externe_mitarbeitende)
print(f"\n--- Zusammenfassung ---")
print(f"Erstellt: {statistik['erstellt']}")
print(f"Aktualisiert: {statistik['aktualisiert']}")
print(f"Fehler: {statistik['fehler']}")
Beispiel 2: Dokument hochladen
Lade ein Dokument mit Metadaten hoch.
"""
Dokument-Upload via API
Lädt eine Datei mit Metadaten ins DMS hoch.
"""
import os
from requests import Session
API_TOKEN = os.environ.get("ELIZA_API_TOKEN")
BASE_URL = os.environ.get("ELIZA_BASE_URL", "https://example.myeliza.ch/api")
session = Session()
session.headers.update({"Authorization": f"Token {API_TOKEN}"})
def dokument_hochladen(dateipfad, ordner_id, titel=None, remote_key=None):
"""
Lädt ein Dokument ins DMS hoch.
Args:
dateipfad: Pfad zur lokalen Datei
ordner_id: ID des Zielordners in ELIZA
titel: Optionaler Titel (Standard: Dateiname)
remote_key: Optionaler externer Schlüssel
Returns:
Das erstellte Dokument als Dict oder None bei Fehler
"""
if not os.path.exists(dateipfad):
print(f"Datei nicht gefunden: {dateipfad}")
return None
dateiname = os.path.basename(dateipfad)
titel = titel or dateiname
# Metadaten
daten = {
"title": titel,
"folder": ordner_id,
}
if remote_key:
daten["remote_key"] = remote_key
# Datei öffnen und hochladen
with open(dateipfad, "rb") as datei:
response = session.post(
f"{BASE_URL}/dms/document",
data=daten,
files={"file": (dateiname, datei)}
)
if response.status_code == 201:
dokument = response.json()
print(f"✓ Hochgeladen: {titel} (ID: {dokument['id']})")
return dokument
else:
print(f"✗ Fehler beim Upload: {response.status_code}")
print(response.json())
return None
def dokument_status_aendern(dokument_id, neuer_status):
"""
Ändert den Status eines Dokuments.
Args:
dokument_id: ID des Dokuments
neuer_status: Neuer Status ('draft', 'review', 'approved', 'archived')
"""
response = session.patch(
f"{BASE_URL}/dms/document/{dokument_id}",
json={"state": neuer_status}
)
if response.status_code == 200:
print(f"✓ Status geändert auf: {neuer_status}")
return True
else:
print(f"✗ Fehler: {response.json()}")
return False
# Beispiel-Verwendung
if __name__ == "__main__":
# Dokument hochladen
dok = dokument_hochladen(
dateipfad="vertrag_2024.pdf",
ordner_id=10,
titel="Mietvertrag 2024",
remote_key="VERTRAG-2024-001"
)
if dok:
# Status auf "Genehmigt" setzen
dokument_status_aendern(dok["id"], "approved")
Beispiel 3: Arbeitszeiten exportieren
Exportiere Arbeitszeiten für einen Zeitraum.
"""
Arbeitszeiten-Export
Exportiert Arbeitszeiten für einen bestimmten Zeitraum.
"""
import os
import csv
from datetime import datetime
from requests import Session
API_TOKEN = os.environ.get("ELIZA_API_TOKEN")
BASE_URL = os.environ.get("ELIZA_BASE_URL", "https://example.myeliza.ch/api")
session = Session()
session.headers.update({"Authorization": f"Token {API_TOKEN}"})
def arbeitszeiten_abrufen(von_datum, bis_datum, mitarbeiter_id=None):
"""
Ruft Arbeitszeiten für einen Zeitraum ab.
Args:
von_datum: Startdatum (YYYY-MM-DD)
bis_datum: Enddatum (YYYY-MM-DD)
mitarbeiter_id: Optional - nur für diesen Mitarbeiter
Returns:
Liste der Arbeitszeit-Einträge
"""
params = {
"date_from": von_datum,
"date_to": bis_datum
}
if mitarbeiter_id:
params["employee"] = mitarbeiter_id
response = session.get(
f"{BASE_URL}/timetracker/worktime",
params=params
)
if response.status_code == 200:
return response.json()
else:
print(f"Fehler: {response.status_code}")
return []
def exportiere_als_csv(arbeitszeiten, ausgabedatei):
"""
Exportiert Arbeitszeiten als CSV-Datei.
"""
if not arbeitszeiten:
print("Keine Daten zum Exportieren")
return
felder = ["datum", "mitarbeiter", "projekt", "stunden", "beschreibung"]
with open(ausgabedatei, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=felder)
writer.writeheader()
for eintrag in arbeitszeiten:
writer.writerow({
"datum": eintrag.get("date", ""),
"mitarbeiter": eintrag.get("employee_name", ""),
"projekt": eintrag.get("project_name", ""),
"stunden": eintrag.get("hours", 0),
"beschreibung": eintrag.get("description", "")
})
print(f"✓ Exportiert: {ausgabedatei} ({len(arbeitszeiten)} Einträge)")
# Beispiel-Verwendung
if __name__ == "__main__":
# Arbeitszeiten für Januar 2024 abrufen
zeiten = arbeitszeiten_abrufen("2024-01-01", "2024-01-31")
# Als CSV exportieren
exportiere_als_csv(zeiten, "arbeitszeiten_januar_2024.csv")
# Zusammenfassung
total_stunden = sum(z.get("hours", 0) for z in zeiten)
print(f"\nTotal: {total_stunden} Stunden in {len(zeiten)} Einträgen")
Beispiel 4: KPI-Daten abrufen
Lese KPI-Messwerte für Dashboards.
"""
KPI-Daten abrufen
Liest KPI-Messwerte für externe Dashboards.
"""
import os
from requests import Session
API_TOKEN = os.environ.get("ELIZA_API_TOKEN")
BASE_URL = os.environ.get("ELIZA_BASE_URL", "https://example.myeliza.ch/api")
session = Session()
session.headers.update({"Authorization": f"Token {API_TOKEN}"})
def kpis_abrufen():
"""Ruft alle KPIs ab."""
response = session.get(f"{BASE_URL}/kpi/kpi")
if response.status_code == 200:
return response.json()
return []
def messungen_abrufen(kpi_id, von_datum=None, bis_datum=None):
"""
Ruft Messwerte für einen KPI ab.
Args:
kpi_id: ID des KPIs
von_datum: Optional - Startdatum
bis_datum: Optional - Enddatum
Returns:
Liste der Messwerte
"""
params = {"kpi": kpi_id}
if von_datum:
params["date_from"] = von_datum
if bis_datum:
params["date_to"] = bis_datum
response = session.get(
f"{BASE_URL}/kpi/measurement",
params=params
)
if response.status_code == 200:
return response.json()
return []
def kpi_report():
"""Erstellt einen einfachen KPI-Report."""
kpis = kpis_abrufen()
print("=" * 60)
print("KPI REPORT")
print("=" * 60)
for kpi in kpis:
print(f"\n📊 {kpi['title']}")
print(f" Einheit: {kpi.get('unit', '-')}")
print(f" Zielwert: {kpi.get('target_value', '-')}")
# Letzte Messung abrufen
messungen = messungen_abrufen(kpi["id"])
if messungen:
letzte = messungen[-1]
print(f" Aktueller Wert: {letzte.get('value', '-')}")
print(f" Gemessen am: {letzte.get('date', '-')}")
# Beispiel-Verwendung
if __name__ == "__main__":
kpi_report()
Beispiel 5: API-Client-Klasse
Eine wiederverwendbare Client-Klasse.
"""
ELIZA API Client
Wiederverwendbare Klasse für API-Zugriff.
"""
import os
from requests import Session
class ElizaAPIClient:
"""Client für die ELIZA REST API."""
def __init__(self, base_url=None, token=None):
self.base_url = base_url or os.environ.get(
"ELIZA_BASE_URL",
"https://example.myeliza.ch/api"
)
self.token = token or os.environ.get("ELIZA_API_TOKEN")
if not self.token:
raise ValueError("API-Token erforderlich")
self.session = Session()
self.session.headers.update({
"Authorization": f"Token {self.token}",
"Content-Type": "application/json"
})
def _request(self, method, endpoint, **kwargs):
"""Führt eine API-Anfrage aus."""
url = f"{self.base_url}/{endpoint.lstrip('/')}"
response = self.session.request(method, url, **kwargs)
response.raise_for_status()
return response.json() if response.content else None
def get(self, endpoint, **params):
"""GET-Anfrage."""
return self._request("GET", endpoint, params=params)
def post(self, endpoint, data):
"""POST-Anfrage."""
return self._request("POST", endpoint, json=data)
def patch(self, endpoint, data):
"""PATCH-Anfrage."""
return self._request("PATCH", endpoint, json=data)
def delete(self, endpoint):
"""DELETE-Anfrage."""
return self._request("DELETE", endpoint)
# Convenience-Methoden
def mitarbeitende(self, **filter):
"""Alle Mitarbeitenden abrufen."""
return self.get("organisation/mitarbeitende", **filter)
def mitarbeiter(self, id):
"""Einzelnen Mitarbeiter abrufen."""
return self.get(f"organisation/mitarbeitende/{id}")
def dokumente(self, **filter):
"""Alle Dokumente abrufen."""
return self.get("dms/document", **filter)
def projekte(self, **filter):
"""Alle Projekte abrufen."""
return self.get("projects/project", **filter)
# Beispiel-Verwendung
if __name__ == "__main__":
client = ElizaAPIClient()
# Mitarbeitende abrufen
for ma in client.mitarbeitende(archived=False):
print(f"- {ma['vorname']} {ma['nachname']}")
# Dokumente in Ordner 10
for dok in client.dokumente(folder=10):
print(f"- {dok['title']}")
Nächste Schritte
→ Swagger & OpenAPI - Interaktive Dokumentation
→ Best Practices - Produktionsreife Implementierung
Zusammenfassung
✅ remote_key für Synchronisation mit externen Systemen
✅ Multipart-Upload für Dateien mit files Parameter
✅ CSV-Export für Berichte
✅ Wiederverwendbare Client-Klasse für sauberen Code