def backref_listeners(attribute, key, uselist):
"""Apply listeners to synchronize a two-way relationship."""
- def set_(state, child, oldchild, initiator):
+ # use easily recognizable names for stack traces
+
+ def emit_backref_from_scalar_set_event(state, child, oldchild, initiator):
if oldchild is child:
return child
passive=PASSIVE_NO_FETCH)
return child
- def append(state, child, initiator):
+ def emit_backref_from_collection_append_event(state, child, initiator):
child_state, child_dict = instance_state(child), \
instance_dict(child)
child_state.manager[key].impl.append(
passive=PASSIVE_NO_FETCH)
return child
- def remove(state, child, initiator):
+ def emit_backref_from_collection_remove_event(state, child, initiator):
if child is not None:
child_state, child_dict = instance_state(child),\
instance_dict(child)
passive=PASSIVE_NO_FETCH)
if uselist:
- event.listen(attribute, "append", append, retval=True, raw=True)
+ event.listen(attribute, "append",
+ emit_backref_from_collection_append_event,
+ retval=True, raw=True)
else:
- event.listen(attribute, "set", set_, retval=True, raw=True)
+ event.listen(attribute, "set",
+ emit_backref_from_scalar_set_event,
+ retval=True, raw=True)
# TODO: need coverage in test/orm/ of remove event
- event.listen(attribute, "remove", remove, retval=True, raw=True)
+ event.listen(attribute, "remove",
+ emit_backref_from_collection_remove_event,
+ retval=True, raw=True)
class History(tuple):
"""A 3-tuple of added, unchanged and deleted values,