I'm using the SaaS version. I'm trying to create a relatively simple calculated field using Odoo Studio.
A field called x_studio_value_c should be the sum of x_studio_value_a and x_studio_value_b.
In Odoo Studio, I've confirmed that each field is of type FLOAT, and I've added the following code:
for record in self:
record.x_studio_value_c = record.x_studio_value_a + record.x_studio_value_b
When I modify the value of 'a', I receive the following error:
Traceback (most recent call last):
File "/home/odoo/src/odoo/19.0/odoo/http.py", line 2266, in _serve_db
return service_model.retrying(serve_func, env=self.env)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/19.0/odoo/service/model.py", line 184, in retrying
result = func()
^^^^^^
File "/home/odoo/src/odoo/19.0/odoo/http.py", line 2313, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/19.0/odoo/http.py", line 2528, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/19.0/odoo/addons/base/models/ir_http.py", line 357, in _dispatch
result = endpoint(**request.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/19.0/odoo/http.py", line 788, in route_wrapper
result = endpoint(self, *args, **params_ok)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/19.0/addons/web/controllers/dataset.py", line 32, in call_kw
return call_kw(request.env[model], method, args, kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/19.0/odoo/service/model.py", line 93, in call_kw
result = method(recs, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/19.0/addons/web/models/models.py", line 2107, in onchange
if field_name not in done and snapshot0.has_changed(field_name)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/19.0/addons/web/models/models.py", line 2219, in has_changed
return self[field_name] != self.record[field_name]
~~~~~~~~~~~^^^^^^^^^^^^
File "/home/odoo/src/odoo/19.0/odoo/orm/models.py", line 6680, in __getitem__
return self._fields[key].__get__(self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/19.0/odoo/orm/fields.py", line 1660, in __get__
self.recompute(record)
File "/home/odoo/src/odoo/19.0/odoo/orm/fields.py", line 1886, in recompute
apply_except_missing(self.compute_value, recs)
File "/home/odoo/src/odoo/19.0/odoo/orm/fields.py", line 1856, in apply_except_missing
func(records)
File "/home/odoo/src/odoo/19.0/odoo/orm/fields.py", line 1910, in compute_value
records._compute_field_value(self)
File "/home/odoo/src/odoo/19.0/addons/mail/models/mail_thread.py", line 476, in _compute_field_value
return super()._compute_field_value(field)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/19.0/odoo/orm/models.py", line 4949, in _compute_field_value
determine(field.compute, self)
File "/home/odoo/src/odoo/19.0/odoo/orm/fields.py", line 84, in determine
return needle(records, *args)
^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/19.0/odoo/addons/base/models/ir_model.py", line 50, in func
return safe_eval(text, SAFE_EVAL_BASE | {'self': self}, mode="exec")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/19.0/odoo/tools/safe_eval.py", line 394, in safe_eval
assert_valid_codeobj(_SAFE_OPCODES, c, expr)
File "/home/odoo/src/odoo/19.0/odoo/tools/safe_eval.py", line 237, in assert_valid_codeobj
raise ValueError("forbidden opcode(s) in %r: %s" % (expr, ', '.join(opname[x] for x in (code_codes - allowed_codes))))
ValueError: forbidden opcode(s) in 'for record in self:\r\n record.x_studio_value_c = record.x_studio_value_a + record.x_studio_value_b': STORE_ATTRDoes anyone have any ideas?