Python - Odoo: model inheritance via super and overridden method

50 Views Asked by At

As usual in Odoo, i wanted to override a method (get_login_domain) of the res.users model (defined in the addons/base), that is already overridden in another inherited model (defined in the addons/website):

[1] Original method defined in addons/base/models/res_users.py:


class ResUsers(models.Model):
    _name = 'res.users'

    @api.model
    def _get_email_domain(self, email):
        return [('email', '=', email)]

    @classmethod
    def _login(cls, db, login, password, user_agent_env):
        if not password:
            raise AccessDenied()
        ip = request.httprequest.environ['REMOTE_ADDR'] if request else 'n/a'
        try:
            with cls.pool.cursor() as cr:
                self = api.Environment(cr, SUPERUSER_ID, {})[cls._name]
                with self._assert_can_auth(user=login):
                    user = self.search(self._get_login_domain(login), order=self._get_login_order(), limit=1)
...

[2] An inherited model with a overridden method in official addons addons/website/models/res_users.py


class ResUsers(models.Model):
    _inherit = 'res.users'

    @api.model
    def _get_login_domain(self, login):
        website = self.env['website'].get_current_website()
        return super(ResUsers, self)._get_login_domain(login) + website.website_domain()

[3] And now my overridden method in the inherited model of my custom module: /user/mycustom_module/models/res_users.py


class ResUsers(models.Model):
    _inherit = 'res.users'

    @api.model
    def _get_login_domain(self, login):
        website = self.env['website'].get_current_website()
        is_shared_user_account = self.env['ir.config_parameter'].sudo().get_param('shared_user_account', True)
    
        if not is_shared_user_account:
            return [('login', '=', login)] + website.website_domain()
        else:
            return [('login', '=', login)]
            #return super(ResUsers, self)._get_login_domain(login)

DEBUGGER FLOW (Step into) with breakpoint on

[1] user=self.search(self._get_login_domain(login), order=self._get_login_order(), limit=1)

--> [1] get_login_domain

--> [2] get_login_domain

--> [3] get_login_domain

[3]return --> [2] get_login_domain

[2]return --> back to initial breakpoint

I am wondering why i can not override this method in [3], the way i do it usually in odoo, because while debugging, it goes through my custom method but its return redirect to the method of the first inherited [2]model (from website/models/res_users.py), where it gets overridden, so that the end result is always of that kind: [('login', '=', xxxlogin),('website_id','in',(False, xxxwebsiteid))]

0

There are 0 best solutions below