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()
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()
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()
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)
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 _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_))
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_))
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')
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')
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
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
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)
def __copy(self, item): return [y for y in list(collections.collection_adapter(item))]
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)
def add(self, object, emit=None): self.members.append(object) collection_adapter(self).fire_append_event(object, emit)
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)
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)