2016-12-21 2 views
0

Sagen wir, ich Server Aktion A auf dem stock.inventory Modell aufgebaut. Diese Aktion protokolliert einfach einen Wert und ruft dann die Serveraktion B (mit der Datenbank-ID 366) auf. Der Python-Code in der Aktion ist einfach:Odoo automatisierte Server Aktion auszulösen einen anderen Server Aktion

log('running server action a') 
value = { 
    "type": "ir.actions.server", 
    "id": 366, 
} 

Dann in Server Action-B, die auf das product.product Modell ist, ist der Python-Code einfach:

log('running server aciton b') 

Nun, wenn ich Server Aktion hinzufügen A in das Menü "Mehr" und manuell auslösen es aus dem Browser auf einem stock.inventory Objekt, beide Aktionen erfolgreich ausgeführt. Mit anderen Worten, ich sehe in den Protokollen sowohl die Ausführung der Serveraktion a als auch die Ausführung der Serveraktion b.

Jetzt schaffe ich eine automatisierte Aktion Server Aktion A auf Update auslösen oder eines stock.inventory Objekt erstellen. Nachdem ich das gemacht habe und ein stock.inventory Objekt über die UI aktualisiert oder erstellt habe, sehe ich nur 'running server action' in den Protokollen. Mit anderen Worten, Serveraktion B wird nie ausgelöst, wie wenn ich das gleiche Experiment manuell aus dem "Mehr" -Menü ausgeführt hätte.

Also, meine Frage ist, ob es möglich ist, eine zweite Server Aktion vom ersten Server Aktion auszulösen, wenn die erste Aktion Server durch eine automatisierte Aktion ausgelöst wird.

+0

Wie rufen Sie die Aktion? Ich denke, aus dem Kontext einer automatisierten Aktion müssen Sie die Methode aufrufen, keine Aktion zurückgeben. Die Semantik für diese Art von Problemen kann bizarr erscheinen. Ich rief eine Serveraktion auf, die eine Fensteraktion zurückgab und nichts funktionierte, bis ich den Aktionswert der zurückgegebenen Fensteraktion zugewiesen hatte. Unter normalen Umständen hätte ich jedoch einfach die Fensteraktion zurückgegeben und erwartet, dass sie die Ansicht lädt. –

+0

Ich bin mir nicht sicher, aber ich frage mich, ob Aktionen, die von Funktionen zurückgegeben werden, anders behandelt werden, wenn sie von einem Browser aufgerufen werden, als von Code. Es ist möglich, dass Sie möglicherweise die andere Methode direkt aufrufen müssen, anstatt eine Aktion zurückzugeben, die die Methode tatsächlich nur aufruft. –

+0

@PhillipStack Ich denke, du hast Recht. Es scheint, als wenn Sie eine Aktion "zurückgeben", das ist etwas, das der Browser versteht. Es kann den Server aufrufen und die zurückgegebene Aktion ausführen. Ich würde gerne die Methode aufrufen, wie Sie es vorschlagen, aber leider mache ich das alles auf einer Version von Odoo Online, dh ich habe keinen Zugriff auf den Quellcode. Ich füge diese Aktionen über die Benutzeroberfläche hinzu und finde keine Möglichkeit, eine Aktion von einer anderen Serverseite aus zu starten. – flyingL123

Antwort

1

konnte ich diese Funktion erhalten, und die Lösung ist sehr einfach. Dies scheint eine ziemlich coole Möglichkeit für Odoo Online-Benutzer zu sein, Serveraktionen als Funktionen zu betrachten, die Werte an die rufende Serveraktion zurückgeben können.

Hier ist ein Beispiel.

Server Aktion A

a = env['ir.actions.server'].browse(409) 
ctx = dict(env.context or {}) 
ctx.update({'active_id': 169, 'active_model': 'purchase.order'}) 
a.with_context(ctx).run() 

Server Aktion B (ID = 409)

raise Warning(record) 

Wenn Sie die erste Aktion auslösen, werden Sie die Zeichenfolge purchase.order(169,) als Ausgabe erhalten.

Noch cooler, wenn der zweite Server action einen Wert zuweist, wird es zur ersten Aktion zurückgegeben. Zum Beispiel:

Server Aktion A

a = env['ir.actions.server'].browse(409) 
ctx = dict(env.context or {}) 
ctx.update({'active_id': 169, 'active_model': 'purchase.order'}) 
resp = a.with_context(ctx).run() 
raise Warning(resp) 

Server Aktion B (ID = 409)

action = record.id 

Wenn Sie den ersten Server Aktion auslösen, werden Sie sehen, wie 169 die Antwort.

0

Wenn Sie Zugriff auf den Admin-Bereich. Sie sollten die Funktion direkt aufrufen können. In odoo8 sieht es so aus.

enter image description here

Wählen Sie Ihre Server-Aktion

enter image description here

Beachten Sie die Python-Code-Seite. Sie sollten in der Lage sein, das benötigte Modell zu finden und die Funktion direkt auszuführen.

Um eine andere Aktion auszuführen, versuchen Sie Folgendes.

action = self.env['ir.actions.server'].ref('xml_id_of_action') 
action.run_action_code_multi() 

Hier ist die Beschreibung

run_action_code_multi(self, *args, **kwargs) Override to allow returning response the same way action is already returned by the basic server action behavior. Note that response has priority over action, avoid using both.

+0

Ja, mir ist das Python-Code-Feld bekannt, so habe ich die Aktionen an erster Stelle erstellt und Code zum Protokollieren von Werten enthalten, wie in der ursprünglichen Frage gezeigt. Das Problem, dass ich eine weitere Aktion innerhalb dieser Code-Box auslösen möchte, und ich weiß nicht, wie es geht. Ist das sinnvoll? – flyingL123

+0

Nun, ich bin mir nicht ganz sicher, auf welchen Kontext Sie im Hinblick auf den Aufruf der odoo-Funktion innerhalb der Python-Code-Box beschränkt sind. Ich werde meine Antwort aktualisieren. Versuchen Sie einfach, die Funktion Ihrer anderen Aktion aufzurufen. Ich weiß nicht, wie ich die Aktion nennen soll. Aber Sie können wahrscheinlich die Funktion aufrufen. –

+0

Ich kann die Methode nicht einfach direkt aufrufen, da die Methode nicht existiert, da ich odoo online verwende. Es gibt keine Methode, es ist eine andere Serveraktion. Es sei denn, eine Server-Aktion erhält irgendwie automatisch einen Namen, der es erlaubt, sie als eine Methode auf dem Modell aufzurufen. Das wäre nett, aber klingt, als wäre es nicht wahr. – flyingL123

Verwandte Themen