def unrelateOnDeletion(event): """Remove all relationships when an object is deleted.""" if not IObjectRemovedEvent.providedBy(event): return linkset = IRelationshipLinks(event.object, None) if linkset is not None: # event.object may be a ContainedProxy unrelateAll(getProxiedObject(event.object))
def unrelateCalendarOnDeletion(event): """When you delete an object, relationships of it's calendar should be removed >>> from schooltool.relationship.tests import setUp, tearDown >>> from schooltool.testing.setup import setUpCalendaring >>> setUp() >>> setUpCalendaring() >>> import zope.event >>> old_subscribers = zope.event.subscribers[:] >>> from schooltool.app.overlay import unrelateCalendarOnDeletion >>> zope.event.subscribers.append(unrelateCalendarOnDeletion) We will need some object that implements IHaveCalendar for that: >>> from zope.container.btree import BTreeContainer >>> container = BTreeContainer() >>> from schooltool.person.person import Person >>> container = BTreeContainer() >>> container['jonas'] = jonas = Person(username="******") >>> container['petras'] = petras = Person(username="******") Let's add calendar of Petras to the list of overlaid calendars: >>> jonas.overlaid_calendars.add(ISchoolToolCalendar(petras)) <...CalendarOverlayInfo object at ...> >>> list(jonas.overlaid_calendars) [<schooltool.app.overlay.CalendarOverlayInfo object at ...>] If we delete Petras - Jonas should have no calendars in his overlay list: >>> del container['petras'] >>> list(jonas.overlaid_calendars) [] Restore old subscribers: >>> zope.event.subscribers[:] = old_subscribers >>> tearDown() """ if not IObjectRemovedEvent.providedBy(event): return # event.object may be a ContainedProxy obj = getProxiedObject(event.object) if not IHaveCalendar.providedBy(obj): return calendar = ISchoolToolCalendar(obj) linkset = IRelationshipLinks(calendar, None) if linkset is not None: unrelateAll(calendar)