[Checkins] SVN: z3ext.statusmessage/trunk/ - API refactored
Nikolay Kim
fafhrd at datacom.kz
Thu Nov 20 07:03:03 EST 2008
Log message for revision 93152:
- API refactored
- Allow add messages at any stage of page processing
Changed:
U z3ext.statusmessage/trunk/CHANGES.txt
U z3ext.statusmessage/trunk/setup.py
U z3ext.statusmessage/trunk/src/z3ext/statusmessage/__init__.py
D z3ext.statusmessage/trunk/src/z3ext/statusmessage/browser.py
D z3ext.statusmessage/trunk/src/z3ext/statusmessage/browser.zcml
U z3ext.statusmessage/trunk/src/z3ext/statusmessage/configure.zcml
A z3ext.statusmessage/trunk/src/z3ext/statusmessage/handler.py
U z3ext.statusmessage/trunk/src/z3ext/statusmessage/interfaces.py
U z3ext.statusmessage/trunk/src/z3ext/statusmessage/message.py
U z3ext.statusmessage/trunk/src/z3ext/statusmessage/session.py
U z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests.py
-=-
Modified: z3ext.statusmessage/trunk/CHANGES.txt
===================================================================
--- z3ext.statusmessage/trunk/CHANGES.txt 2008-11-19 23:25:51 UTC (rev 93151)
+++ z3ext.statusmessage/trunk/CHANGES.txt 2008-11-20 12:03:03 UTC (rev 93152)
@@ -2,6 +2,14 @@
CHANGES
=======
+1.3.0 (2008-11-??)
+------------------
+
+- API refactored
+
+- Allow add messages at any stage of page processing
+
+
1.2.1 (2008-05-14)
------------------
Modified: z3ext.statusmessage/trunk/setup.py
===================================================================
--- z3ext.statusmessage/trunk/setup.py 2008-11-19 23:25:51 UTC (rev 93151)
+++ z3ext.statusmessage/trunk/setup.py 2008-11-20 12:03:03 UTC (rev 93152)
@@ -55,9 +55,11 @@
install_requires = ['setuptools',
'zope.component',
'zope.interface',
- 'zope.contentprovider',
'zope.session',
'zope.publisher',
+ 'zope.contentprovider',
+ 'zope.app.component',
+ 'zope.app.publication',
'z3c.autoinclude',
],
extras_require = dict(test=['zope.app.testing',
Modified: z3ext.statusmessage/trunk/src/z3ext/statusmessage/__init__.py
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/__init__.py 2008-11-19 23:25:51 UTC (rev 93151)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/__init__.py 2008-11-20 12:03:03 UTC (rev 93152)
@@ -1 +1,3 @@
# This file is necessary to make this directory a package.
+
+import handler
\ No newline at end of file
Deleted: z3ext.statusmessage/trunk/src/z3ext/statusmessage/browser.py
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/browser.py 2008-11-19 23:25:51 UTC (rev 93151)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/browser.py 2008-11-20 12:03:03 UTC (rev 93152)
@@ -1,109 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""
-
-$Id$
-"""
-from zope import interface, component
-from zope.component import getMultiAdapter
-from zope.contentprovider.interfaces import IContentProvider
-
-import interfaces
-from interfaces import IMessageView, IStatusMessage
-
-
-class StatusMessage(object):
- interface.implements(IContentProvider)
- component.adapts(
- interface.Interface,
- interface.Interface,
- interface.Interface)
-
- def __init__(self, context, request, view):
- self.context, self.request, self.view = context, request, view
-
- def add(self, text, type='info'):
- service = IStatusMessage(self.request, None)
- if service is not None:
- service.add(text, type)
-
- def addIf(self, text, type='info'):
- if bool(text):
- self.add(text, type)
-
- def update(self):
- pass
-
- def render(self):
- request = self.request
-
- service = IStatusMessage(self.request, None)
- if service is not None:
- try:
- messages = service.clear()
- except:
- return u''
-
- views = []
- for message in messages:
- view = getMultiAdapter((message, request), IMessageView)
- views.append(view.render())
-
- return u'\n'.join(views)
-
- return u''
-
-
-
-class BaseView(object):
- interface.implements(IMessageView)
-
- def __init__(self, context, request):
- self.context = context
- self.request = request
-
- def render(self):
- return self.template%self.context.message
-
-
-class Message(BaseView):
- component.adapts(
- interfaces.IMessage,
- interface.Interface)
-
- template = '<div class="statusMessage">%s</div>'
-
-
-class InformationMessage(BaseView):
- component.adapts(
- interfaces.IInformationMessage,
- interface.Interface)
-
- template = '<div class="statusMessage">%s</div>'
-
-
-class ErrorMessage(BaseView):
- component.adapts(
- interfaces.IErrorMessage,
- interface.Interface)
-
- template = '<div class="statusStopMessage">%s</div>'
-
-
-class WarningMessage(BaseView):
- component.adapts(
- interfaces.IWarningMessage,
- interface.Interface)
-
- template = '<div class="statusWarningMessage">%s</div>'
Deleted: z3ext.statusmessage/trunk/src/z3ext/statusmessage/browser.zcml
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/browser.zcml 2008-11-19 23:25:51 UTC (rev 93151)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/browser.zcml 2008-11-20 12:03:03 UTC (rev 93152)
@@ -1,12 +0,0 @@
-<configure xmlns="http://namespaces.zope.org/zope">
-
- <adapter
- name="statusMessage"
- factory=".browser.StatusMessage" />
-
- <adapter factory=".browser.Message" />
- <adapter factory=".browser.InformationMessage" />
- <adapter factory=".browser.WarningMessage" />
- <adapter factory=".browser.ErrorMessage" />
-
-</configure>
Modified: z3ext.statusmessage/trunk/src/z3ext/statusmessage/configure.zcml
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/configure.zcml 2008-11-19 23:25:51 UTC (rev 93151)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/configure.zcml 2008-11-20 12:03:03 UTC (rev 93152)
@@ -2,42 +2,25 @@
<includeDependencies package="z3ext.statusmessage" />
- <utility
+ <!-- messages -->
+ <adapter
name="info"
- provides=".interfaces.IMessageFactory"
- component=".message.InformationMessage" />
+ factory=".message.InformationMessage" />
- <class class=".message.InformationMessage">
- <allow interface=".interfaces.IMessage" />
- </class>
-
- <utility
+ <adapter
name="warning"
- provides=".interfaces.IMessageFactory"
- component=".message.WarningMessage" />
+ factory=".message.WarningMessage" />
- <class class=".message.WarningMessage">
- <allow interface=".interfaces.IMessage" />
- </class>
-
- <utility
+ <adapter
name="error"
- provides=".interfaces.IMessageFactory"
- component=".message.ErrorMessage" />
+ factory=".message.ErrorMessage" />
- <class class=".message.ErrorMessage">
- <allow interface=".interfaces.IMessage" />
- </class>
+ <!-- default message service -->
+ <adapter factory=".session.MessageService" />
- <class class=".session.SessionMessageService">
- <allow interface=".interfaces.IStatusMessage" />
- </class>
-
+ <!-- browser views -->
<adapter
- for="zope.publisher.interfaces.browser.IHTTPRequest"
- provides=".interfaces.IStatusMessage"
- factory=".session.getSessionMessageService" />
+ name="statusMessage"
+ factory=".message.StatusMessage" />
- <include file="browser.zcml" />
-
</configure>
Added: z3ext.statusmessage/trunk/src/z3ext/statusmessage/handler.py
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/handler.py (rev 0)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/handler.py 2008-11-20 12:03:03 UTC (rev 93152)
@@ -0,0 +1,47 @@
+##############################################################################
+#
+# Copyright (c) 2008 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+$Id$
+"""
+from threading import local
+from zope import interface, component
+from zope.app.publication.zopepublication import ZopePublication
+
+from interfaces import IStatusMessage
+
+
+# BAD! VERY BAD
+
+def newAfterCall(self, request, ob):
+ response = request.response
+
+ status = response.getStatus()
+ if status not in (302, 303):
+ service = IStatusMessage(request, None)
+ if service is None:
+ return
+
+ messages = service.clear()
+
+ if messages:
+ body = response.consumeBody()
+ body = body.replace(
+ '<!--z3ext-statusmessage-->', str(u'\n'.join(messages)), 1)
+ response.setResult(body)
+
+ afterCall(self, request, ob)
+
+afterCall = ZopePublication.afterCall
+ZopePublication.afterCall = newAfterCall
Property changes on: z3ext.statusmessage/trunk/src/z3ext/statusmessage/handler.py
___________________________________________________________________
Added: svn:keywords
+ Id
Modified: z3ext.statusmessage/trunk/src/z3ext/statusmessage/interfaces.py
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/interfaces.py 2008-11-19 23:25:51 UTC (rev 93151)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/interfaces.py 2008-11-20 12:03:03 UTC (rev 93152)
@@ -20,53 +20,18 @@
SESSIONKEY = 'z3ext.statusmessage'
-class StatusMessageError(Exception):
- """ general message service error """
-
-
class IMessage(interface.Interface):
""" message """
- message = interface.Attribute('Message text')
+ def render(message):
+ """ render message """
-class IMessageFactory(interface.Interface):
- """ message factory """
-
- def __call__(message):
- """ create IMessage with message """
-
-
-class IInformationMessage(IMessage):
- """ information message """
-
-
-class IWarningMessage(IMessage):
- """ wranning message """
-
-
-class IErrorMessage(IMessage):
- """ error message """
-
-
class IStatusMessage(interface.Interface):
""" message service """
def add(text, type='info'):
""" add message text as message to service """
- def addMessage(message):
- """ add IMessage object to service """
-
- def list():
- """ list all messages """
-
- def clear():
- """ return all messages and clear service """
-
- def hasMessages():
+ def __nonzero__():
""" check is service has messages """
-
-
-class IMessageView(interface.Interface):
- """ message view interface """
Modified: z3ext.statusmessage/trunk/src/z3ext/statusmessage/message.py
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/message.py 2008-11-19 23:25:51 UTC (rev 93151)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/message.py 2008-11-20 12:03:03 UTC (rev 93152)
@@ -16,30 +16,54 @@
$Id$
"""
import cgi
-import interfaces
-from zope import interface
+from zope import interface, component
+from zope.contentprovider.interfaces import IContentProvider
+from zope.publisher.interfaces.browser import IBrowserRequest
+from interfaces import IMessage
+
class Message(object):
- interface.classProvides(interfaces.IMessageFactory)
+ interface.implements(IMessage)
+ component.adapts(IBrowserRequest)
- def __init__(self, message):
- self.message = message
+ def __init__(self, request):
+ self.request = request
class InformationMessage(Message):
- interface.implements(interfaces.IInformationMessage)
+ def render(self, message):
+ return '<div class="statusMessage">%s</div>'%message
+
class WarningMessage(Message):
- interface.implements(interfaces.IWarningMessage)
+ def render(self, message):
+ return '<div class="statusWarningMessage">%s</div>'%message
+
class ErrorMessage(Message):
- interface.implements(interfaces.IErrorMessage)
- def __init__(self, e):
+ def render(self, e):
if isinstance(e, Exception):
- self.message = '%s: %s'%(e.__class__.__name__, cgi.escape(str(e), True))
+ message = '%s: %s'%(e.__class__.__name__, cgi.escape(str(e), True))
else:
- self.message = e
+ message = e
+
+ return '<div class="statusStopMessage">%s</div>'%message
+
+
+class StatusMessage(object):
+ interface.implements(IContentProvider)
+ component.adapts(
+ interface.Interface, IBrowserRequest, interface.Interface)
+
+ def __init__(self, context, request, view):
+ self.context, self.request, self.view = context, request, view
+
+ def update(self):
+ pass
+
+ def render(self):
+ return u'<!--z3ext-statusmessage-->'
Modified: z3ext.statusmessage/trunk/src/z3ext/statusmessage/session.py
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/session.py 2008-11-19 23:25:51 UTC (rev 93151)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/session.py 2008-11-20 12:03:03 UTC (rev 93152)
@@ -15,72 +15,51 @@
$Id$
"""
-import logging, sys
-
from zope import interface, component
-from zope.component import getUtility
+from zope.component import getAdapter
from zope.session.interfaces import ISession
from zope.publisher.interfaces.browser import IBrowserRequest
-from interfaces import SESSIONKEY, IMessageFactory, IStatusMessage
+from interfaces import SESSIONKEY, IMessage, IStatusMessage
-def log_exc(msg='', subsystem='z3ext.statusmessage'):
- log = logging.getLogger(subsystem)
- log.log(logging.ERROR, msg, exc_info=sys.exc_info())
-
-
- at component.adapter(IBrowserRequest)
- at interface.implementer(IStatusMessage)
-def getSessionMessageService(request):
- try:
- session = ISession(request, None)
- if session is not None:
- return SessionMessageService(session)
- except:
- pass
-
-
-class SessionMessageService(object):
- """ message service that store messages in session """
+class MessageService(object):
+ """ message service """
+ component.adapts(IBrowserRequest)
interface.implements(IStatusMessage)
- def __init__(self, session):
- self.session = session
+ def __init__(self, request):
+ self.request = request
def add(self, text, type='info'):
- factory = getUtility(IMessageFactory, type)
- self.addMessage(factory(text))
+ message = getAdapter(self.request, IMessage, type)
- def addMessage(self, message):
- data = self.session[SESSIONKEY]
+ session = ISession(self.request, None)
+ if session is not None:
+ try:
+ data = session[SESSIONKEY]
+ messages = data.get('messages', [])
+ messages.append(message.render(text))
+ data['messages'] = messages
+ except Exception, e:
+ print e
- try:
- messages = data.get('messages', [])
- messages.append(message)
- data['messages'] = messages
- except Exception, e:
- log_exc(str(e))
-
- def list(self):
- data = self.session[SESSIONKEY]
- return data.get('messages', ())
-
def clear(self):
- data = self.session[SESSIONKEY]
+ session = ISession(self.request, None)
+ if session is not None:
+ data = session.get(SESSIONKEY)
+ if data is not None:
+ messages = data.get('messages')
+ if messages:
+ del data['messages']
+ return messages
+ return ()
- messages = data.get('messages')
- if messages is not None:
- del data['messages']
- return messages
+ def __nonzero__(self):
+ session = ISession(request, None)
+ if session is not None:
+ data = session.get(SESSIONKEY)
+ if data:
+ return len(data.get('messages', ())) > 0
else:
- return ()
-
- def hasMessages(self):
- data = self.session[SESSIONKEY]
-
- messages = data.get('messages')
- if messages is not None:
- return bool(messages)
- else:
return False
Modified: z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests.py
===================================================================
--- z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests.py 2008-11-19 23:25:51 UTC (rev 93151)
+++ z3ext.statusmessage/trunk/src/z3ext/statusmessage/tests.py 2008-11-20 12:03:03 UTC (rev 93152)
@@ -53,8 +53,8 @@
provideAdapter(browser.InformationMessage)
provideAdapter(browser.ErrorMessage)
provideAdapter(browser.WarningMessage)
-
+
def tearDown(test):
session.__init__()
setup.placelessTearDown()
@@ -62,8 +62,8 @@
def test_suite():
return unittest.TestSuite((
- doctest.DocFileSuite(
- 'README.txt',
- setUp=setUp, tearDown=tearDown,
- optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS),
- ))
+ doctest.DocFileSuite(
+ 'README.txt',
+ setUp=setUp, tearDown=tearDown,
+ optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS),
+ ))
More information about the Checkins
mailing list