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.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]+'
|
||||
|
|
|
@ -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])
|
||||
|
|
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
|
||||
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 = '''
|
||||
<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):
|
||||
|
||||
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue