11

Sometimes stored fields must be recomputed, but triggers can not be launched (e.g. in case of SQL injection).

How to recompute them an easy way?

Bhavesh Odedra
  • 10,990
  • 12
  • 33
  • 58
and3p
  • 994
  • 2
  • 10
  • 23

4 Answers4

17

(Because I came here via google:)

You can also do this from the Odoo Shell:

# python odoo.py shell -c openerp-server.conf  -d <database>

>>> model = env['account.invoice']
>>> env.add_todo(model._fields['amount_total'], model.search([]))
>>> model.recompute()
>>> env.cr.commit()

Odoo shell is available in 9, 10 and via an OCA module in 8.

RoelAdriaans
  • 763
  • 7
  • 16
9

In v13 the above syntax still works, but the add_todo should be replaced by add_to_compute:

model = env['account.move']
env.add_to_compute(model._fields['amount_total'], model.search([]))
model.recompute()

To avoid loading all objects into memory use ids instead:

model = env['account.move']
ids = [x.get('id') for x in model.search_read(domain, ['id'])]
env.all.tocompute[model._fields['amount_total']].update(ids)
model.recompute()
BlouBlou
  • 630
  • 6
  • 13
Robrecht
  • 91
  • 1
  • 2
6

In v8.0 (should work in 9.0 too) you can do it like that:

# Recompute amount_total for account.invoice

env.add_todo(model._fields['amount_total'], object)
model.recompute()

# where
# object - recordset of instances to recompute field for
# model - recordset instances model

Above code can be used in server action directly.

Bhavesh Odedra
  • 10,990
  • 12
  • 33
  • 58
and3p
  • 994
  • 2
  • 10
  • 23
-1

in the odoo11

env.add_todo(model._fields['loading_time'], env['product.product'].search([]))
model.recompute()
龙美凤
  • 11
  • 1