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

Openerp 如何在Odoo 10中创建服务器操作?,openerp,odoo-10,Openerp,Odoo 10,在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

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

我的行动
self.action(cr、uid、context=context)
这将执行我的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)'
ERROR:odoo.http:处理JSON请求时发生异常。
回溯(最近一次呼叫最后一次):
文件“/usr/share/odoo/lib/python2.7/site packages/odoo/http.py”,第638行,在异常处理中
返回super(JsonRequest,self)。\u handle\u异常(exception)
文件“/usr/share/odoo/lib/python2.7/site packages/odoo/http.py”,第675行,在分派中
结果=self.\u调用函数(**self.params)
文件“/usr/share/odoo/lib/python2.7/site packages/odoo/http.py”,第331行,在调用函数中
返回选中的\u调用(self.db、*args、**kwargs)
包装器中的文件“/usr/share/odoo/lib/python2.7/site packages/odoo/service/model.py”,第119行
返回f(数据库名,*args,**kwargs)
文件“/usr/share/odoo/lib/python2.7/site packages/odoo/http.py”,第324行,在checked_调用中
结果=自身终点(*a,**kw)
文件“/usr/share/odoo/lib/python2.7/site packages/odoo/http.py”,第933行,在调用中__
返回自方法(*参数,**kw)
文件“/usr/share/odoo/lib/python2.7/site packages/odoo/http.py”,第504行,作为回复
响应=f(*参数,**kw)
文件“/usr/share/odoo/lib/python2.7/site packages/odoo/addons/web/controllers/main.py”,第1129行,正在运行
结果=request.env['ir.actions.server'].browse([action_id]).run()
文件“/usr/share/odoo/lib/python2.7/site packages/odoo/addons/base/ir/ir_actions.py”,第964行,运行中
res=func(操作,评估上下文=评估上下文)
文件“/usr/share/odoo/lib/python2.7/site packages/odoo/addons/base/ir/ir\u actions.py”,第793行,运行操作代码
safe_eval(action.code.strip(),eval_context,mode=“exec”,nocopy=True)#nocopy允许返回“action”
文件“/usr/share/odoo/lib/python2.7/site packages/odoo/tools/safe_eval.py”,第301行,在safe_eval中
返回不安全评估(c、全局、局部)
文件“”,第1行,在
ValueError::“计算时未定义名称‘self’”
u'self.action(cr,uid,context=context)'
我在关于服务器操作的Odoo文档中没有看到任何有趣的内容

文档明确声明self是服务器操作评估上下文的一部分,请参阅

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

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

我的行动
如果context.get('active_model')='your.module.model'和context.get('active_id'):
action=env['module.model']。浏览(上下文['active_id'])。action()
编辑:


当没有活动的\u id时,我们可以使用这些env['module.model'].action()来执行方法。自Odoo 10以来,旧API已完全删除。因此,我想您使用cr、uid和上下文的旧式调用就是问题所在。尝试只调用模型,或者如果有一条记录要调用该方法,请使用它

#模型调用
模型.行动()
#录音电话
object.action()
一点提示:尝试在客户端的“设置”下创建服务器操作。键入“code”是默认值,您将获得有关此功能的一些文档:-)

\model call
model.action_name()
#录音电话
record.action_name()

有趣。。。我正在使用菜单项触发服务器操作。。。这不意味着没有活动ID吗?对于没有活动ID的上下文中的服务器操作,只需:
env['module.model'].action()
# model call
 <field name="code">
     model.action_name()
 </field>

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