Esempio n. 1
0
def replicate_relation(source, target, attr, target_attr, cache=None):
    if attr.property.cascade.delete_orphan:
        process_scalar = replicate_no_merge
        process_list = replicate_filter
    else:
        process_scalar = reflect
        process_list = reflect_filter
    value = getattr(source, attr.key)
    target_attr_model = target_attr.property.mapper.class_
    if attr.property.uselist:
        adapter = collection_adapter(value)
        if adapter:
            # XXX The magic passes below are adapted from logic in
            # CollectionAttributeImpl.set() method without proper
            # understanding.  The `elif` branch isn't even coverered by tests.
            if hasattr(value, '_sa_iterator'):
                value = value._sa_iterator()
            elif duck_type_collection(value) is dict:
                value = value.values()
        reflection = process_list(value, target_attr_model, cache=cache)
        impl = instance_state(target).get_impl(attr.key)
        impl.set(
            instance_state(target),
            instance_dict(target),
            reflection,
            # XXX We either have to convert reflection back to original
            # collection type or use this private parameter.
            _adapt=False)
    else:
        reflection = process_scalar(value, target_attr_model, cache=cache)
        setattr(target, attr.key, reflection)
        if (reflection is None and attr.property.direction is MANYTOONE
                and any(col.primary_key and not col.nullable
                        for col in attr.property.local_columns)):
            raise _PrimaryKeyIsNull()
Esempio n. 2
0
def replicate_relation(source, target, attr, target_attr, cache=None):
    if attr.property.cascade.delete_orphan:
        process_scalar = replicate_no_merge
        process_list = replicate_filter
    else:
        process_scalar = reflect
        process_list = reflect_filter
    value = getattr(source, attr.key)
    target_attr_model = target_attr.property.mapper.class_
    if attr.property.uselist:
        adapter = collection_adapter(value)
        if adapter:
            # XXX The magic passes below are adapted from logic in
            # CollectionAttributeImpl.set() method without proper
            # understanding.  The `elif` branch isn't even coverered by tests.
            if hasattr(value, '_sa_iterator'):
                value = value._sa_iterator()
            elif duck_type_collection(value) is dict:
                value = value.values()
        reflection = process_list(value, target_attr_model, cache=cache)
        impl = instance_state(target).get_impl(attr.key)
        impl.set(instance_state(target), instance_dict(target), reflection,
                 # XXX We either have to convert reflection back to original
                 # collection type or use this private parameter.
                 _adapt=False)
    else:
        reflection = process_scalar(value, target_attr_model, cache=cache)
        setattr(target, attr.key, reflection)
        if (reflection is None and
                attr.property.direction is MANYTOONE and
                any(col.primary_key and not col.nullable
                    for col in attr.property.local_columns)):
            raise _PrimaryKeyIsNull()
Esempio n. 3
0
def replicate_relation(source, target, attr, target_attr, cache=None):
    if attr.property.cascade.delete_orphan:
        process_scalar = replicate_no_merge
        process_list = replicate_filter
    else:
        process_scalar = reflect
        process_list = reflect_filter
    value = getattr(source, attr.key)
    target_attr_model = target_attr.property.mapper.class_
    if attr.property.uselist:
        adapter = collection_adapter(value)
        if adapter:
            # Convert any collection to flat iterable
            value = adapter.adapt_like_to_iterable(value)
        reflection = process_list(value, target_attr_model, cache=cache)
        impl = instance_state(target).get_impl(attr.key)
        # Set any collection value from flat list
        impl._set_iterable(instance_state(target),
                           instance_dict(target),
                           reflection)
    else:
        reflection = process_scalar(value, target_attr_model, cache=cache)
        setattr(target, attr.key, reflection)
        if (reflection is None and
                attr.property.direction is MANYTOONE and
                any(col.primary_key and not col.nullable
                    for col in attr.property.local_columns)):
            raise _PrimaryKeyIsNull()
Esempio n. 4
0
    def remove(self, entity):

        super(OrderingListDict, self).remove(entity)

        adapter = sa_collections.collection_adapter(self)
        if adapter and adapter._referenced_by_owner:
            self.reorder()
        self._remove_mapping(entity)
