This question has been flagged

Hello

Can anyone help me on a single date calculation

I have 2 date fields:

'x_studio_last_maintenance_date' and 'x_studio_next_maintenance_date'

I need that in the record when i set the last_maintenance_date,  the next_maintenance_date is calculated 1 year after de last_maintenance_date

Here is what i set in the compute field in the via studio:

from datetime import timedelta
for record in self:
  record['x_studio_next_maintenance_date'] = x_studio_last_maintenance_date + timedelta(years=1) 

Then i try  it and receive this error:

Any help about this error. I do not know python

Traceback (most recent call last):
  File "/home/odoo/src/odoo/16.0/odoo/http.py", line 1578, in _serve_db
    return service_model.retrying(self._serve_ir_http, self.env)
  File "/home/odoo/src/odoo/16.0/odoo/service/model.py", line 134, in retrying
    result = func()
  File "/home/odoo/src/odoo/16.0/odoo/http.py", line 1607, in _serve_ir_http
    response = self.dispatcher.dispatch(rule.endpoint, args)
  File "/home/odoo/src/odoo/16.0/odoo/http.py", line 1804, in dispatch
    result = self.request.registry['ir.http']._dispatch(endpoint)
  File "/home/odoo/src/odoo/16.0/addons/website/models/ir_http.py", line 227, in _dispatch
    response = super()._dispatch(endpoint)
  File "/home/odoo/src/odoo/16.0/odoo/addons/base/models/ir_http.py", line 140, in _dispatch
    result = endpoint(**request.params)
  File "/home/odoo/src/odoo/16.0/odoo/http.py", line 698, in route_wrapper
    result = endpoint(self, *args, **params_ok)
  File "/home/odoo/src/odoo/16.0/addons/web/controllers/dataset.py", line 42, in call_kw
    return self._call_kw(model, method, args, kwargs)
  File "/home/odoo/src/odoo/16.0/addons/web/controllers/dataset.py", line 33, in _call_kw
    return call_kw(request.env[model], method, args, kwargs)
  File "/home/odoo/src/odoo/16.0/odoo/api.py", line 461, in call_kw
    result = _call_kw_multi(method, model, args, kwargs)
  File "/home/odoo/src/odoo/16.0/odoo/api.py", line 448, in _call_kw_multi
    result = method(recs, *args, **kwargs)
  File "/home/odoo/src/odoo/16.0/odoo/models.py", line 6514, in onchange
    todo = [
  File "/home/odoo/src/odoo/16.0/odoo/models.py", line 6517, in 
    if name not in done and snapshot0.has_changed(name)
  File "/home/odoo/src/odoo/16.0/odoo/models.py", line 6300, in has_changed
    return self[name] != record[name]
  File "/home/odoo/src/odoo/16.0/odoo/models.py", line 5842, in __getitem__
    return self._fields[key].__get__(self, type(self))
  File "/home/odoo/src/odoo/16.0/odoo/fields.py", line 1135, in __get__
    self.recompute(record)
  File "/home/odoo/src/odoo/16.0/odoo/fields.py", line 1324, in recompute
    self.compute_value(recs)
  File "/home/odoo/src/odoo/16.0/odoo/fields.py", line 1346, in compute_value
    records._compute_field_value(self)
  File "/home/odoo/src/odoo/16.0/addons/mail/models/mail_thread.py", line 403, in _compute_field_value
    return super()._compute_field_value(field)
  File "/home/odoo/src/odoo/16.0/odoo/models.py", line 4189, in _compute_field_value
    field.compute(self)
  File "/home/odoo/src/odoo/16.0/odoo/addons/base/models/ir_model.py", line 37, in 
    func = lambda self: safe_eval(text, SAFE_EVAL_BASE, {'self': self}, mode="exec")
  File "/home/odoo/src/odoo/16.0/odoo/tools/safe_eval.py", line 337, in safe_eval
    c = test_expr(expr, _SAFE_OPCODES, mode=mode, filename=filename)
  File "/home/odoo/src/odoo/16.0/odoo/tools/safe_eval.py", line 195, in test_expr
    assert_valid_codeobj(allowed_codes, code_obj, expr)
  File "/home/odoo/src/odoo/16.0/odoo/tools/safe_eval.py", line 168, 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 "from datetime import timedelta\nfor record in self:\n  record['x_studio_next_maintenance_date'] = x_studio_last_maintenance_date + timedelta(years=1) ": IMPORT_NAME, IMPORT_FROM

The above server error caused the following client error:
null

I thank you in advance

Avatar
Discard
Best Answer

You can't use years with timedelta, so you can use relativedelta as below:

You will add  x_studio_last_maintenance_date  to  Dependencies of the field  x_studio_next_maintenance_date and use the below code:

for rec in self:
if rec.x_studio_last_maintenance_date:
rec['x_studio_next_maintenance_date'] = rec.x_studio_last_maintenance_date + dateutil.relativedelta.relativedelta(years=1)
Avatar
Discard

Thank you for your help Sir. it works perfectly for me.

Author Best Answer

It works perfectly.

I really thank you. Have a nice day

Avatar
Discard

Thanks for feedback.