2017-07-10 1 views
2

Je tente de remplacer classe message méthode def _get_default_author (auto) par cet exemple: by this exampleOdoo comment fonctionnent par défaut Ecraser nouvelle API

Le modèle original:

class Message(models.Model): 
    _name = 'mail.message' 
    _inherit = ['ir.needaction_mixin'] 

    @api.model 
    def _get_default_author(self): 
     return self.env.user.partner_id 

    author_id = fields.Many2one(
      'res.partner', 'Author', select=1, 
      ondelete='set null', default=_get_default_author, 
      help="Author of the message. If not set, email_from may hold an email address that did not match any partner.") 

Le hérité modèle:

class MyClass(models.Model): 
    _name = 'my.class' 
    _inherit = ['mail.thread', 'ir.needaction_mixin'] 

    @api.model 
    def _get_default_author(self): 
     new = self.env['res.users'].search([('id', '=', '1')]) 
     return new.partner_id 

    author_id = fields.Many2one(default=_get_default_author) 

B J'ai eu une erreur:

File "/opt/odoo/openerp/models.py", line 4113, in create 
    vals = self._add_missing_default_values(vals) 
    File "/opt/odoo/openerp/api.py", line 236, in wrapper 
    return new_api(self, *args, **kwargs) 
    File "/opt/odoo/openerp/api.py", line 478, in new_api 
    result = method(self._model, cr, uid, *args, **old_kwargs) 
    File "/opt/odoo/openerp/models.py", line 1776, in _add_missing_default_values 
    defaults = self.default_get(cr, uid, list(missing_defaults), context) 
    File "/opt/odoo/openerp/api.py", line 238, in wrapper 
    return old_api(self, *args, **kwargs) 
    File "/opt/odoo/openerp/api.py", line 342, in old_api 
    result = method(recs, *args, **kwargs) 
    File "/opt/odoo/openerp/models.py", line 1336, in default_get 
    defaults = self._convert_to_cache(defaults, validate=False) 
    File "/opt/odoo/openerp/models.py", line 5454, in _convert_to_cache 
    for name, value in values.iteritems() 
    File "/opt/odoo/openerp/models.py", line 5455, in <dictcomp> 
    if name in fields 
    File "/opt/odoo/openerp/fields.py", line 1655, in convert_to_cache 
    raise ValueError("Wrong value for %s: %r" % (self, value)) 
ValueError: Wrong value for my.class.author_id: res.partner(3,) 

Qu'est-ce que je fais mal? Peut-être qu'il existe une autre façon d'écraser la fonction par défaut? Mise à jour: Mise à jour: Juste pour les tests j'ai fait les mêmes changements pour la classe de base Message (models.Model). Et tout allait bien. Donc, si je comprends bien le problème est avec mon code. Peut-être que je l'écrase mal ..

Répondre

3

Vous ne remplissez pas ou ne s'étendez pas mail.message mais en créant votre propre modèle my.class. Pour l'extension ou un modèle remplaçant Odoo il vous suffit d'utiliser _inherit attribut class:

class MyClass(models.Model): 
    _inherit = 'mail.message' 
    _name = 'mail.message' # optional! 

    @api.model 
    def _get_default_author(self): 
     new = self.env['res.users'].search([('id', '=', '1')]) 
     return new.partner_id 

    author_id = fields.Many2one(default=_get_default_author) 

maintenant à votre erreur. Vous créez votre propre modèle avec un champ author_id. Ce champ est un champ relationnel many2one, qui a toujours besoin d'un comodel pour obtenir une relation. En pensant "je remplacerai la fonction par défaut d'un autre modèle", vous n'avez bien sûr pas rempli le paramètre comodel_name, car en cas de dépassement, ce n'est pas nécessaire.

Mais vous ne surchargez pas. Donc, Odoo se remplit comodel_name avec object(). Votre méthode par défaut renvoie un enregistrement res.partner, mais Odoo attend un enregistrement object. Donc, l'erreur n'est qu'une conséquence de la mauvaise tentative d'héritage/de dépassement d'un modèle Odoo existant.