2016-11-13 7 views
3

In Odoo 8 konnte ich einen Server Aktion unter Verwendung von XML wie definieren: Dies würde ausführen meine module.model.action() -MethodeWie erstellt man Serveraktionen in Odoo 10?

<?xml version="1.0" encoding="utf-8" ?> 
<odoo> 
    <data> 
    <record id="action" model="ir.actions.server"> 
     <field name="name">My Action</field> 
     <field name="model_id" ref="model_module_model"/> 
     <field name="code">self.action(cr, uid, context=context)</field> 
    </record> 
    </data> 
</odoo> 

.

In Odoo 10, wirft dieser Code eine Ausnahme:

ERROR:odoo.http:Exception during JSON request handling. 
Traceback (most recent call last): 
File "/usr/share/odoo/lib/python2.7/site-packages/odoo/http.py", line 638, in _handle_exception 
    return super(JsonRequest, self)._handle_exception(exception) 
File "/usr/share/odoo/lib/python2.7/site-packages/odoo/http.py", line 675, in dispatch 
    result = self._call_function(**self.params) 
File "/usr/share/odoo/lib/python2.7/site-packages/odoo/http.py", line 331, in _call_function 
    return checked_call(self.db, *args, **kwargs) 
File "/usr/share/odoo/lib/python2.7/site-packages/odoo/service/model.py", line 119, in wrapper 
    return f(dbname, *args, **kwargs) 
File "/usr/share/odoo/lib/python2.7/site-packages/odoo/http.py", line 324, in checked_call 
    result = self.endpoint(*a, **kw) 
File "/usr/share/odoo/lib/python2.7/site-packages/odoo/http.py", line 933, in __call__ 
    return self.method(*args, **kw) 
File "/usr/share/odoo/lib/python2.7/site-packages/odoo/http.py", line 504, in response_wrap 
    response = f(*args, **kw) 
File "/usr/share/odoo/lib/python2.7/site-packages/odoo/addons/web/controllers/main.py", line 1129, in run 
    result = request.env['ir.actions.server'].browse([action_id]).run() 
File "/usr/share/odoo/lib/python2.7/site-packages/odoo/addons/base/ir/ir_actions.py", line 964, in run 
    res = func(action, eval_context=eval_context) 
File "/usr/share/odoo/lib/python2.7/site-packages/odoo/addons/base/ir/ir_actions.py", line 793, in run_action_code_multi 
    safe_eval(action.code.strip(), eval_context, mode="exec", nocopy=True) # nocopy allows to return 'action' 
File "/usr/share/odoo/lib/python2.7/site-packages/odoo/tools/safe_eval.py", line 301, in safe_eval 
    return unsafe_eval(c, globals_dict, locals_dict) 
File "", line 1, in <module> 
ValueError: <type 'exceptions.NameError'>: "name 'self' is not defined" while evaluating 
u'self.action(cr, uid, context=context)' 

ich nichts Interessantes in der Odoo Dokumentation über Server-Aktionen bei https://www.odoo.com/documentation/10.0/reference/actions.html#code

zu sehen und die Dokumentation ausdrücklich betont, dass selbst ist Teil des Evaluationskontexts für Serveraktionen, siehe https://www.odoo.com/documentation/10.0/reference/actions.html#reference-actions-server-context

Wie erstellt man Serveraktionen in Odoo 10?

Antwort

7

Es gibt keine Notwendigkeit, sich selbst zu Objekt ist während declare Server Aktionen in Odoo 10. Wir können direkt Zugangsmodell/Objekt mit env [ 'model.name']

mit folgenden Code Versuchen:

<?xml version="1.0" encoding="utf-8" ?> 
<odoo> 
    <data> 
    <record id="action" model="ir.actions.server"> 
     <field name="name">My Action</field> 
     <field name="model_id" ref="model_module_model"/> 
     <field name="code"> 
     if context.get('active_model') == 'your.module.model' and context.get('active_ids'): 
       action = env['module.model'].browse(context['active_ids']).action() 
    </record> 
    </data> 
</odoo> 

EDIT:.

Wir können diese env verwenden [ 'module.model'] action() Methode auszuführen, wenn es keine ist active_ids

+0

Interessant ... Ich benutze ein Menüelement, um eine Serveraktion auszulösen ... würde das nicht bedeuten, dass es sie gibt keine aktiven IDs? –

+0

Für Serveraktionen in Kontexten, in denen keine aktiven IDs vorhanden sind, einfach: ' env ['module.model']. Action()' –

0

Die alte API komplett seit Odoo 10. So entfernt wurde ich Ihren alten Stil Anruf erraten mit cr, uid und Kontext ist das Problem. Versuchen Sie, das Modell nur aufzurufen, oder verwenden Sie es, wenn ein Datensatz vorhanden ist, für den Sie die Methode aufrufen möchten.

# model call 
model.action() 
# record call 
object.action() 

Ein kleiner Tipp: Versuchen Sie eine Serveraktion unter Einstellungen im Client zu erstellen. Geben Sie "code" ein und Sie erhalten eine Dokumentation über dieses Feature :-)

0
# model call 
<field name="code"> 
    model.action_name() 
</field> 

# record call 
<field name="code"> 
    record.action_name() 
</field> 
Verwandte Themen