ValueError: Compute method failed to assign (Python3 odoo)

Question:

There are three compute functions in my code.
But I got the error.

Odoo Server Error

Traceback (most recent call last):
  File "/vagrant/odoo/odoo/addons/base/models/ir_http.py", line 237, in _dispatch
    result = request.dispatch()
  File "/vagrant/odoo/odoo/http.py", line 682, in dispatch
    result = self._call_function(**self.params)
  File "/vagrant/odoo/odoo/http.py", line 358, in _call_function
    return checked_call(self.db, *args, **kwargs)
  File "/vagrant/odoo/odoo/service/model.py", line 94, in wrapper
    return f(dbname, *args, **kwargs)
  File "/vagrant/odoo/odoo/http.py", line 346, in checked_call
    result = self.endpoint(*a, **kw)
  File "/vagrant/odoo/odoo/http.py", line 911, in __call__
    return self.method(*args, **kw)
  File "/vagrant/odoo/odoo/http.py", line 530, in response_wrap
    response = f(*args, **kw)
  File "/vagrant/odoo/addons/web/controllers/main.py", line 1359, in call_kw
    return self._call_kw(model, method, args, kwargs)
  File "/vagrant/odoo/addons/web/controllers/main.py", line 1351, in _call_kw
    return call_kw(request.env[model], method, args, kwargs)
  File "/vagrant/odoo/odoo/api.py", line 396, in call_kw
    result = _call_kw_multi(method, model, args, kwargs)
  File "/vagrant/odoo/odoo/api.py", line 383, in _call_kw_multi
    result = method(recs, *args, **kwargs)
  File "/vagrant/odoo/odoo/models.py", line 6165, in onchange
    value = record[name]
  File "/vagrant/odoo/odoo/models.py", line 5640, in __getitem__
    return self._fields[key].__get__(self, type(self))
  File "/vagrant/odoo/odoo/fields.py", line 979, in __get__
    raise ValueError("Compute method failed to assign %s.%s" % (record, self.name))
Exception

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/vagrant/odoo/odoo/http.py", line 638, in _handle_exception
    return super(JsonRequest, self)._handle_exception(exception)
  File "/vagrant/odoo/odoo/http.py", line 314, in _handle_exception
    raise exception.with_traceback(None) from new_cause
ValueError: Compute method failed to assign meeting.request(<NewId 0x7f4760a316d8>,).description

I have assigned empty value in my function.
Like self.request_srcmst_names = ”、self.date = ”、self.editable = False
But it still can’t work. I don’t know which function is wrong.

class MeetingRequest(models.Model):

    _name = 'meeting.request'

    request_srcmst_names = fields.Char(compute=_compute_request_srcmst_names)
    date = fields.Date(compute=compute_date, search=search_date)

    @api.depends('request_srcmst_ids')
    def _compute_request_srcmst_names(self):
        self.request_srcmst_names = ''
        for record in self:
            name = []
            for request_srcmst in record.request_srcmst_ids:
                name.append(request_srcmst.meeting_srcmst_id.name)
            record.request_srcmst_names = ', '.join(name)

    @api.depends('start_date')
    def compute_date(self):
        self.date = ''
        for record in self:
            if record.start_date:
                real_date = pytz.utc.localize(datetime.datetime.strptime(record.start_date, '%Y-%m-%d %H:%M:%S')).astimezone(pytz.timezone(config['timezone'])).date()
                record.date = real_date

class MeetingRequestSrcmst(models.Model):

    _name = 'meeting.request.srcmst'

    editable = fields.Boolean(compute=_compute_editable)

    def _compute_editable(self):
        self.editable = False
        for record in self:
            if record.hre_empbas_id.res_users_id.id == self.env.uid or record.create_uid.id == self.env.uid:
                record.editable = True

How can I fix the function? Please give me some suggestions. Thanks!

Asked By: XUN

||

Answers:

I think it’s syntax error. You forget to put a quote around function name. Computed function name should be inside a quote – compute=’compute_date’. So is search function.

In your case,

date = fields.Date(compute='compute_date', search='search_date')
request_srcmst_names = fields.Char(compute='_compute_request_srcmst_names')

Inside your functions for computed fields, you can remove :

self.editable = False
self.date = ''
self.request_srcmst_names = ''
Answered By: Khay Leng

As i can see you are trying to assign value in field that is not exist in database level.

Your code:

request_srcmst_names = fields.Char(compute=_compute_request_srcmst_names)

Replace it with below then it will work:

request_srcmst_names = fields.Char(compute=’_compute_request_srcmst_names’, store=True)

compute field by default store=False to make it store able you need pass parameter store=True.

Hope provided solution works for you.

Answered By: Sachin Sonigra
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.