rule manager include message and mail handling working
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2162 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
fba622c294
commit
bc3960ca31
7 changed files with 70 additions and 16 deletions
|
@ -41,8 +41,10 @@ Working with message instances
|
||||||
|
|
||||||
>>> from cybertools.composer.message.instance import MessageInstance
|
>>> from cybertools.composer.message.instance import MessageInstance
|
||||||
>>> mi = MessageInstance(None, manager.messages['feedback_text'])
|
>>> mi = MessageInstance(None, manager.messages['feedback_text'])
|
||||||
>>> print mi.applyTemplate()
|
>>> for key, value in mi.applyTemplate().items():
|
||||||
Dear $person.firstname $person.lastname,
|
... print key + ':', value
|
||||||
|
subject:
|
||||||
|
text: Dear $person.firstname $person.lastname,
|
||||||
You have been registered for the following events.
|
You have been registered for the following events.
|
||||||
$@@list_registrations
|
$@@list_registrations
|
||||||
Best regards, Jack
|
Best regards, Jack
|
||||||
|
|
|
@ -42,8 +42,8 @@ class MessageManager(object):
|
||||||
def getManager(self):
|
def getManager(self):
|
||||||
return self.manager
|
return self.manager
|
||||||
|
|
||||||
def addMessage(self, messageName, text):
|
def addMessage(self, messageName, text, **kw):
|
||||||
message = Message(messageName, manager=self)
|
message = Message(messageName, manager=self, **kw)
|
||||||
message.text = text
|
message.text = text
|
||||||
if self.messages is None:
|
if self.messages is None:
|
||||||
self.messages = self.messagesFactory()
|
self.messages = self.messagesFactory()
|
||||||
|
@ -57,8 +57,10 @@ class Message(Template):
|
||||||
name = u''
|
name = u''
|
||||||
manager = None
|
manager = None
|
||||||
|
|
||||||
def __init__(self, name, **kw):
|
def __init__(self, name, text=u'', subject=u'', **kw):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
self.text = text
|
||||||
|
self.subject = subject
|
||||||
for k, v in kw.items():
|
for k, v in kw.items():
|
||||||
setattr(self, k, v)
|
setattr(self, k, v)
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@ from zope.publisher.browser import TestRequest
|
||||||
|
|
||||||
from cybertools.composer.instance import Instance
|
from cybertools.composer.instance import Instance
|
||||||
from cybertools.composer.interfaces import IInstance
|
from cybertools.composer.interfaces import IInstance
|
||||||
|
from cybertools.util.jeep import Jeep
|
||||||
|
|
||||||
|
|
||||||
class MessageInstance(Instance):
|
class MessageInstance(Instance):
|
||||||
|
@ -41,7 +42,9 @@ class MessageInstance(Instance):
|
||||||
|
|
||||||
def applyTemplate(self, data=None, **kw):
|
def applyTemplate(self, data=None, **kw):
|
||||||
data = DataProvider(self)
|
data = DataProvider(self)
|
||||||
return MessageTemplate(self.template.text).safe_substitute(data)
|
text = MessageTemplate(self.template.text).safe_substitute(data)
|
||||||
|
subject = self.template.subject
|
||||||
|
return Jeep((('subject', subject), ('text', text)))
|
||||||
|
|
||||||
|
|
||||||
class DataProvider(object):
|
class DataProvider(object):
|
||||||
|
@ -66,7 +69,7 @@ class DataProvider(object):
|
||||||
#mi = component.getMultiAdapter(
|
#mi = component.getMultiAdapter(
|
||||||
# (client, messageManager.messages[key]), IInstance)
|
# (client, messageManager.messages[key]), IInstance)
|
||||||
mi = MessageInstance(client, messageManager.messages[key])
|
mi = MessageInstance(client, messageManager.messages[key])
|
||||||
return mi.applyTemplate()
|
return mi.applyTemplate().text
|
||||||
elif '.' in key:
|
elif '.' in key:
|
||||||
if client is None:
|
if client is None:
|
||||||
return '$' + key
|
return '$' + key
|
||||||
|
|
|
@ -63,6 +63,11 @@ class IMessage(ITemplate):
|
||||||
title=_(u'Description'),
|
title=_(u'Description'),
|
||||||
description=_(u'A brief description of the message.'),
|
description=_(u'A brief description of the message.'),
|
||||||
required=False,)
|
required=False,)
|
||||||
|
subject = schema.TextLine(
|
||||||
|
title=_(u'Subject'),
|
||||||
|
description=_(u'A short text that may be used as the subject '
|
||||||
|
'line for emails or as a page title for web pages.'),
|
||||||
|
required=False,)
|
||||||
text = schema.Text(
|
text = schema.Text(
|
||||||
title=_(u'Text'),
|
title=_(u'Text'),
|
||||||
description=_(u"The message text; may contain placeholders "
|
description=_(u"The message text; may contain placeholders "
|
||||||
|
@ -70,11 +75,18 @@ class IMessage(ITemplate):
|
||||||
"be replaced when the message is rendered."),
|
"be replaced when the message is rendered."),
|
||||||
required=False,)
|
required=False,)
|
||||||
format = schema.Choice(
|
format = schema.Choice(
|
||||||
title=_(u'Text format'),
|
title=_(u'Text input format'),
|
||||||
description=_(u'The format of the message.'),
|
description=_(u'The format in which the message is entered.'),
|
||||||
required=True,
|
required=True,
|
||||||
default='text/plain',
|
default='text/plain',
|
||||||
values=('text/plain', 'text/html',))
|
values=('text/plain', 'text/html',))
|
||||||
|
outputFormat = schema.Choice(
|
||||||
|
title=_(u'Output format'),
|
||||||
|
description=_(u'The format in which the message will be '
|
||||||
|
'rendered when delivered to the recipient.'),
|
||||||
|
required=False,
|
||||||
|
default='text/plain',
|
||||||
|
values=('text/plain', 'text/html',))
|
||||||
media = schema.Choice(
|
media = schema.Choice(
|
||||||
title=_(u'Output media'),
|
title=_(u'Output media'),
|
||||||
description=_(u'The media type on which the message will '
|
description=_(u'The media type on which the message will '
|
||||||
|
|
|
@ -22,12 +22,39 @@ Action handler for sending emails.
|
||||||
$Id$
|
$Id$
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from email.MIMEText import MIMEText
|
||||||
|
from zope import component
|
||||||
from zope.interface import implements
|
from zope.interface import implements
|
||||||
|
from zope.sendmail.interfaces import IMailDelivery
|
||||||
|
|
||||||
|
from cybertools.composer.interfaces import IInstance
|
||||||
from cybertools.composer.rule.base import ActionHandler
|
from cybertools.composer.rule.base import ActionHandler
|
||||||
|
|
||||||
|
|
||||||
class MailActionHandler(ActionHandler):
|
class MailActionHandler(ActionHandler):
|
||||||
|
|
||||||
pass
|
def __call__(self, data, params={}):
|
||||||
|
#print 'sending mail...'
|
||||||
|
#print 'subject:', data.subject
|
||||||
|
#print 'text:', data.text
|
||||||
|
#print 'params:', params
|
||||||
|
sender = params.get('sender', 'unknown')
|
||||||
|
client = self.context.context
|
||||||
|
clientData = IInstance(client).applyTemplate()
|
||||||
|
recipient = clientData['standard.email']
|
||||||
|
msg = self.prepareMessage(data.subject, data.text, sender, recipient)
|
||||||
|
data['mailInfo'] = self.sendMail(msg.as_string(), sender, [recipient])
|
||||||
|
return data
|
||||||
|
|
||||||
|
def prepareMessage(self, subject, text, sender, recipient):
|
||||||
|
text = text.encode('utf-8')
|
||||||
|
msg = MIMEText(text, 'plain', 'utf-8')
|
||||||
|
msg['Subject'] = subject
|
||||||
|
msg['From'] = sender
|
||||||
|
msg['To'] = recipient
|
||||||
|
return msg
|
||||||
|
|
||||||
|
def sendMail(self, message, sender, recipients):
|
||||||
|
mailhost = component.getUtility(IMailDelivery, 'Mail')
|
||||||
|
mailhost.send(sender, recipients, message)
|
||||||
|
return 'Mail sent to %s.' % ', '.join(recipients)
|
||||||
|
|
|
@ -1,15 +1,23 @@
|
||||||
# $Id$
|
# $Id$
|
||||||
|
|
||||||
import unittest, doctest
|
import unittest, doctest
|
||||||
|
from email import message_from_string
|
||||||
|
from zope.interface import implements
|
||||||
|
from zope.sendmail.interfaces import IMailDelivery
|
||||||
from zope.testing.doctestunit import DocFileSuite
|
from zope.testing.doctestunit import DocFileSuite
|
||||||
|
|
||||||
from cybertools.composer.rule.base import ActionHandler
|
|
||||||
|
|
||||||
|
class TestMailer(object):
|
||||||
|
|
||||||
class MailActionHandler(ActionHandler):
|
implements(IMailDelivery)
|
||||||
|
|
||||||
def __call__(self, data, event, params={}):
|
def send(self, sender, recipients, message):
|
||||||
pass
|
print 'sender:', sender
|
||||||
|
print 'recipients:', recipients
|
||||||
|
msg = message_from_string(message)
|
||||||
|
print 'subject:', msg['Subject']
|
||||||
|
print 'message:'
|
||||||
|
print msg.get_payload(decode=True)
|
||||||
|
|
||||||
|
|
||||||
class Test(unittest.TestCase):
|
class Test(unittest.TestCase):
|
||||||
|
|
|
@ -369,8 +369,8 @@ class MessageManagerAdapter(MessageManager):
|
||||||
def __init__(self, context):
|
def __init__(self, context):
|
||||||
self.context = context
|
self.context = context
|
||||||
|
|
||||||
def addMessage(self, messageName, text):
|
def addMessage(self, messageName, text, **kw):
|
||||||
super(MessageManagerAdapter, self).addMessage(messageName, text)
|
super(MessageManagerAdapter, self).addMessage(messageName, text, **kw)
|
||||||
self.context.messages = self.messages
|
self.context.messages = self.messages
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
|
|
Loading…
Add table
Reference in a new issue