首页 文章

如何在Odoo 10中创建服务器操作?

提问于
浏览
3

在Odoo 8中,我能够使用XML定义服务器操作,例如:

<?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>

这将执行我的module.model.action()方法 .

在Odoo 10中,此代码抛出异常:

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)'

我在https://www.odoo.com/documentation/10.0/reference/actions.html#code的Odoo文档中没有看到有关服务器操作的任何有趣内容

文档明确声明self是服务器操作的评估上下文的一部分,请参阅https://www.odoo.com/documentation/10.0/reference/actions.html#reference-actions-server-context

如何在Odoo 10中创建服务器操作?

3 回答

  • 8

    在Odoo 10中声明服务器操作时不需要自我对象 . 我们可以使用env直接访问模型/对象['model.name']

    尝试使用以下代码:

    <?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:

    当没有active_ids时,我们可以使用这些env ['module.model'] .action()来执行方法

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

    自Odoo 10以来,旧的API被完全删除了 . 所以我猜你的旧样式调用cr,uid和context就是问题所在 . 尝试调用模型,或者如果有想要调用方法的记录,请使用它 .

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

    一点提示:尝试在客户端的设置下创建服务器操作 . 键入'code'是默认值,您将获得有关此功能的一些文档:-)

相关问题