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 のドキュメントに興味深いものは見当たりません。

ドキュメントでは、サーバー アクションの評価コンテキストの一部であると明示的に述べています。 https://www.odoo.com/documentation/10.0/reference/actions.html#reference-actions-server-context

Odoo 10 でサーバー アクションを作成するにはどうすればよいですか?

4

3 に答える 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>

編集:

これらのenv['module.model'].action()を使用して、 active_idsがない場合にメソッドを実行できます

于 2016-11-13T07:39:08.973 に答える
1

Odoo 10以降、古いAPIは完全に削除されました。したがって、cr、uid、およびコンテキストを使用した古いスタイルの呼び出しが問題だと思います。モデルを呼び出すだけにするか、メソッドを呼び出したいレコードがある場合はそれを使用してください。

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

ちょっとしたヒント: クライアントの設定でサーバー アクションを作成してみてください。タイプ「コード」がデフォルトで、この機能に関するいくつかのドキュメントが表示されます:-)

于 2016-11-13T08:06:01.127 に答える
1
# model call
 <field name="code">
     model.action_name()
 </field>

# record call
 <field name="code">
    record.action_name()
 </field>
于 2016-12-21T03:18:17.670 に答える