[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