more on checkout rule handling, including browser redirect
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2186 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
82ec156337
commit
29d8e216b5
5 changed files with 148 additions and 15 deletions
|
@ -62,9 +62,9 @@ class DataProvider(object):
|
||||||
#messageManager = self.context.template.getManager()
|
#messageManager = self.context.template.getManager()
|
||||||
messageManager = self.context.manager
|
messageManager = self.context.manager
|
||||||
if key.startswith('@@'):
|
if key.startswith('@@'):
|
||||||
viewName = key[2:]
|
|
||||||
if client is None:
|
if client is None:
|
||||||
return '$' + key
|
return '$' + key
|
||||||
|
viewName = key[2:]
|
||||||
request = self.data.get('request') or TestRequest()
|
request = self.data.get('request') or TestRequest()
|
||||||
view = component.queryMultiAdapter(
|
view = component.queryMultiAdapter(
|
||||||
(client.manager, request), name=viewName)
|
(client.manager, request), name=viewName)
|
||||||
|
@ -72,6 +72,16 @@ class DataProvider(object):
|
||||||
return view()
|
return view()
|
||||||
else:
|
else:
|
||||||
return key
|
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:
|
elif key in messageManager.messages:
|
||||||
#mi = component.getMultiAdapter(
|
#mi = component.getMultiAdapter(
|
||||||
# (client, messageManager.messages[key]), IInstance)
|
# (client, messageManager.messages[key]), IInstance)
|
||||||
|
@ -93,4 +103,4 @@ class DataProvider(object):
|
||||||
|
|
||||||
class MessageTemplate(Template):
|
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]+'
|
||||||
|
|
|
@ -27,6 +27,7 @@ from zope import component
|
||||||
from zope.interface import implements
|
from zope.interface import implements
|
||||||
|
|
||||||
from cybertools.composer.interfaces import IInstance
|
from cybertools.composer.interfaces import IInstance
|
||||||
|
from cybertools.composer.rule.interfaces import IActionHandler
|
||||||
from cybertools.composer.rule.base import ActionHandler
|
from cybertools.composer.rule.base import ActionHandler
|
||||||
|
|
||||||
|
|
||||||
|
@ -37,6 +38,9 @@ class MailActionHandler(ActionHandler):
|
||||||
client = self.context.context
|
client = self.context.context
|
||||||
clientData = IInstance(client).applyTemplate()
|
clientData = IInstance(client).applyTemplate()
|
||||||
recipient = clientData['standard.email']
|
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'],
|
msg = self.prepareMessage(data['subjectLine'], data['text'],
|
||||||
sender, recipient)
|
sender, recipient)
|
||||||
data['mailInfo'] = self.sendMail(msg.as_string(), sender, [recipient])
|
data['mailInfo'] = self.sendMail(msg.as_string(), sender, [recipient])
|
||||||
|
|
71
composer/rule/web.py
Normal file
71
composer/rule/web.py
Normal file
|
@ -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 '<h1>No message name given</h1>'
|
||||||
|
rule = getCheckoutRule('dummy') # the only rule existing atm
|
||||||
|
clientName = self.getClientName()
|
||||||
|
if not clientName:
|
||||||
|
return '<h1>No client info found</h1>'
|
||||||
|
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']
|
||||||
|
|
|
@ -188,27 +188,69 @@ class CheckoutView(ServiceManagerView):
|
||||||
# send mail
|
# send mail
|
||||||
rm = IRuleManager(self.manager)
|
rm = IRuleManager(self.manager)
|
||||||
rm.addRule(getCheckoutRule(self.manager.senderEmail))
|
rm.addRule(getCheckoutRule(self.manager.senderEmail))
|
||||||
rm.handleEvent(Event(eventTypes['service.checkout'], client, self.request))
|
result = rm.handleEvent(Event(eventTypes['service.checkout'],
|
||||||
# find thank you message and redirect to it
|
client, self.request))
|
||||||
params = '?message=thankyou&id=' + self.clientName
|
#params = '?message=thankyou&id=' + self.clientName
|
||||||
self.request.response.redirect(self.url + '/checkout.html' + params)
|
#self.request.response.redirect(self.url + '/checkout.html' + params)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def listRegistrationsText(self):
|
def getRegistrationsInfo(self):
|
||||||
client = self.getClient()
|
client = self.getClient()
|
||||||
if client is None:
|
if client is None:
|
||||||
return 'Error: no client given.'
|
return []
|
||||||
result = []
|
result = []
|
||||||
regs = IClientRegistrations(client)
|
regs = IClientRegistrations(client)
|
||||||
regs = sorted(regs.getRegistrations(), key=self.sortKey)
|
regs = sorted(regs.getRegistrations(), key=self.sortKey)
|
||||||
for reg in regs:
|
for reg in regs:
|
||||||
service = reg.service
|
service = reg.service
|
||||||
line = '%-30s %27s' % (service.title, self.getFromTo(service))
|
result.append(dict(service=service.title,
|
||||||
if service.allowRegWithNumber:
|
fromTo=self.getFromTo(service),
|
||||||
line += ' %4i' % reg.number
|
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)
|
result.append(line)
|
||||||
return '\n'.join(result)
|
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 = '''
|
||||||
|
<table class="listing">
|
||||||
|
<tr>
|
||||||
|
<th width="5%%">Teilnehmer</th>
|
||||||
|
<th>Veranstaltung</th>
|
||||||
|
<th>Datum/Uhrzeit</th>
|
||||||
|
</tr>
|
||||||
|
%s
|
||||||
|
</table>
|
||||||
|
'''
|
||||||
|
row = '''
|
||||||
|
<tr>
|
||||||
|
<td width="5%%">%i</td>
|
||||||
|
<td>%s</td>
|
||||||
|
<td style="white-space: nowrap">%s</td>
|
||||||
|
</tr>
|
||||||
|
'''
|
||||||
|
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):
|
class ServiceView(BaseView):
|
||||||
|
|
||||||
|
@ -308,9 +350,11 @@ class ServiceView(BaseView):
|
||||||
if 'submit_register' in form and number > 0:
|
if 'submit_register' in form and number > 0:
|
||||||
regs.register([self.context], numbers=[number])
|
regs.register([self.context], numbers=[number])
|
||||||
self.showCheckoutButton = True
|
self.showCheckoutButton = True
|
||||||
|
nextUrl = self.getSchemaUrl()
|
||||||
elif 'submit_unregister' in form:
|
elif 'submit_unregister' in form:
|
||||||
regs.unregister([self.context])
|
regs.unregister([self.context])
|
||||||
number = 0
|
number = 0
|
||||||
|
nextUrl = self.getSchemaUrl()
|
||||||
elif 'submit_checkout' in form:
|
elif 'submit_checkout' in form:
|
||||||
nextUrl = self.getSchemaUrl()
|
nextUrl = self.getSchemaUrl()
|
||||||
if nextUrl:
|
if nextUrl:
|
||||||
|
|
|
@ -390,12 +390,16 @@ class MessageManagerAdapter(MessageManager):
|
||||||
def getCheckoutRule(sender):
|
def getCheckoutRule(sender):
|
||||||
""" A rule for sending a confirmation message, provided by default.
|
""" A rule for sending a confirmation message, provided by default.
|
||||||
"""
|
"""
|
||||||
checkoutRule = Rule('checkoutmail')
|
checkoutRule = Rule('checkout')
|
||||||
checkoutRule.events.append(eventTypes['service.checkout'])
|
checkoutRule.events.append(eventTypes['service.checkout'])
|
||||||
checkoutRule.actions.append(Action('message',
|
#checkoutRule.actions.append(Action('message',
|
||||||
parameters=dict(messageName='feedback_text')))
|
# parameters=dict(messageName='feedback_text')))
|
||||||
checkoutRule.actions.append(Action('sendmail',
|
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
|
return checkoutRule
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue