diff --git a/bin/osv/orm.py b/bin/osv/orm.py index f84aff175ea..2e57e5bec31 100644 --- a/bin/osv/orm.py +++ b/bin/osv/orm.py @@ -2695,8 +2695,19 @@ class orm(orm_template): self._inherits_reload_src() def __getattr__(self, name): + """ + Proxies attribute accesses to the `inherits` parent so we can call methods defined on the inherited parent + (though inherits doesn't use Python inheritance). + Handles translating between local ids and remote ids. + Known issue: doesn't work correctly when using python's own super(), don't involve inherit-based inheritance + when you have inherits. + """ for model, field in self._inherits.iteritems(): - if hasattr(self.pool.get(model), name): + proxy = self.pool.get(model) + if hasattr(proxy, name): + attribute = getattr(proxy, name) + if not hasattr(attribute, '__call__'): + return attribute break else: return super(orm, self).__getattr__(name) @@ -2704,7 +2715,6 @@ class orm(orm_template): def _proxy(cr, uid, ids, *args, **kwargs): objects = self.browse(cr, uid, ids, kwargs.get('context', None)) lst = [obj[field].id for obj in objects if obj[field]] - proxy = self.pool.get(model) return getattr(proxy, name)(cr, uid, lst, *args, **kwargs) return _proxy