diff --git a/composer/message/instance.py b/composer/message/instance.py index e18c5b3..2b1a880 100644 --- a/composer/message/instance.py +++ b/composer/message/instance.py @@ -62,9 +62,9 @@ class DataProvider(object): #messageManager = self.context.template.getManager() messageManager = self.context.manager if key.startswith('@@'): - viewName = key[2:] if client is None: return '$' + key + viewName = key[2:] request = self.data.get('request') or TestRequest() view = component.queryMultiAdapter( (client.manager, request), name=viewName) @@ -72,6 +72,16 @@ class DataProvider(object): return view() else: return key + elif '|' in key: + elements = key.split('|') + key = elements.pop(0) + value = self[key] + if len(elements) > 1: + if elements[0] == value: + return elements[1] + else: + return '' + return value elif key in messageManager.messages: #mi = component.getMultiAdapter( # (client, messageManager.messages[key]), IInstance) @@ -93,4 +103,4 @@ class DataProvider(object): class MessageTemplate(Template): - idpattern = r'@{0,2}[_a-z][_.a-z0-9]*[_a-z0-9]+' + idpattern = r'@{0,2}[_a-z][_.|a-z0-9]*[_a-z0-9]+' diff --git a/composer/rule/mail.py b/composer/rule/mail.py index e596674..af89463 100644 --- a/composer/rule/mail.py +++ b/composer/rule/mail.py @@ -27,6 +27,7 @@ from zope import component from zope.interface import implements from cybertools.composer.interfaces import IInstance +from cybertools.composer.rule.interfaces import IActionHandler from cybertools.composer.rule.base import ActionHandler @@ -37,6 +38,9 @@ class MailActionHandler(ActionHandler): client = self.context.context clientData = IInstance(client).applyTemplate() recipient = clientData['standard.email'] + if 'messageName' in params: + mh = component.getAdapter(self.context, IActionHandler, name='message') + data = mh(data, params) msg = self.prepareMessage(data['subjectLine'], data['text'], sender, recipient) data['mailInfo'] = self.sendMail(msg.as_string(), sender, [recipient]) diff --git a/composer/rule/web.py b/composer/rule/web.py new file mode 100644 index 0000000..4c1953f --- /dev/null +++ b/composer/rule/web.py @@ -0,0 +1,71 @@ +# +# Copyright (c) 2007 Helmut Merz helmutm@cy55.de +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +""" +Action handler for sending emails. + +$Id$ +""" + +from zope import component +from zope.interface import implements + +from cybertools.composer.rule.interfaces import IRuleManager, IRuleInstance +from cybertools.composer.rule.interfaces import IActionHandler +from cybertools.composer.rule.base import ActionHandler +from cybertools.composer.schema.browser.common import BaseView +from cybertools.organize.service import getCheckoutRule + + +class RedirectActionHandler(ActionHandler): + + def __call__(self, data, params={}): + request = data['request'] + targetView = params['viewName'] + messageName = params['messageName'] + if hasattr(request, 'URL1'): # Zope 2 request + url = request.URL1 + else: + url = request.URL[-1] + request.response.redirect('%s/%s?message=%s' + % (url, targetView, messageName)) + return data + + +class MessageView(BaseView): + + def __init__(self, context, request): + self.context = context + self.request = request + + def getMessage(self): + messageName = self.request.get('message') + if not messageName: + return '

No message name given

' + rule = getCheckoutRule('dummy') # the only rule existing atm + clientName = self.getClientName() + if not clientName: + return '

No client info found

' + client = self.context.getClients().get(clientName) + ri = IRuleInstance(client) + ri.template = rule + data = dict(request=self.request) + mh = component.getAdapter(ri, IActionHandler, name='message') + data = mh(data, dict(messageName=messageName)) + return data['text'] + diff --git a/organize/browser/service.py b/organize/browser/service.py index 5e22cd0..07c7037 100644 --- a/organize/browser/service.py +++ b/organize/browser/service.py @@ -188,27 +188,69 @@ class CheckoutView(ServiceManagerView): # send mail rm = IRuleManager(self.manager) rm.addRule(getCheckoutRule(self.manager.senderEmail)) - rm.handleEvent(Event(eventTypes['service.checkout'], client, self.request)) - # find thank you message and redirect to it - params = '?message=thankyou&id=' + self.clientName - self.request.response.redirect(self.url + '/checkout.html' + params) + result = rm.handleEvent(Event(eventTypes['service.checkout'], + client, self.request)) + #params = '?message=thankyou&id=' + self.clientName + #self.request.response.redirect(self.url + '/checkout.html' + params) return False - def listRegistrationsText(self): + def getRegistrationsInfo(self): client = self.getClient() if client is None: - return 'Error: no client given.' + return [] result = [] regs = IClientRegistrations(client) regs = sorted(regs.getRegistrations(), key=self.sortKey) for reg in regs: service = reg.service - line = '%-30s %27s' % (service.title, self.getFromTo(service)) - if service.allowRegWithNumber: - line += ' %4i' % reg.number + result.append(dict(service=service.title, + fromTo=self.getFromTo(service), + number=reg.number, + serviceObject=service)) + return result + + def listRegistrationsTextTable(self): + result = [] + for info in self.getRegistrationsInfo(): + line = '%-30s %27s' % (info['service'], info['fromTo']) + if info['serviceObject'].allowRegWithNumber: + line += ' %4i' % info['number'] result.append(line) return '\n'.join(result) + def listRegistrationsText(self): + result = [] + for info in self.getRegistrationsInfo(): + line = '%s\n%s\n' % (info['service'], info['fromTo']) + if info['serviceObject'].allowRegWithNumber: + line += 'Teilnehmer: %s\n' % info['number'] + result.append(line) + return '\n'.join(result) + + html = ''' + + + + + + + %s +
TeilnehmerVeranstaltungDatum/Uhrzeit
+ ''' + row = ''' + + %i + %s + %s + + ''' + def listRegistrationsHtml(self): + result = [] + for info in self.getRegistrationsInfo(): + line = self.row % (info['number'], info['service'], info['fromTo']) + result.append(line) + return self.html % '\n'.join(result) + class ServiceView(BaseView): @@ -308,9 +350,11 @@ class ServiceView(BaseView): if 'submit_register' in form and number > 0: regs.register([self.context], numbers=[number]) self.showCheckoutButton = True + nextUrl = self.getSchemaUrl() elif 'submit_unregister' in form: regs.unregister([self.context]) number = 0 + nextUrl = self.getSchemaUrl() elif 'submit_checkout' in form: nextUrl = self.getSchemaUrl() if nextUrl: diff --git a/organize/service.py b/organize/service.py index 0b18cbe..fc6d2f7 100644 --- a/organize/service.py +++ b/organize/service.py @@ -390,12 +390,16 @@ class MessageManagerAdapter(MessageManager): def getCheckoutRule(sender): """ A rule for sending a confirmation message, provided by default. """ - checkoutRule = Rule('checkoutmail') + checkoutRule = Rule('checkout') checkoutRule.events.append(eventTypes['service.checkout']) - checkoutRule.actions.append(Action('message', - parameters=dict(messageName='feedback_text'))) + #checkoutRule.actions.append(Action('message', + # parameters=dict(messageName='feedback_text'))) checkoutRule.actions.append(Action('sendmail', - parameters=dict(sender=sender))) + parameters=dict(sender=sender, + messageName='feedback_text'))) + checkoutRule.actions.append(Action('redirect', + parameters=dict(viewName='message_view.html', + messageName='feedback_html'))) return checkoutRule