diff --git a/bin/osv/osv.py b/bin/osv/osv.py index 7d85ae363a9..5b2e4ee8da8 100644 --- a/bin/osv/osv.py +++ b/bin/osv/osv.py @@ -171,9 +171,12 @@ class osv_pool(netsvc.Service): res.append(klass.createInstance(self, module, cr)) return res +class osv_base(object): + def __init__(self, pool, cr): + pool.add(self._name, self) + self.pool = pool + super(osv_base, self).__init__(cr) -class osv_memory(orm.orm_memory): - #__metaclass__ = inheritor def __new__(cls): module = str(cls)[6:] module = module[:len(module)-1] @@ -186,92 +189,70 @@ class osv_memory(orm.orm_memory): module_list.append(cls._module) return None +class osv_memory(osv_base, orm.orm_memory): # # Goal: try to apply inheritancy at the instanciation level and # put objects in the pool var # def createInstance(cls, pool, module, cr): name = hasattr(cls, '_name') and cls._name or cls._inherit - parent_name = hasattr(cls, '_inherit') and cls._inherit - if parent_name: - parent_class = pool.get(parent_name).__class__ - assert pool.get(parent_name), "parent class %s does not exist in module %s !" % (parent_name, module) - nattr = {} - for s in ('_columns', '_defaults'): - new = copy.copy(getattr(pool.get(parent_name), s)) - if hasattr(new, 'update'): - new.update(cls.__dict__.get(s, {})) - else: - new.extend(cls.__dict__.get(s, [])) - nattr[s] = new - name = hasattr(cls, '_name') and cls._name or cls._inherit - cls = type(name, (cls, parent_class), nattr) + parent_names = hasattr(cls, '_inherit') and cls._inherit + if parent_names: + for parent_name in ((type(parent_names)==list) and parent_names or [parent_names]): + parent_class = pool.get(parent_name).__class__ + assert pool.get(parent_name), "parent class %s does not exist in module %s !" % (parent_name, module) + nattr = {} + for s in ('_columns', '_defaults'): + new = copy.copy(getattr(pool.get(parent_name), s)) + if hasattr(new, 'update'): + new.update(cls.__dict__.get(s, {})) + else: + new.extend(cls.__dict__.get(s, [])) + nattr[s] = new + name = hasattr(cls, '_name') and cls._name or cls._inherit + cls = type(name, (cls, parent_class), nattr) obj = object.__new__(cls) obj.__init__(pool, cr) return obj createInstance = classmethod(createInstance) - def __init__(self, pool, cr): - pool.add(self._name, self) - self.pool = pool - orm.orm_memory.__init__(self, cr) - - - -class osv(orm.orm): - #__metaclass__ = inheritor - def __new__(cls): - module = str(cls)[6:] - module = module[:len(module)-1] - module = module.split('.')[0][2:] - if not hasattr(cls, '_module'): - cls._module = module - module_class_list.setdefault(cls._module, []).append(cls) - class_pool[cls._name] = cls - if module not in module_list: - module_list.append(cls._module) - return None - +class osv(osv_base, orm.orm): # # Goal: try to apply inheritancy at the instanciation level and # put objects in the pool var # def createInstance(cls, pool, module, cr): - parent_name = hasattr(cls, '_inherit') and cls._inherit - if parent_name: - parent_class = pool.get(parent_name).__class__ - assert pool.get(parent_name), "parent class %s does not exist in module %s !" % (parent_name, module) - nattr = {} - for s in ('_columns', '_defaults', '_inherits', '_constraints', '_sql_constraints'): - new = copy.copy(getattr(pool.get(parent_name), s)) - if hasattr(new, 'update'): - new.update(cls.__dict__.get(s, {})) - else: - if s=='_constraints': - for c in cls.__dict__.get(s, []): - exist = False - for c2 in range(len(new)): - if new[c2][2]==c[2]: - new[c2] = c - exist = True - break - if not exist: - new.append(c) + parent_names = hasattr(cls, '_inherit') and cls._inherit + if parent_names: + for parent_name in ((type(parent_names)==list) and parent_names or [parent_names]): + parent_class = pool.get(parent_name).__class__ + assert pool.get(parent_name), "parent class %s does not exist in module %s !" % (parent_name, module) + nattr = {} + for s in ('_columns', '_defaults', '_inherits', '_constraints', '_sql_constraints'): + new = copy.copy(getattr(pool.get(parent_name), s)) + if hasattr(new, 'update'): + new.update(cls.__dict__.get(s, {})) else: - new.extend(cls.__dict__.get(s, [])) - nattr[s] = new - name = hasattr(cls, '_name') and cls._name or cls._inherit - cls = type(name, (cls, parent_class), nattr) + if s=='_constraints': + for c in cls.__dict__.get(s, []): + exist = False + for c2 in range(len(new)): + if new[c2][2]==c[2]: + new[c2] = c + exist = True + break + if not exist: + new.append(c) + else: + new.extend(cls.__dict__.get(s, [])) + nattr[s] = new + name = hasattr(cls, '_name') and cls._name or cls._inherit + cls = type(name, (cls, parent_class), nattr) obj = object.__new__(cls) obj.__init__(pool, cr) return obj createInstance = classmethod(createInstance) - def __init__(self, pool, cr): - pool.add(self._name, self) - self.pool = pool - orm.orm.__init__(self, cr) - # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: