Skripte

Schreibe wiederverwendbare Python-Skripte und führe sie über das Dashboard auf deinen Odoo-Diensten aus.

Skripte erlauben es dir, kleine Python-Schnipsel einmal zu schreiben und sie bei Bedarf gegen jeden kompatiblen Odoo-Dienst auszuführen. Sie laufen via click-odoo innerhalb des Dienst-Containers und haben damit direkten Zugriff auf die üblichen Odoo-Shell-Globals (env, self) — genau wie eine interaktive odoo shell-Sitzung.

Typische Anwendungsfälle:

  • Einmalige Datenkorrekturen («alle Entwurf-Rechnungen vor Datum X aktualisieren»)
  • Massenänderungen an Einstellungen über mehrere Kundeninstanzen hinweg
  • Wiederkehrende Wartungsaufgaben, die du nicht jedes Mal neu eintippen willst
  • Neuberechnungen anstossen oder Custom-Code ausführen, der das Odoo-ORM benötigt

#Wo Skripte zu finden sind

Skripte befinden sich im Navigationspunkt Developer → Scripts. Von dort kannst du sie auflisten, erstellen, bearbeiten und ausführen.

Du kannst ein Skript auch direkt von einem Dienst aus starten:

  • Öffne einen Dienst und klicke in der Kopfzeile auf Skript ausführen — wähle aus den mit dieser Odoo-Version kompatiblen Skripten.
  • Wähle in der Dienstetabelle mehrere Dienste aus und nutze die Massenaktion Skript ausführen — angeboten werden nur Skripte, die mit jeder Version der ausgewählten Dienste kompatibel sind.

#Skript erstellen

  1. Öffne Developer → Scripts und klicke auf Neues Skript.
  2. Fülle die Details aus:
    • Name — wird in der Skriptliste und im Ausführen-Dialog angezeigt.
    • Kompatible Odoo-Versionen — wähle jede Version aus, auf der dieses Skript sicher ausgeführt werden darf. Dienste auf anderen Versionen können nicht als Ziel ausgewählt werden.
    • Beschreibung — optionaler Kontext, z. B. was das Skript tut und welche Voraussetzungen es hat.
  3. Definiere optional Parameter (siehe unten).
  4. Schreibe den Python-Code in den Skript-Editor und speichere.

Der Skriptkörper läuft via click-odoo — eine offene Transaktion wird automatisch committet, wenn das Skript erfolgreich endet. Wirft das Skript eine Exception, wird die Transaktion zurückgerollt.

#Ein minimales Beispiel

# Mailversand auf einer kopierten Datenbank deaktivieren
env['ir.mail_server'].search([]).write({'active': False})
print('Deaktiviert:', env['ir.mail_server'].search_count([('active', '=', False)]), 'Mailserver.')

Wenn dieses Skript gegen einen Dienst läuft, wird die Ausgabe auf dem Aktionen-Tab dieses Dienstes erfasst.

#Parameter

Parameter sind optionale Eingaben, die zur Laufzeit abgefragt werden. Jeder Parameter wird oben im Skript als ganz normale Python-Variable bereitgestellt — du kannst ihn ohne weiteren Boilerplate-Code direkt verwenden.

Für jeden Parameter definierst du:

Feld Beschreibung
Variablenname Ein gültiger Python-Bezeichner — Buchstaben, Ziffern und Unterstriche; darf nicht mit einer Ziffer beginnen.
Label Lesbare Bezeichnung im Ausführen-Dialog. Standardmässig wird der Variablenname verwendet.
Typ Einer von string, integer, float, boolean. Bestimmt, wie der Wert in Python gerendert wird.
Default Vorbelegter Wert im Ausführen-Dialog. Optional.
Pflichtfeld Wenn aktiviert, weigert sich das Skript zu laufen, falls der Wert leer ist.

Die Plattform rendert den gewählten Wert als nativen Python-Literal-Wert bevor dein Code läuft — du kannst ihn also direkt verwenden:

# Parameter: partner_id (integer, Pflichtfeld), only_unpaid (boolean, Default true)
domain = [('partner_id', '=', partner_id)]
if only_unpaid:
    domain.append(('payment_state', '!=', 'paid'))

invoices = env['account.move'].search(domain)
print('Gefunden:', len(invoices), 'Rechnungen.')

Parameterwerte werden als Python-Literale gerendert — Strings werden korrekt zitiert, Booleans werden zu True/False, Zahlen bleiben numerisch. Du musst sie nicht selbst parsen oder casten.

#Skript ausführen

Klicke auf Ausführen bei einem Skript (in der Skriptliste, auf der Bearbeitungsseite oder über eine Dienstaktion), um den Ausführen-Dialog zu öffnen:

  1. Zieldienste — wähle einen oder mehrere Dienste. Verfügbar sind nur Dienste, deren Odoo-Version unter Kompatible Odoo-Versionen aufgeführt ist.
  2. Parameter — fülle die vom Skript deklarierten Eingaben aus.
  3. Klicke auf Ausführen.

Das Skript wird als eine Aktion pro ausgewähltem Dienst eingereiht. Die Benachrichtigung bestätigt, auf wie vielen Diensten es eingereiht wurde.

Jeder Lauf ist eine eigene Aktion. Ausgabe, Exit-Status und Zeitstempel werden auf dem Aktionen-Tab des jeweiligen Dienstes festgehalten — genau wie bei Backups, Neustarts oder Deployments.

#Wie Skripte ausgeführt werden

Wenn ein Lauf eingereiht wird, geht die Plattform so vor:

  1. Sie rendert die Parameterwerte als Python-Literale und stellt sie dem Skriptkörper voran.
  2. Sie schreibt die resultierende Datei mit einem zufälligen Namen (z. B. aura_script_<random>.py) in das Daten-Volume des Dienstes.
  3. Sie führt docker compose run --rm <container> click-odoo --database=<db> <script-path> gegen den Dienst aus.
  4. Sie erfasst stdout und stderr im Aktionsdatensatz und entfernt anschliessend die Skriptdatei.

Da die Ausführung innerhalb des Dienst-Containers mit vollständig hochgefahrenem Odoo-Environment passiert, hast du dieselben Möglichkeiten wie in einer interaktiven odoo shell — inklusive Zugriff auf env, Modelle, das Registry und alle installierten Addons.

#Hinweise zur Sicherheit

Skripte laufen mit vollem Datenbankzugriff über das Odoo-ORM. Teste auf einer Kopie oder einem Vorschau-Deployment, bevor du gegen Produktivdaten arbeitest. Für committete Änderungen gibt es kein Undo.

  • Nutze Kopien erstellen oder Vorschau-Deployments, um Skripte zuerst auf einer nicht-produktiven Datenbank zu testen.
  • Ein fehlschlagendes Skript bricht seine eigene Transaktion ab, aber ein Skript, das mit fehlerhafter Logik «erfolgreich» durchläuft, committet. Baue print(...)-Aufrufe ein und führe das Skript zuerst auf einer Kopie aus, um das Resultat zu prüfen, bevor du es auf Produktion loslässt.
  • Kompatible Versionen wirken als Sicherheitsleitplanke — ein Skript kann nie auf einem Dienst eingereiht werden, dessen Odoo-Version nicht in seiner Allow-Liste steht.
  • Skripte sind auf dein Team beschränkt. Andere Teams können sie weder sehen noch bearbeiten oder ausführen.

#Nachvollziehbarkeit

Jeder Skriptlauf erscheint auf dem Aktionen-Tab des Zieldienstes mit Skriptname, Auslöser, Zeitpunkt und vollständiger Ausgabe. Änderungen am Skript selbst werden in seiner Aktivitäts-Timeline festgehalten.