Log message for revision 40742: - Checkpoint before I dig into refactoring BaseRequest.py and Publish.py
Changed: A Zope/branches/publication-refactor/lib/python/ZPublisher/Publication.py U Zope/branches/publication-refactor/lib/python/ZPublisher/Publish.py -=- Added: Zope/branches/publication-refactor/lib/python/ZPublisher/Publication.py =================================================================== --- Zope/branches/publication-refactor/lib/python/ZPublisher/Publication.py 2005-12-12 17:59:17 UTC (rev 40741) +++ Zope/branches/publication-refactor/lib/python/ZPublisher/Publication.py 2005-12-12 18:10:07 UTC (rev 40742) @@ -0,0 +1,152 @@ +############################################################################## +# +# Copyright (c) 2005 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 +# +############################################################################## +__version__='$Revision$'[11:-2] + +import transaction +from zope.event import notify +from zope.interface import implements +from zope.publisher.interfaces import IRequest, IPublication +from zope.app.publication.interfaces import EndRequestEvent +from zope.app.publication.interfaces import BeforeTraverseEvent + +from ZPublisher.Publish import Retry +from ZPublisher.Publish import get_module_info, call_object +from ZPublisher.Publish import missing_name, dont_publish_class +from ZPublisher.mapply import mapply +from ZPublisher.BaseRequest import RequestContainer + +class ZopePublication(object): + """Base Zope2 publication specification. + """ + implements(IPublication) + + module_name = "Zope2" + + def __init__(self, db): + # db is a ZODB.DB.DB object. + # XXX We don't use this yet. + self.db = db + + # Fetch module info the to be backwards compatible with 'bobo' + # and Zope 2. + (self.bobo_before, self.bobo_after, + self.application, self.realm, self.debug_mode, + self.err_hook, self.validated_hook, + self.transactions_manager) = get_module_info(self.module_name) + + def beforeTraversal(self, request): + # First part of old ZPublisher.Publish.publish. Call + # 'bobo_before' hooks and start a new transaction using the + # 'transaction_manager'. + if self.bobo_before is not None: + self.bobo_before() + if self.transactions_manager: + self.transactions_manager.begin() + + def callTraversalHooks(self, request, ob): + # Call __before_publishing_traverse__ hooks the Zope 3-way by + # firing an event. + notify(BeforeTraverseEvent(ob, request)) + + def afterTraversal(self, request, ob): + # XXX Authentication should happen here. It used to happen at + # the end of BaseRequest.traverse(). + + # Zope 2 does annotate the transaction just after traversal, + # but before calling the object. Zope 3 does annotate the + # transaction on afterCall instead. + txn = transaction.get() + self.annotateTransaction(txn, request, ob) + + def getApplication(self, request): + # Return the application object for the given module. + ob = self.application + + # Now, some code from ZPublisher.BaseRequest: + # If the top object has a __bobo_traverse__ method, then use it + # to possibly traverse to an alternate top-level object. + if hasattr(ob, '__bobo_traverse__'): + try: + ob = ob.__bobo_traverse__(request) + except: + # XXX Blind except? Yuck! + pass + + if hasattr(ob, '__of__'): + # Try to bind the top-level object to the request + # This is how you get 'self.REQUEST' + ob = ob.__of__(RequestContainer(REQUEST=request)) + + return ob + + def callObject(self, request, ob): + # Call the object the same way it's done in Zope 2. + return mapply(ob, request.getPositionalArguments(), + request, call_object, 1, missing_name, + dont_publish_class, request, bind=1) + + def afterCall(self, request, ob): + # Last part of ZPublisher.Publish.{publish, publish_module_standard}, + # commit the transaction and call 'bobo_after' hook if one was + # provided. + if self.transactions_manager: + self.transactions_manager.commit() + if self.bobo_after is not None: + self.bobo_after() + + def endRequest(self, request, ob): + # End the request the Zope 3-way, by firing an event. + notify(EndRequestEvent(ob, request)) + + def annotateTransaction(self, txn, request, ob): + """Set some useful meta-information on the transaction. This + information is used by the undo framework, for example. + + This method is not part of the `IPublication` interface, since + it's specific to this particular implementation. + """ + # Zope 2 uses the 'recordMetadata' method of the transaction + # manager to record the transaction metadata. + if self.transactions_manager: + self.transactions_manager.recordMetaData(ob, request) + + def handleException(self, object, request, exc_info, retry_allowed=True): + # Some exception handling from ZPublisher.Publish.publish(). + if self.err_hook is None: + if transactions_manager: + transactions_manager.abort() + raise + + # If an err_hook was registered, use it. + try: + try: + return self.err_hook(object, request, + exc_info[0], + exc_info[1], + exc_info[2], + ) + except Retry: + if not retry_allowed: + return self.err_hook(object, request, + exc_info[0], + exc_info[1], + exc_info[2], + ) + finally: + if self.transactions_manager: + self.transactions_manager.abort() + + # XXX After this code, in ZPublisher.Publish.publish(), Zope 2 + # does a 'Retry' if a 'Retry' exception happens and the + # request supports retry. It's not clear how this will be + # handled by Zope 3. Property changes on: Zope/branches/publication-refactor/lib/python/ZPublisher/Publication.py ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native Modified: Zope/branches/publication-refactor/lib/python/ZPublisher/Publish.py =================================================================== --- Zope/branches/publication-refactor/lib/python/ZPublisher/Publish.py 2005-12-12 17:59:17 UTC (rev 40741) +++ Zope/branches/publication-refactor/lib/python/ZPublisher/Publish.py 2005-12-12 18:10:07 UTC (rev 40742) @@ -80,6 +80,7 @@ # First check for "cancel" redirect: if request_get('SUBMIT','').strip().lower()=='cancel': + # XXX Deprecate this, the Zope 2+3 publisher won't support it. cancel=request_get('CANCEL_ACTION','') if cancel: raise Redirect, cancel _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins