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 = '''
+
+
+ Teilnehmer |
+ Veranstaltung |
+ Datum/Uhrzeit |
+
+ %s
+
+ '''
+ 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