2015-09-21 7 views
6

Questo sembra essere un problema semplice e significativo, ma in qualche modo non riesco a trovare una soluzione.override del metodo write() in odoo 8 risultati in RuntimeError: profondità massima di ricorsione superata

Mentre premo il pulsante di salvataggio verrà eseguito il metodo di scrittura. Voglio cambiare un valore (o di chiamare una funzione) del modello corrente ogni volta che il metodo di scrittura viene chiamato, così ho ignorato il metodo write() del mio modello come

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

(il modello è lager.py e il campo è flaeche = fields.Float(string=u"Fläche (m²)"))

l'errore: 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] 

lo stesso accade quando voglio chiamare una funzione del modello lager. Cosa sto sbagliando?

risposta

4

Il problema è che scrivendo self.flaeche = 37 si sta modificando il record, il che significa implicitamente chiamando il metodo write() sul modello. Quando chiami write() da write(), finisci ovviamente con la ricorsione.

Si può fare qualcosa di simile a questo, invece:

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

In questo modo non ci sono ulteriori scrive - basta cambiare i valori di una scrittura che stava per accadere in ogni caso.

Se si vuole permettere alle persone di sovrascrivere esplicitamente il valore di 37 si può fare questo:

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

Grazie! questo è! –

2

nel metodo lager.write, la dichiarazione self.flaeche=37 innesca una chiamata a field.__set__() che chiama record.write()-record essere qui la corrente lager esempio, da qui il vostro ricorsione infinita.

Non so zilch su odoo, ma si spera che ci sia un modo per impostare un campo senza attivare una chiamata a write - altrimenti, bene, sfortuna.

1

In questo modo funziona per me, chiamando la classe antenata:

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

La soluzione è appropiato quando si sovrascrive un nuovo modello, non ereditato.

+0

Non vedo come sarebbe necessario. Ogni modello eredita da 'models.Model', quindi non esiste una cosa come un" modello non ereditato ". –

Problemi correlati