added new package composer.message

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2024 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2007-09-10 17:31:24 +00:00
parent feeb21e1e3
commit aa41efbf37
7 changed files with 276 additions and 0 deletions

View file

@ -0,0 +1,54 @@
==================
Message Management
==================
($Id$)
>>> from zope import component
>>> from cybertools.composer.message.base import MessageManager, Message
>>> manager = MessageManager()
>>> manager.messages.append(Message('feedback_html', manager=manager))
>>> manager.messages.append(Message('feedback_text', manager=manager))
>>> manager.messages.append(Message('footer', manager=manager))
>>> messageText = '''Dear $person.firstname $person.lastname,
... You have been registered for the following $services.
... $@@list_registrations
... $footer
... '''
>>> manager.messages['feedback_text'].text = messageText
>>> manager.messages['footer'].text = 'Best regards, $sender'
>>> manager.messages.append(Message('sender', manager=manager, text='Jack'))
>>> manager.messages.append(Message('services', manager=manager, text='events'))
Message interpolation
---------------------
>>> from cybertools.composer.message.instance import MessageTemplate
>>> t = MessageTemplate(messageText)
>>> print t.safe_substitute({
... 'person.firstname': 'John', 'person.lastname': 'Smith',
... '@@list_registrations': '0815: Python Introduction',
... 'services': 'events',
... 'footer': 'Regards, $sender'})
Dear John Smith,
You have been registered for the following events.
0815: Python Introduction
Regards, $sender
<BLANKLINE>
Working with message instances
------------------------------
>>> from cybertools.composer.message.instance import MessageInstance
>>> mi = MessageInstance(None, manager.messages['feedback_text'])
>>> print mi.applyTemplate()
Dear $person.firstname $person.lastname,
You have been registered for the following events.
$@@list_registrations
Best regards, Jack
<BLANKLINE>

View file

@ -0,0 +1,4 @@
"""
$Id$
"""

59
composer/message/base.py Normal file
View file

@ -0,0 +1,59 @@
#
# 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
#
"""
Basic classes for message management.
$Id$
"""
from zope.interface import implements
from cybertools.composer.base import Component, Element, Compound
from cybertools.composer.base import Template
from cybertools.composer.message.interfaces import IMessageManager, IMessage
from cybertools.util.jeep import Jeep
class MessageManager(object):
implements(IMessageManager)
messagesFactory = Jeep
messages = None
def __init__(self):
if self.messagesFactory is not None:
self.messages = self.messagesFactory()
class Message(Template):
implements(IMessage)
name = u''
manager = None
def __init__(self, name, **kw):
self.name = name
for k, v in kw.items():
setattr(self, k, v)

View file

@ -0,0 +1,8 @@
<!-- $Id$ -->
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
i18n_domain="zope">
</configure>

View file

@ -0,0 +1,81 @@
#
# 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
#
"""
Message instance and related classes.
$Id$
"""
from string import Template
from zope import component
from zope.interface import implements
from cybertools.composer.instance import Instance
from cybertools.composer.interfaces import IInstance
class MessageInstance(Instance):
template = client = None
def __init__(self, client, template):
self.client = client
self.template = template
def applyTemplate(self, **kw):
data = DataProvider(self)
return MessageTemplate(self.template.text).safe_substitute(data)
class DataProvider(object):
def __init__(self, context):
self.context = context
def __getitem__(self, key):
client = self.context.client
messageManager = self.context.template.manager
if key.startswith('@@'):
viewName = key[2:]
if client is None:
return '$' + key
view = component.getMultiAdapter(
(client.manager, TestRequest(form=form)), name=viewName)
return view()
elif key in messageManager.messages:
#mi = component.getMultiAdapter(
# (client, messageManager.messages[key]), IInstance)
mi = MessageInstance(client, messageManager.messages[key])
return mi.applyTemplate()
elif '.' in key:
if client is None:
return '$' + key
schemaName, fieldName = key.split('.', 1)
schema = client.manager.clientSchemas[schemaName]
instance = IInstance(client)
instance.template = schema
data = instance.applyTemplate()
return data[fieldName]
else:
raise KeyError(key)
class MessageTemplate(Template):
idpattern = r'@{0,2}[_a-z][_.a-z0-9]*[_a-z0-9]+'

View file

@ -0,0 +1,48 @@
#
# 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
#
"""
Message management.
$Id$
"""
from zope.interface import Interface, Attribute
from zope.i18nmessageid import MessageFactory
from zope import schema
from cybertools.composer.interfaces import ITemplate, IComponent
_ = MessageFactory('zope')
class IMessageManager(Interface):
""" A manager (or container) for complex messages.
"""
messages = Attribute('A collection of message objects managed.')
class IMessage(ITemplate):
""" A complex message that may be expanded using instance data.
"""
manager = Attribute('The manager of this message object')
text = schema.Text()

22
composer/message/tests.py Executable file
View file

@ -0,0 +1,22 @@
# $Id$
import unittest, doctest
from zope.testing.doctestunit import DocFileSuite
class Test(unittest.TestCase):
"Basic tests."
def testBasics(self):
pass
def test_suite():
flags = doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS
return unittest.TestSuite((
unittest.makeSuite(Test),
DocFileSuite('README.txt', optionflags=flags),
))
if __name__ == '__main__':
unittest.main(defaultTest='test_suite')