diff --git a/composer/message/base.py b/composer/message/base.py index 4d12259..6fe56fa 100644 --- a/composer/message/base.py +++ b/composer/message/base.py @@ -39,13 +39,16 @@ class MessageManager(object): messages = None manager = None - def __init__(self): - if self.messagesFactory is not None: - self.messages = self.messagesFactory() - def getManager(self): return self.manager + def addMessage(self, messageName, text): + message = Message(messageName, manager=self) + message.text = text + if self.messages is None: + self.messages = self.messagesFactory() + self.messages.append(message) + class Message(Template): diff --git a/composer/message/instance.py b/composer/message/instance.py index 1944909..5c90289 100644 --- a/composer/message/instance.py +++ b/composer/message/instance.py @@ -25,6 +25,7 @@ $Id$ from string import Template from zope import component from zope.interface import implements +from zope.publisher.browser import TestRequest from cybertools.composer.instance import Instance from cybertools.composer.interfaces import IInstance @@ -38,7 +39,7 @@ class MessageInstance(Instance): self.client = client self.template = template - def applyTemplate(self, **kw): + def applyTemplate(self, data=None, **kw): data = DataProvider(self) return MessageTemplate(self.template.text).safe_substitute(data) @@ -55,9 +56,12 @@ class DataProvider(object): viewName = key[2:] if client is None: return '$' + key - view = component.getMultiAdapter( - (client.manager, TestRequest(form=form)), name=viewName) - return view() + view = component.queryMultiAdapter( + (client.manager, TestRequest()), name=viewName) + if view is not None: + return view() + else: + return key elif key in messageManager.messages: #mi = component.getMultiAdapter( # (client, messageManager.messages[key]), IInstance) diff --git a/composer/message/interfaces.py b/composer/message/interfaces.py index 92cc27d..8ce954a 100644 --- a/composer/message/interfaces.py +++ b/composer/message/interfaces.py @@ -42,6 +42,10 @@ class IMessageManager(Interface): messages = Attribute('A collection of message objects managed.') + def addMessage(name, text): + """ Add a message under the name given with the given message text. + """ + class IMessage(ITemplate): """ A complex message that may be expanded using instance data. diff --git a/composer/rule/base.py b/composer/rule/base.py index eb0be83..1a74245 100644 --- a/composer/rule/base.py +++ b/composer/rule/base.py @@ -63,15 +63,6 @@ class RuleManager(object): ri.template = r ri.event = event ri.applyTemplate() - #for c in r.conditions: - # cond = component.getAdapter(r, ICondition, name=c) - # if not cond(event): - # continue - #data = None - #for action in r.actions: - # handler = component.getAdapter(action, IActionHandler, - # name=action.handlerName) - # data = handler(data, event) class Rule(Template): @@ -166,5 +157,5 @@ class ActionHandler(object): def __init__(self, context): self.context = context - def __call__(self, data, event, params={}): + def __call__(self, data, params={}): pass diff --git a/composer/rule/instance.py b/composer/rule/instance.py index 194e2d5..0aee856 100644 --- a/composer/rule/instance.py +++ b/composer/rule/instance.py @@ -42,9 +42,9 @@ class RuleInstance(Instance): cond = component.getAdapter(self, ICondition, name=c) if not cond(): continue - data = None + data = {} for action in self.template.actions: handler = component.getAdapter(self, IActionHandler, name=action.handlerName) - data = handler(data, self.event) + data = handler(data, action.parameters) diff --git a/composer/rule/mail.py b/composer/rule/mail.py index 6d83932..cd83b4d 100644 --- a/composer/rule/mail.py +++ b/composer/rule/mail.py @@ -17,7 +17,7 @@ # """ -Event definitions. +Action handler for sending emails. $Id$ """ diff --git a/composer/rule/tests.py b/composer/rule/tests.py index 9886053..53805f7 100755 --- a/composer/rule/tests.py +++ b/composer/rule/tests.py @@ -3,6 +3,14 @@ import unittest, doctest from zope.testing.doctestunit import DocFileSuite +from cybertools.composer.rule.base import ActionHandler + + +class MailActionHandler(ActionHandler): + + def __call__(self, data, event, params={}): + pass + class Test(unittest.TestCase): "Basic tests." diff --git a/organize/service.py b/organize/service.py index 0f6697c..30b817c 100644 --- a/organize/service.py +++ b/organize/service.py @@ -31,6 +31,7 @@ from zope import component from zope.interface import implements, Interface from cybertools.composer.interfaces import IInstance +from cybertools.composer.message.base import MessageManager from cybertools.composer.rule.base import RuleManager, EventType from cybertools.composer.schema.interfaces import IClientManager, IClient from cybertools.stateful.base import StatefulAdapter @@ -56,6 +57,8 @@ class ServiceManager(object): services = None clients = None + messages = None + allowRegWithNumber = False allowDirectRegistration = True @@ -344,7 +347,7 @@ class StatefulRegistration(StatefulAdapter): statesDefinition = registrationStates -# rules and events +# events, rules, actions eventTypes = Jeep(( EventType('service.checkout'), @@ -359,6 +362,22 @@ class RuleManagerAdapter(RuleManager): self.context = context +class MessageManagerAdapter(MessageManager): + + adapts(IServiceManager) + + def __init__(self, context): + self.context = context + + def addMessage(self, messageName, text): + super(MessageManagerAdapter, self).addMessage(messageName, text) + self.context.messages = self.messages + + @Lazy + def messages(self): + return self.context.messages + + # Zope event handlers def clientRemoved(obj, event):