diff --git a/composer/rule/base.py b/composer/rule/base.py index ff89792..7227eb2 100644 --- a/composer/rule/base.py +++ b/composer/rule/base.py @@ -54,7 +54,7 @@ class RuleManager(object): entry.append(rule) def getRulesForEvent(self, event): - return self.rules.get(event.name, []) + return self.rules and self.rules.get(event.name, []) or [] def handleEvent(self, event): result = [] @@ -86,16 +86,6 @@ class Rule(Template): self.actions = [] -class RuleInstance(object): - - implements(IInstance) - - template = None - - def applyTemplate(self): - pass - - # events class EventType(object): diff --git a/composer/rule/instance.py b/composer/rule/instance.py index 7d2d319..b1961d0 100644 --- a/composer/rule/instance.py +++ b/composer/rule/instance.py @@ -35,6 +35,7 @@ class RuleInstance(Instance): implements(IRuleInstance) adapts(Interface) + template = None event = None def applyTemplate(self, **kw): diff --git a/organize/browser/service.py b/organize/browser/service.py index 7c69062..ef6f1ac 100644 --- a/organize/browser/service.py +++ b/organize/browser/service.py @@ -29,7 +29,10 @@ from zope.cachedescriptors.property import Lazy from cybertools.organize.interfaces import IClientRegistrations, IRegistrationTemplate from cybertools.organize.interfaces import serviceCategories +from cybertools.organize.service import eventTypes, getCheckoutRule from cybertools.composer.interfaces import IInstance +from cybertools.composer.rule.base import Event +from cybertools.composer.rule.interfaces import IRuleManager from cybertools.composer.schema.browser.common import BaseView as SchemaBaseView from cybertools.composer.schema.interfaces import IClientFactory from cybertools.stateful.interfaces import IStateful @@ -185,6 +188,9 @@ class CheckoutView(ServiceManagerView): stateful = IStateful(reg) stateful.doTransition(('submit', 'change')) # send mail + rm = IRuleManager(self.manager) + rm.addRule(getCheckoutRule(self.manager.senderEmail)) + rm.handleEvent(Event(eventTypes['service.checkout'], client)) # find thank you message and redirect to it params = '?message=thankyou&id=' + self.clientName self.request.response.redirect(self.url + '/checkout.html' + params) diff --git a/organize/interfaces.py b/organize/interfaces.py index 3ad1914..52aa4a1 100644 --- a/organize/interfaces.py +++ b/organize/interfaces.py @@ -256,6 +256,11 @@ class IService(Interface): description=_(u'Web address (URL) for more information ' 'about the service.'), required=False,) + 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,) availableCapacity = Attribute('Available capacity, i.e. number of seats ' 'still available; a negative number means: ' diff --git a/organize/service.py b/organize/service.py index ffa2e39..97196f9 100644 --- a/organize/service.py +++ b/organize/service.py @@ -33,6 +33,7 @@ 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.rule.base import Rule, Action from cybertools.composer.schema.interfaces import IClientManager, IClient from cybertools.stateful.base import StatefulAdapter from cybertools.stateful.definition import registerStatesDefinition @@ -61,6 +62,7 @@ class ServiceManager(object): allowRegWithNumber = False allowDirectRegistration = True + senderEmail = 'unknown@sender.com' def __init__(self): if self.servicesFactory is not None: @@ -121,7 +123,7 @@ class Service(object): manager = None category = None - location = '' + location = u'' allowRegWithNumber = False allowDirectRegistration = True @@ -378,6 +380,18 @@ class MessageManagerAdapter(MessageManager): return self.context.messages +def getCheckoutRule(sender): + """ A rule for sending a confirmation message, provided by default. + """ + checkoutRule = Rule('checkoutmail') + checkoutRule.events.append(eventTypes['service.checkout']) + checkoutRule.actions.append(Action('message', + parameters=dict(messageName='feedback_text'))) + checkoutRule.actions.append(Action('sendmail', + parameters=dict(sender=sender))) + return checkoutRule + + # Zope event handlers def clientRemoved(obj, event):