Esempio n. 5
0
    def _link(self, adapter):
        assert adapter == collection_adapter(self)

        if adapter is not None:
            # init_collection
            self.on_init()
        else:
            # dispose_collection
            self.on_dispose()
Esempio n. 6
0
    def _link(self, adapter):
        assert adapter == collection_adapter(self)

        if adapter is not None:
            # init_collection
            self.on_init()
        else:
            # dispose_collection
            self.on_dispose()
 def __setitem__(self, key, value, appender=None):
     appender = appender or collection_adapter(self).fire_append_event
     if isinstance(value, ProxyList):
         dict.__setitem__(self, key, value)
     elif isinstance(value, list):
         value_ = value.copy()
         for idx, item in enumerate(value_):
             value_[idx] = appender(item)
         dict.__setitem__(self, key, self.factory(key, value_))
     else:
         value_ = [appender(value)]
         dict.__setitem__(self, key, self.factory(key, value_))
Esempio n. 8
0
    def on_init(self):
        assert not self.linked
        self.linked = True

        adapter = collection_adapter(self)

        self.parent_obj = adapter.owner_state.obj()
        parent_cls = type(self.parent_obj)
        parent_rel_name = adapter.attr.key
        parent_rel_prop = \
            class_mapper(parent_cls).get_property(parent_rel_name)
        self.child_cls = parent_rel_prop.mapper.class_
        self.child_rel_name = parent_rel_prop.back_populates
        self.child_rel_prop = \
            class_mapper(self.child_cls).get_property(self.child_key_name)

        event.listen(self.child_rel_prop, 'set', self.on_key_update)
 def __setitem__(self, key, value, appender=None):
     c_inst = collection_adapter(self)
     if not appender:
         # Avoid AttributeError: 'NoneType' object has no attribute
         # 'fire_append_event'
         if c_inst:
             appender = c_inst.fire_append_event
     if isinstance(value, ProxyList):
         dict.__setitem__(self, key, value)
     elif isinstance(value, list):
         value_ = value.copy()
         for idx, item in enumerate(value_):
             value_[idx] = appender(item)
         dict.__setitem__(self, key, self.factory(key, value_))
     else:
         value_ = [appender(value)]
         dict.__setitem__(self, key, self.factory(key, value_))
Esempio n. 10
0
    def on_init(self):
        assert not self.linked
        self.linked = True

        adapter = collection_adapter(self)

        parent_cls = type(adapter.owner_state.obj())
        parent_rel_name = adapter.attr.key
        parent_rel_prop = \
            class_mapper(parent_cls).get_property(parent_rel_name)
        self.child_cls = parent_rel_prop.mapper.class_
        self.child_rel_name = parent_rel_prop.back_populates
        self.child_rel_prop = \
            class_mapper(self.child_cls).get_property(self.child_key_name)

        self.event_wrapper = SAEventWeakWrapperToMethod(
            self.child_rel_prop, 'set', self, 'on_key_update')
Esempio n. 11
0
    def on_init(self):
        assert not self.linked
        self.linked = True

        adapter = collection_adapter(self)

        parent_cls = type(adapter.owner_state.obj())
        parent_rel_name = adapter.attr.key
        parent_rel_prop = \
            class_mapper(parent_cls).get_property(parent_rel_name)
        self.child_cls = parent_rel_prop.mapper.class_
        self.child_rel_name = parent_rel_prop.back_populates
        self.child_rel_prop = \
            class_mapper(self.child_cls).get_property(self.child_key_name)

        self.event_wrapper = SAEventWeakWrapperToMethod(
            self.child_rel_prop, 'set', self, 'on_key_update')
