diff --git a/composer/schema/client.py b/composer/schema/client.py index 57a8d2a..458899b 100644 --- a/composer/schema/client.py +++ b/composer/schema/client.py @@ -22,12 +22,60 @@ Client implementations. $Id$ """ +from BTrees.OOBTree import OOBTree from persistent import Persistent +from zope.cachedescriptors.property import Lazy from zope.component import adapts from zope.interface import implements +from cybertools.composer.message.base import MessageManager from cybertools.composer.schema.interfaces import IClient from cybertools.composer.schema.interfaces import IClientManager, IClientFactory +from cybertools.util.jeep import Jeep +from cybertools.util.randomname import generateName + + +class ClientManager(object): + + implements(IClientManager) + + clientSchemasFactory = Jeep + clientsFactory = OOBTree + + clients = None + + messages = None + + senderEmail = 'unknown@sender.com' + + def __init__(self): + if self.clientSchemasFactory is not None: + self.clientSchemas = self.clientSchemasFactory() + + def isActive(self): + return True + + def getClientSchemas(self): + return self.clientSchemas + + @Lazy + def clients(self): + return self.clientsFactory() + + def getClients(self): + return self.clients + + def addClient(self, client): + name = self.generateClientName(client) + self.clients[name] = client + client.__name__ = name + return name + + def generateClientName(self, client): + return generateName(self.checkClientName) + + def checkClientName(self, name): + return name not in self.getClients() class Client(Persistent): @@ -50,3 +98,18 @@ class ClientFactory(object): return Client(self.context) +class MessageManagerAdapter(MessageManager): + + adapts(IClientManager) + + def __init__(self, context): + self.context = context + + def addMessage(self, messageName, text, **kw): + super(MessageManagerAdapter, self).addMessage(messageName, text, **kw) + self.context.messages = self.messages + + @Lazy + def messages(self): + return self.context.messages + diff --git a/composer/schema/interfaces.py b/composer/schema/interfaces.py index e127abc..1670688 100644 --- a/composer/schema/interfaces.py +++ b/composer/schema/interfaces.py @@ -306,6 +306,12 @@ class IClientManager(Interface): """ Cares for a client typically providing schemas. """ + senderEmail = schema.TextLine( + title=_(u'Sender email'), + description=_(u'Email address that will be used as sender ' + 'address of confirmation and feedback messages.'), + required=False,) + clients = Attribute('A collection of client objects (e.g. persons) ' 'associated with this client manager.') clientSchemas = Attribute('A collection of schema objects ' diff --git a/organize/service.py b/organize/service.py index b06c17f..af233ea 100644 --- a/organize/service.py +++ b/organize/service.py @@ -35,6 +35,7 @@ from cybertools.composer.message.base import MessageManager from cybertools.composer.rule.base import RuleManager, EventType from cybertools.composer.rule.base import Rule, Action from cybertools.composer.schema.interfaces import IClientManager, IClient +from cybertools.composer.schema.client import ClientManager from cybertools.stateful.base import StatefulAdapter from cybertools.stateful.definition import registerStatesDefinition from cybertools.stateful.definition import StatesDefinition @@ -48,57 +49,24 @@ from cybertools.organize.interfaces import IRegistration, IRegistrationTemplate from cybertools.organize.interfaces import IClientRegistrations -class ServiceManager(object): +class ServiceManager(ClientManager): - implements(IServiceManager, IClientManager) + implements(IServiceManager) servicesFactory = Jeep - clientSchemasFactory = Jeep - clientsFactory = OOBTree - services = None - clients = None - - messages = None allowRegWithNumber = False allowDirectRegistration = True - senderEmail = 'unknown@sender.com' def __init__(self): if self.servicesFactory is not None: self.services = self.servicesFactory() - if self.clientSchemasFactory is not None: - self.clientSchemas = self.clientSchemasFactory() - - def isActive(self): - return True + super(ServiceManager, self).__init__() def getServices(self, categories=[]): return self.services - def getClientSchemas(self): - return self.clientSchemas - - @Lazy - def clients(self): - return self.clientsFactory() - - def getClients(self): - return self.clients - - def addClient(self, client): - name = self.generateClientName(client) - self.clients[name] = client - client.__name__ = name - return name - - def generateClientName(self, client): - return generateName(self.checkClientName) - - def checkClientName(self, name): - return name not in self.getClients() - class Registration(object): @@ -313,7 +281,7 @@ class ClientRegistrations(object): regs = getattr(self.context, self.registrationsAttributeName, []) if self.template is not None: svcs = self.template.getServices().values() - regs = (r for r in regs if r.service in svcs) + regs = [r for r in regs if r.service in svcs] return regs def validate(self, clientName, services, numbers=None): @@ -460,7 +428,7 @@ def clientRemoved(obj, event): def serviceRemoved(obj, event): """ Handle removal of a service. """ - for r in obj.registrations.values(): + for r in list(obj.registrations.values()): regs = IClientRegistrations(r.client) regs.unregister([obj])