This question has been flagged
2 Replies
2695 Views

Hi,

I want to compute age from two models :  age = name - date_debut

code py :

Model 1 : 

class ProductionMortalite(models.Model):
  _name = 'production.mortalite'
  _description ="Mortalité"
  _inherit = ['mail.thread']

  name = fields.Date(string='Date', default=fields.Date.context_today, track_visibility='always')
  age = fields.Integer(string='Age (Jours)', readonly=True, compute='onchange_age',  track_visibility='onchange')
  nombre = fields.Integer(string='Nombre de mortalité', required=True, track_visibility='onchange')
  cycle_id = fields.Many2one('production.cycle', string='Cycle', ondelete='cascade', readonly=True, track_visibility='onchange')

  _sql_constraints = [
('name_uniq', 'unique (name, age, cycle_id)', "La date de la mortalité existe déjà !"),
]

  @ api.onchange ( 'name' )
  def onchange_age ( self ):
    if self.name:
      a = self.env['production.cycle'].search([])
      self.age = self.name - a.date_debut


Model 2 :

class ProductionCycle(models.Model):
  _name = 'production.cycle'
  _description ="Les cycle de production"
  _inherit = ['mail.thread']

  name = fields.Char(string='Nom du cycle de production', required=True, track_visibility='always')
  description = fields.Text(string='Description', track_visibility='onchange')
  date_debut = fields.Date(string='Date de début', required=True, default=fields.Date.context_today, track_visibility='onchange')
  date_fin = fields.Date(string='Date de fin', readonly=True, track_visibility='onchange')
  statut = fields.Selection([('brouillon', 'Brouillon'), ('encours', 'En Cours'), ('termine', 'Terminé')], string='Statut', required=True, default='brouillon', track_visibility='onchange')
  effectif_depart = fields.Integer(string='Effectif de départ', required=True, track_visibility='onchange')
  mortalite_declaree = fields.Integer(string='Mortalité déclarée', readonly=True, track_visibility='onchange')
  effectif_restant = fields.Integer(string='Effectif restant', readonly=True, compute='onchange_effectif_restant', track_visibility='onchange')
  batiment_id = fields.Many2one('technique.batiment', string='Bâtiment', ondelete='cascade', required=True, track_visibility='onchange')
  souche_id = fields.Many2one('animale.souche', string='Souche', ondelete='cascade', required=True, track_visibility='onchange')
 
  _sql_constraints = [
('name_uniq', 'unique (name, batiment_id)', "Le nom du cycle existe déjà !"),
]


Erreur:

Odoo Server Error


Traceback (most recent call last):

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\api.py", line 1039, in get

    value = self._data[key][field][record.id]

KeyError: 1


During handling of the above exception, another exception occurred:


Traceback (most recent call last):

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\fields.py", line 963, in __get__

    value = record.env.cache.get(record, self)

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\api.py", line 1041, in get

    raise CacheMiss(record, field)

odoo.exceptions.CacheMiss: ('production.mortalite(1,).age', None)


During handling of the above exception, another exception occurred:


Traceback (most recent call last):

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 654, in _handle_exception

    return super(JsonRequest, self)._handle_exception(exception)

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 312, in _handle_exception

    raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\pycompat.py", line 87, in reraise

    raise value

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 696, in dispatch

    result = self._call_function(**self.params)

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 344, in _call_function

    return checked_call(self.db, *args, **kwargs)

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\service\model.py", line 97, in wrapper

    return f(dbname, *args, **kwargs)

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 337, in checked_call

    result = self.endpoint(*a, **kw)

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 939, in __call__

    return self.method(*args, **kw)

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 517, in response_wrap

    response = f(*args, **kw)

  File "c:\program files (x86)\odoo 12.0\server\odoo\addons\web\controllers\main.py", line 904, in search_read

    return self.do_search_read(model, fields, offset, limit, domain, sort)

  File "c:\program files (x86)\odoo 12.0\server\odoo\addons\web\controllers\main.py", line 926, in do_search_read

    offset=offset or 0, limit=limit or False, order=sort or False)

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 4542, in search_read

    result = records.read(fields)

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 2780, in read

    data[record][name] = convert(record[name], record, use_name_get)

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 5065, in __getitem__

    return self._fields[key].__get__(self, type(self))

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\fields.py", line 967, in __get__

    self.determine_value(record)

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\fields.py", line 1078, in determine_value

    self.compute_value(recs)

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\fields.py", line 1034, in compute_value

    self._compute_value(records)

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\fields.py", line 1025, in _compute_value

    getattr(records, self.compute)()

  File "c:\program files (x86)\odoo 12.0\server\odoo\addons\production\models\mortalite.py", line 31, in onchange_age

    if self.name:

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\fields.py", line 961, in __get__

    record.ensure_one()

  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 4669, in ensure_one

    raise ValueError("Expected singleton: %s" % self)

ValueError: Expected singleton: production.mortalite(1, 6, 9, 10, 11, 12, 13)

Avatar
Discard
Best Answer

Hi Ramla,

Your onchange is going off for multiple records at once in your database. As your code does not loop over the records but just uses 'self' it will crash since you have more than one record in 'self'. You can fix it by looping over the records first:

@api.onchange('name')
def onchange_age(self):
    for record in self:
        if record.name:
            # You most likely also want a limit=1 on this search or 'a' might contain a recordset instead of a record too
            a = self.env['product.cycle'].search([])
            record.age = record.name - a.date_debut

Regards,

Yenthe

Avatar
Discard
Author

Erreur:

Odoo Server Error

Traceback (most recent call last):

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 757, in parse

self._tags[rec.tag](rec, de, mode=mode)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 662, in _tag_record

record = model.with_context(rec_context)._load_records([data], self.mode == 'update')

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3794, in _load_records

data['record']._load_records_write(data['values'])

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3732, in _load_records_write

self.write(values)

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_actions.py", line 66, in write

res = super(IrActions, self).write(vals)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3269, in write

self._write(store_vals)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3413, in _write

self._validate_fields(vals)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 1108, in _validate_fields

check(self)

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_actions.py", line 141, in _check_model

raise ValidationError(_('Invalid model name %r in action definition.') % action.res_model)

odoo.exceptions.ValidationError: ("Nom de modèle 'production.mortalite' non valide dans la définition de l'action.", None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 654, in _handle_exception

return super(JsonRequest, self)._handle_exception(exception)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 312, in _handle_exception

raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\pycompat.py", line 87, in reraise

raise value

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 696, in dispatch

result = self._call_function(**self.params)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 344, in _call_function

return checked_call(self.db, *args, **kwargs)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\service\model.py", line 97, in wrapper

return f(dbname, *args, **kwargs)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 337, in checked_call

result = self.endpoint(*a, **kw)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 939, in __call__

return self.method(*args, **kw)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 517, in response_wrap

response = f(*args, **kw)

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\web\controllers\main.py", line 966, in call_button

action = self._call_kw(model, method, args, {})

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\web\controllers\main.py", line 954, in _call_kw

return call_kw(request.env[model], method, args, kwargs)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\api.py", line 749, in call_kw

return _call_kw_multi(method, model, args, kwargs)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\api.py", line 736, in _call_kw_multi

result = method(recs, *args, **kwargs)

File "<decorator-gen-67>", line 2, in button_immediate_upgrade

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_module.py", line 73, in check_and_log

return method(self, *args, **kwargs)

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_module.py", line 614, in button_immediate_upgrade

return self._button_immediate_function(type(self).button_upgrade)

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_module.py", line 553, in _button_immediate_function

modules.registry.Registry.new(self._cr.dbname, update_module=True)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\registry.py", line 86, in new

odoo.modules.load_modules(registry._db, force_demo, status, update_module)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\loading.py", line 417, in load_modules

force, status, report, loaded_modules, update_module, models_to_check)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\loading.py", line 313, in load_marked_modules

perform_checks=perform_checks, models_to_check=models_to_check

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\loading.py", line 222, in load_module_graph

load_data(cr, idref, mode, kind='data', package=package, report=report)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\loading.py", line 68, in load_data

tools.convert_file(cr, package.name, filename, idref, mode, noupdate, kind, report)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 801, in convert_file

convert_xml_import(cr, module, fp, idref, mode, noupdate, report)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 864, in convert_xml_import

obj.parse(doc.getroot(), mode=mode)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 754, in parse

self.parse(rec, mode)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 763, in parse

exc_info[2]

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\pycompat.py", line 86, in reraise

raise value.with_traceback(tb)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 757, in parse

self._tags[rec.tag](rec, de, mode=mode)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 662, in _tag_record

record = model.with_context(rec_context)._load_records([data], self.mode == 'update')

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3794, in _load_records

data['record']._load_records_write(data['values'])

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3732, in _load_records_write

self.write(values)

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_actions.py", line 66, in write

res = super(IrActions, self).write(vals)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3269, in write

self._write(store_vals)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3413, in _write

self._validate_fields(vals)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 1108, in _validate_fields

check(self)

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_actions.py", line 141, in _check_model

raise ValidationError(_('Invalid model name %r in action definition.') % action.res_model)

odoo.tools.convert.ParseError: "Nom de modèle 'production.mortalite' non valide dans la définition de l'action.

None" while parsing file:/c:/program files (x86)/odoo 12.0/server/odoo/addons/production/views/cycle_views.xml:180, near

<record model="ir.actions.act_window" id="act_mortalite_open_quants">

<field name="name">Mortalité</field>

<field name="context">{'default_cycle_id': active_id}</field>

<field name="domain">[('cycle_id', '=', active_id)]</field>

<field name="res_model">production.mortalite</field>

</record>

Best Answer

Did you try to use @api.one like this? I think it will work

@api.one
@api.onchange ( 'name' )
  def onchange_age ( self ):
    if self.name:
      a = self.env['production.cycle'].search([])
      self.age = self.name - a.date_debut
Avatar
Discard
Author

Erreur:

Odoo Server Error

Traceback (most recent call last):

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 757, in parse

self._tags[rec.tag](rec, de, mode=mode)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 662, in _tag_record

record = model.with_context(rec_context)._load_records([data], self.mode == 'update')

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3794, in _load_records

data['record']._load_records_write(data['values'])

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3732, in _load_records_write

self.write(values)

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_actions.py", line 66, in write

res = super(IrActions, self).write(vals)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3269, in write

self._write(store_vals)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3413, in _write

self._validate_fields(vals)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 1108, in _validate_fields

check(self)

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_actions.py", line 141, in _check_model

raise ValidationError(_('Invalid model name %r in action definition.') % action.res_model)

odoo.exceptions.ValidationError: ("Nom de modèle 'production.mortalite' non valide dans la définition de l'action.", None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 654, in _handle_exception

return super(JsonRequest, self)._handle_exception(exception)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 312, in _handle_exception

raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\pycompat.py", line 87, in reraise

raise value

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 696, in dispatch

result = self._call_function(**self.params)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 344, in _call_function

return checked_call(self.db, *args, **kwargs)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\service\model.py", line 97, in wrapper

return f(dbname, *args, **kwargs)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 337, in checked_call

result = self.endpoint(*a, **kw)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 939, in __call__

return self.method(*args, **kw)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 517, in response_wrap

response = f(*args, **kw)

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\web\controllers\main.py", line 966, in call_button

action = self._call_kw(model, method, args, {})

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\web\controllers\main.py", line 954, in _call_kw

return call_kw(request.env[model], method, args, kwargs)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\api.py", line 749, in call_kw

return _call_kw_multi(method, model, args, kwargs)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\api.py", line 736, in _call_kw_multi

result = method(recs, *args, **kwargs)

File "<decorator-gen-67>", line 2, in button_immediate_upgrade

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_module.py", line 73, in check_and_log

return method(self, *args, **kwargs)

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_module.py", line 614, in button_immediate_upgrade

return self._button_immediate_function(type(self).button_upgrade)

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_module.py", line 553, in _button_immediate_function

modules.registry.Registry.new(self._cr.dbname, update_module=True)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\registry.py", line 86, in new

odoo.modules.load_modules(registry._db, force_demo, status, update_module)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\loading.py", line 417, in load_modules

force, status, report, loaded_modules, update_module, models_to_check)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\loading.py", line 313, in load_marked_modules

perform_checks=perform_checks, models_to_check=models_to_check

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\loading.py", line 222, in load_module_graph

load_data(cr, idref, mode, kind='data', package=package, report=report)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\loading.py", line 68, in load_data

tools.convert_file(cr, package.name, filename, idref, mode, noupdate, kind, report)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 801, in convert_file

convert_xml_import(cr, module, fp, idref, mode, noupdate, report)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 864, in convert_xml_import

obj.parse(doc.getroot(), mode=mode)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 754, in parse

self.parse(rec, mode)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 763, in parse

exc_info[2]

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\pycompat.py", line 86, in reraise

raise value.with_traceback(tb)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 757, in parse

self._tags[rec.tag](rec, de, mode=mode)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\convert.py", line 662, in _tag_record

record = model.with_context(rec_context)._load_records([data], self.mode == 'update')

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3794, in _load_records

data['record']._load_records_write(data['values'])

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3732, in _load_records_write

self.write(values)

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_actions.py", line 66, in write

res = super(IrActions, self).write(vals)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3269, in write

self._write(store_vals)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 3413, in _write

self._validate_fields(vals)

File "C:\Program Files (x86)\Odoo 12.0\server\odoo\models.py", line 1108, in _validate_fields

check(self)

File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_actions.py", line 141, in _check_model

raise ValidationError(_('Invalid model name %r in action definition.') % action.res_model)

odoo.tools.convert.ParseError: "Nom de modèle 'production.mortalite' non valide dans la définition de l'action.

None" while parsing file:/c:/program files (x86)/odoo 12.0/server/odoo/addons/production/views/cycle_views.xml:180, near

<record model="ir.actions.act_window" id="act_mortalite_open_quants">

<field name="name">Mortalité</field>

<field name="context">{'default_cycle_id': active_id}</field>

<field name="domain">[('cycle_id', '=', active_id)]</field>

<field name="res_model">production.mortalite</field>

</record>