Contributors mailing list archives

contributors@odoo-community.org

Browse archives

Avatar

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

by
Ecosoft Co. Ltd., Kitti Upariphutthiphong
- 09/10/2019 10:43:14
Hello Simone,

Thank you for answer. I did try that with,

@api.onchange(lambda self: self._get_onchange_analytic_tag_spec)
also
@api.onchange(lambda self: (self._analytic_tag_field_name, ))

But it do not triggered.

Just FYI. from the existing Odoo source code, I only see some @api.depends that call other function.

Kitti


On Mon, Oct 7, 2019 at 2:42 PM Simone Orsi <simahawk@gmail.com> wrote:
Hi Kitti,

AFAIS your solution with the lambda probably does not work because you are returning the field name instead of a tuple/list of fields.

If you want to do it that way I suggest you use a specific method in the base model, eg:

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

 def _get_onchange_analytic_tag_spec(self):
    return (self._analytic_tag_field_name, )

@api.onchange(self._get_onchange_analytic_tag_spec)
    def _onchange_analytic_tag_ids(self):
    [...]

Hope this helps. Bests,
S.


On Fri, Sep 27, 2019 at 1:31 PM Kitti Upariphutthiphong <kittiu@ecosoft.co.th> wrote:
Dear all,

I have one technical challenge while doing this PR -> https://github.com/OCA/account-analytic/pull/251

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,



_______________________________________________
Mailing-List: https://odoo-community.org/groups/contributors-15
Post to: mailto:contributors@odoo-community.org
Unsubscribe: https://odoo-community.org/groups?unsubscribe

_______________________________________________
Mailing-List: https://odoo-community.org/groups/contributors-15
Post to: mailto:contributors@odoo-community.org
Unsubscribe: https://odoo-community.org/groups?unsubscribe

Reference