Esempio n. 12
0
    def _link(self, adapter):
        assert adapter == collection_adapter(self)

        if adapter is not None:
            # LINK
            assert not self._linked
            self._linked = True

            assert self is adapter.data

            self._parent_rel = adapter.attr.key
            self._parent_obj = adapter.owner_state.obj()
            self._parent_cls = type(self._parent_obj)
            parent_rel_prop = \
                class_mapper(self._parent_cls)._props[self._parent_rel]
            self._child_rel = parent_rel_prop.back_populates
            self._child_cls = parent_rel_prop.mapper.class_
            # This is at the moment not used, but may be in the future.
            # child_rel_prop = \
            #     class_mapper(self._child_cls)._props[self._child_rel]

            # XXX When SQLAlchemy will support removal of attribute
            # events, use the following code:
            #event.listen(class_mapper(self._child_cls)._props[self._column],
            #             'set', self._on_column_change)
            # In the meanwhile we have to use this:
            _event_manager.listen(self._child_cls, self._column, self)

        else:
            # UNLINK
            assert self._linked
            self._linked = False

            # XXX When SQLAlchemy will support removal of attribute
            # events, use the following code:
            #event.remove(class_mapper(self._child_cls)._props[self._column],
            #             'set', self._on_column_change)
            # In the meanwhile we have to use this:
            _event_manager.remove(self._child_cls, self._column, self)

            self._parent_rel = None
            self._parent_obj = None
            self._parent_cls = None
            self._child_rel = None
            self._child_cls = None
Esempio n. 13
0
    def _link(self, adapter):
        assert adapter == collection_adapter(self)

        if adapter is not None:
            # LINK
            assert not self._linked
            self._linked = True

            assert self is adapter.data

            self._parent_rel = adapter.attr.key
            self._parent_obj = adapter.owner_state.obj()
            self._parent_cls = type(self._parent_obj)
            parent_rel_prop = \
                class_mapper(self._parent_cls)._props[self._parent_rel]
            self._child_rel = parent_rel_prop.back_populates
            self._child_cls = parent_rel_prop.mapper.class_
            child_rel_prop = \
                class_mapper(self._child_cls)._props[self._child_rel]

            # XXX When SQLAlchemy will support removal of attribute
            # events, use the following code:
            #event.listen(class_mapper(self._child_cls)._props[self._column],
            #             'set', self._on_column_change)
            # In the meanwhile we have to use this:
            _event_manager.listen(self._child_cls, self._column, self)

        else:
            # UNLINK
            assert self._linked
            self._linked = False

            # XXX When SQLAlchemy will support removal of attribute
            # events, use the following code:
            #event.remove(class_mapper(self._child_cls)._props[self._column],
            #             'set', self._on_column_change)
            # In the meanwhile we have to use this:
            _event_manager.remove(self._child_cls, self._column, self)

            self._parent_rel = None
            self._parent_obj = None
            self._parent_cls = None
            self._child_rel = None
            self._child_cls = None
Esempio n. 14
0
 def __copy(self, item):
     return [y for y in list(collections.collection_adapter(item))]
 def __delitem__(self, key):
     adapter = collection_adapter(self)
     if key in self:
         adapter.fire_remove_event(self[key], None)
         dict.__delitem__(self, key)
 def factory(self, key, *args, **kwargs):
     kwargs['_collecion_adapter'] = collection_adapter(self)
     kwargs['_creator'] = CreatorProxy(self.creator, key)
     return ProxyList(*args, **kwargs)
Esempio n. 17
0
 def __copy(self, item):
     return [y for y in list(collections.collection_adapter(item))]
Esempio n. 18
0
 def remove(self, object, emit=None):
     collection_adapter(self).fire_pre_remove_event(object)
     self.members.remove(object)
     collection_adapter(self).fire_remove_event(object, emit)
Esempio n. 19
0
 def add(self, object, emit=None):
     self.members.append(object)
     collection_adapter(self).fire_append_event(object, emit)
Esempio n. 20
0
 def remove(self, object, emit=None):
     collection_adapter(self).fire_pre_remove_event(object)
     self.members.remove(object)
     collection_adapter(self).fire_remove_event(object, emit)
Esempio n. 21
0
 def add(self, object, emit=None):
     self.members.append(object)
     collection_adapter(self).fire_append_event(object, emit)
 def factory(self, key, *args, **kwargs):
     kwargs['_collecion_adapter'] = collection_adapter(self)
     kwargs['_creator'] = lambda value: self.creator(key, value)
     return ProxyList(*args, **kwargs)