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