Contributors mailing list archives


Re: How to use @api.onchange in models.AbstractModel, when the interiting class field name are different.

Ecosoft Co. Ltd., Kitti Upariphutthiphong
- 07/10/2019 06:51:55
Hello Pedro,

Thank you! It resolved partly, but still having to have this api.onchange on every model though.

Note: I have heard a word from Rafael Odoo that, Odoo are on the way of removing api.onchange, and make api.depends more abstract in the future. May be I have to wait till then...


On Fri, Oct 4, 2019 at 10:31 AM Pedro M. Baeza (Tecnativa) <> wrote:
Hi, Kitti, what you can do is:

class BaseModel(models.AbstractModel):
    _name = 'base.model'
    def _onchange_field_base(self, field_name):
        ... # do whatever with field_name

class SpecificModel(models.Model):
    _inherit = 'base.model'
    _name = 'specific.model'

    def _onchange_specific_field(self):
        return self._onchange_field_base('specific_field')


El vie., 27 sept. 2019 a las 13:31, Kitti Upariphutthiphong (<>) escribió:
Dear all,

I have one technical challenge while doing this PR ->

In the origin module, there was abstract class,

class AnalyticDimensionLine(models.AbstractModel):
    _name = 'analytic.dimension.line'

Which are inherited by other model, i.e., account.move.line, account.invoice.line, etc.

class AccountInvoiceLine(models.Model):
    _name = 'account.invoice.line'
    _inherit = ['analytic.dimension.line', 'account.invoice.line']
    _analytic_tag_field_name = 'analytic_tag_ids'

Now, I wanted to add api.onchange method on a field which can be varied by each inheriting model via _analytic_tag_field_name

Question is, I would want to do the onchange on the base abstract class, analytic.dimension.line like this, but it doesn't work.

class AnalyticDimensionLine(models.AbstractModel):
    _inherit = 'analytic.dimension.line'

    @api.onchange(lambda self: self._analytic_tag_field_name)      ---------------------> THIS NOT WORK
    def _onchange_analytic_tag_ids(self):

And so, I end up having to add @api.onchange in inheriting models. Which I think not very good.

class AccountInvoiceLine(models.Model):
    _inherit = 'account.invoice.line'

    @api.onchange('analytic_tag_ids')  ----------------------> NOT GOOD
    def _onchange_analytic_tag_ids(self):

Any thought are appreciated,
Than you,

Post to:

Post to: