~openerp-dev/openobject-client-web/6.0-opw-598313-msh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import openobject.pooler
import openobject.meta


class WidgetType(type):
    def __new__(typ, name, bases, attrs):
        _frozenset_from_bases(attrs, bases, 'params')
        _frozenset_from_bases(attrs, bases, 'member_widgets')

        return super(WidgetType, typ).__new__(typ, name, bases, attrs)

    def make_widget_key(cls, widget):
        return widget.__module__ + '.' + widget.__name__

    def __init__(cls, name, bases, dct):
        super(WidgetType, cls).__init__(name, bases, dct)
        if openobject.meta.Extends not in bases:
            cls.widget_key = cls.make_widget_key(cls)
            openobject.pooler.register_object(
                    cls, key=cls.widget_key, group='widgets')
            return
        assert len(bases) == 2, "It is only possible to Extend one object at a time, and one object has to be Extended"
        bases = list(bases)
        bases.remove(openobject.meta.Extends)
        base_widget = bases[0]
        openobject.pooler.register_object(
                cls, key=cls.make_widget_key(base_widget), group='widgets')

def _frozenset_from_bases(attrs, bases, name):
    items = set(attrs.pop(name, []))
    for b in bases:
        if hasattr(b, name):
            items.update(getattr(b, name))
    fs = attrs[name] = frozenset(items)
    return fs