Overriding write () method in odoo 8 raises RuntimeError: maximum recursion depth

This seems like a pretty simple problem, but somehow I can't find a solution.

When I click the save button, the recording method will be executed. I want to change the value (or call a function) of the current model every time I call the write method, so I redefined the write () method of my model as

@api.multi def write(self, vals): self.flaeche = 37 return super(lager, self).write(vals) 

(model lager.py and field flaeche = fields.Float(string=u"Flรคche (mยฒ)") )

Error: RuntimeError: maximum recursion depth exceeded

 Traceback (most recent call last): File "/home/tertia/workspace/odoo8/openerp/http.py", line 530, in _handle_exception return super(JsonRequest, self)._handle_exception(exception) File "/home/tertia/workspace/odoo8/openerp/http.py", line 567, in dispatch result = self._call_function(**self.params) File "/home/tertia/workspace/odoo8/openerp/http.py", line 303, in _call_function return checked_call(self.db, *args, **kwargs) File "/home/tertia/workspace/odoo8/openerp/service/model.py", line 113, in wrapper return f(dbname, *args, **kwargs) File "/home/tertia/workspace/odoo8/openerp/http.py", line 300, in checked_call return self.endpoint(*a, **kw) File "/home/tertia/workspace/odoo8/openerp/http.py", line 796, in __call__ return self.method(*args, **kw) File "/home/tertia/workspace/odoo8/openerp/http.py", line 396, in response_wrap response = f(*args, **kw) File "/home/tertia/workspace/odoo8/openerp/addons/web/controllers/main.py", line 936, in call_kw return self._call_kw(model, method, args, kwargs) File "/home/tertia/workspace/odoo8/openerp/addons/web/controllers/main.py", line 928, in _call_kw return getattr(request.registry.get(model), method)(request.cr, request.uid, *args, **kwargs) File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper return old_api(self, *args, **kwargs) File "/home/tertia/workspace/odoo8/openerp/api.py", line 363, in old_api result = method(recs, *args, **kwargs) File "/home/tertia/workspace/odoo8/custom_modules/g4e_config/lager.py", line 225, in write self.flaeche = 37 File "/home/tertia/workspace/odoo8/openerp/fields.py", line 853, in __set__ record.write({self.name: self.convert_to_write(value)}) File "/home/tertia/workspace/odoo8/openerp/api.py", line 239, in wrapper return new_api(self, *args, **kwargs) File "/home/tertia/workspace/odoo8/custom_modules/g4e_config/lager.py", line 225, in write self.flaeche = 37 File "/home/tertia/workspace/odoo8/openerp/fields.py", line 853, in __set__ record.write({self.name: self.convert_to_write(value)}) File "/home/tertia/workspace/odoo8/openerp/api.py", line 239, in wrapper return new_api(self, *args, **kwargs) ..... File "/home/tertia/workspace/odoo8/custom_modules/g4e_config/lager.py", line 225, in write self.flaeche = 37 File "/home/tertia/workspace/odoo8/openerp/fields.py", line 853, in __set__ record.write({self.name: self.convert_to_write(value)}) File "/home/tertia/workspace/odoo8/openerp/api.py", line 239, in wrapper return new_api(self, *args, **kwargs) File "/home/tertia/workspace/odoo8/custom_modules/g4e_config/lager.py", line 225, in write self.flaeche = 37 File "/home/tertia/workspace/odoo8/openerp/fields.py", line 853, in __set__ record.write({self.name: self.convert_to_write(value)}) File "/home/tertia/workspace/odoo8/openerp/api.py", line 239, in wrapper return new_api(self, *args, **kwargs) File "/home/tertia/workspace/odoo8/custom_modules/g4e_config/lager.py", line 224, in write super(lager, self).write(vals) File "/home/tertia/workspace/odoo8/openerp/api.py", line 239, in wrapper return new_api(self, *args, **kwargs) File "/home/tertia/workspace/odoo8/openerp/api.py", line 546, in new_api result = method(self._model, cr, uid, self.ids, *args, **kwargs) File "/home/tertia/workspace/odoo8/openerp/addons/mail/mail_thread.py", line 435, in write self.message_auto_subscribe(cr, uid, ids, values.keys(), context=context, values=values) File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper return old_api(self, *args, **kwargs) File "/home/tertia/workspace/odoo8/openerp/addons/mail/mail_thread.py", line 1883, in message_auto_subscribe header_subtype_ids = subtype_obj.search(cr, uid, ['|', ('res_model', '=', False), ('parent_id.res_model', '=', self._name)], context=context) File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper return old_api(self, *args, **kwargs) File "/home/tertia/workspace/odoo8/openerp/models.py", line 1639, in search return self._search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count) File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper return old_api(self, *args, **kwargs) File "/home/tertia/workspace/odoo8/openerp/models.py", line 4621, in _search query = self._where_calc(cr, user, args, context=context) File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper return old_api(self, *args, **kwargs) File "/home/tertia/workspace/odoo8/openerp/models.py", line 4444, in _where_calc e = expression.expression(cr, user, domain, self, context) File "/home/tertia/workspace/odoo8/openerp/osv/expression.py", line 646, in __init__ self.parse(cr, uid, context=context) File "/home/tertia/workspace/odoo8/openerp/osv/expression.py", line 847, in parse right_ids = comodel.search(cr, uid, [(path[1], operator, right)], context=context) File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper return old_api(self, *args, **kwargs) File "/home/tertia/workspace/odoo8/openerp/models.py", line 1639, in search return self._search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count) File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper return old_api(self, *args, **kwargs) File "/home/tertia/workspace/odoo8/openerp/models.py", line 4615, in _search self.check_access_rights(cr, access_rights_uid or user, 'read') File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper return old_api(self, *args, **kwargs) File "/home/tertia/workspace/odoo8/openerp/models.py", line 3477, in check_access_rights return self.pool.get('ir.model.access').check(cr, uid, self._name, operation, raise_exception) File "/home/tertia/workspace/odoo8/openerp/api.py", line 241, in wrapper return old_api(self, *args, **kwargs) File "<string>", line 2, in check File "/home/tertia/workspace/odoo8/openerp/tools/cache.py", line 117, in lookup r = d[key] File "/home/tertia/workspace/odoo8/openerp/tools/func.py", line 66, in wrapper return func(self, *args, **kwargs) File "/home/tertia/workspace/odoo8/openerp/tools/lru.py", line 38, in __getitem__ self[a[0]] = a[1] File "/home/tertia/workspace/odoo8/openerp/tools/func.py", line 66, in wrapper return func(self, *args, **kwargs) File "/home/tertia/workspace/odoo8/openerp/tools/lru.py", line 44, in __setitem__ del self[obj] 

The same thing happens when I want to call the lager model function. What am I doing wrong?

+6
source share
4 answers

The problem is that by writing self.flaeche = 37 you are changing the record, which means implicit invocation of the write() method of the model. When you call write() from write() , you obviously end the recursion.

Instead, you can do something similar:

 @api.multi def write(self, vals): vals['flaeche'] = 37 return super(lager, self).write(vals) 

Thus, there are no additional entries - you just change the values โ€‹โ€‹for the entry that was supposed to happen anyway.

If you want people to explicitly overwrite the value 37 , you can do this:

 @api.multi def write(self, vals): if 'flaeche' not in vals: vals['flaeche'] = 37 return super(lager, self).write(vals) 
+5
source

In your lager.write method lager.write the self.flaeche=37 statement self.flaeche=37 a call to field.__set__() , which calls record.write() - record , which is the current instance of lager , hence your infinite recursion.

I don't know zilch about odoo, but hopefully there should be a way to set the field without calling write - else, well, failure.

+2
source

This method works for me by calling the ancestor class:

 @api.multi def write(self, vals): vals['flaeche'] = 37 return super(models.Model, self).write(vals) 

The solution is suitable if you are rewriting a new model, rather than an inherited one.

+1
source

If you want to change the value in relation to the value of other entries, use the following code:

  @api.multi def write(self,values): if values.get('age') == 21 and not values.get('salary'): values['salary'] = 21000.00 return super(inheritdemo, self).write(values) 

=> here, if the "age" is changed to 21, then the salary of this record is set equal to 21000.00

0
source

All Articles