From 94b10e85da58f59b964f1939a51a1abd30ad5a31 Mon Sep 17 00:00:00 2001 From: helmutm Date: Thu, 16 Aug 2007 10:23:58 +0000 Subject: [PATCH] store registration additionally in client, + IObjectRemovedEvent handler git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@1922 fd906abe-77d9-0310-91a1-e0d9ade77398 --- organize/browser/service.py | 10 ++++++++++ organize/service.py | 31 +++++++++++++++++++++++++------ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/organize/browser/service.py b/organize/browser/service.py index 40fe8d3..cf8025f 100644 --- a/organize/browser/service.py +++ b/organize/browser/service.py @@ -30,6 +30,16 @@ from cybertools.composer.schema.browser.common import BaseView from cybertools.composer.schema.interfaces import IClientFactory +class ServiceView(object): + + def __init__(self, context, request): + self.context = context + self.request = request + + def getRegistrations(self): + return self.context.registrations + + class RegistrationTemplateView(BaseView): @Lazy diff --git a/organize/service.py b/organize/service.py index dc03170..c48d3e0 100644 --- a/organize/service.py +++ b/organize/service.py @@ -22,6 +22,7 @@ Service management classes. $Id$ """ +from time import time from BTrees.OOBTree import OOBTree from zope.cachedescriptors.property import Lazy from zope.component import adapts @@ -134,6 +135,7 @@ class Registration(object): def __init__(self, client, service): self.client = client self.service = service + self.timeStamp = int(time()) class RegistrationTemplate(object): @@ -163,20 +165,37 @@ class ClientRegistrations(object): template = None + registrationsAttributeName = '__service_registrations__' + def __init__(self, context): self.context = context def register(self, services): - for service in services: - service.register(self.context) + regs = [service.register(self.context) for service in services] + old = getattr(self.context, self.registrationsAttributeName, []) + regs.extend(r for r in old if r.service not in services) + setattr(self.context, self.registrationsAttributeName, regs) def unregister(self, services): + old = getattr(self.context, self.registrationsAttributeName, []) + regs = [r for r in old if r.service not in services] + setattr(self.context, self.registrationsAttributeName, regs) for service in services: service.unregister(self.context) def getRegistrations(self): - for service in self.template.getServices(): - for reg in service.registrations.values(): - if self.context == reg.client: - yield reg + return getattr(self.context, self.registrationsAttributeName, []) + #for service in self.template.getServices(): + # for reg in service.registrations.values(): + # if self.context == reg.client: + # yield reg + +# event handlers + +def clientRemoved(obj, event): + """ Handle removal of a client object. + """ + regs = IClientRegistrations(obj) + for r in regs.getRegistrations(): + r.service.unregister(obj)