[Zope-Checkins] CVS: Zope3/lib/python/Zope/App/ZopePublication - ZopePublication.py:1.1.2.1 __init__.py:1.1.2.1

Shane Hathaway shane@digicool.com
Thu, 15 Nov 2001 18:11:49 -0500


Update of /cvs-repository/Zope3/lib/python/Zope/App/ZopePublication
In directory cvs.zope.org:/tmp/cvs-serv16980/ZopePublication

Added Files:
      Tag: Zope-3x-branch
	ZopePublication.py __init__.py 
Log Message:
Rough ZopePublication implementation


=== Added File Zope3/lib/python/Zope/App/ZopePublication/ZopePublication.py ===


import sys

from ZODB.POSException import ConflictError
from zLOG import LOG, ERROR, INFO

from Zope.Publisher.DefaultPublication import DefaultPublication
from Zope.Publisher.mapply import mapply
from Zope.Publisher.Exceptions import Retry


class RequestContainer:
    # TODO: add security assertion declaring access to REQUEST

    def __init__(self, request):
        self.REQUEST = request


class ZopePublication (DefaultPublication):
    """
    Zope publication specification.
    """

    version_cookie = 'Zope-Version'
    root_name = 'Application'

    def __init__(self, db, ptype):
        # db is a ZODB.DB.DB object.
        # ptype is a subinterface of IPublish.
        self.db = db
        self.ptype = ptype

    def beforeTraversal(self, request):
        get_transaction().begin()

    def openedConnection(self, conn):
        # Hook for auto-refresh
        pass

    def getApplication(self, request):
        version = request.get(self.version_cookie, '')
        conn = self.db.open(version)

        cleanup = Cleanup(conn.close)
        request._hold(cleanup)  # Close the connection on request.close()

        self.openedConnection(conn)
        conn.setDebugInfo(getattr(request, 'environ', None), request.other)

        v = conn.root()[self.root_name]

        if hasattr(v, '__of__'):
            v = v.__of__(RequestContainer(request))

        return v

    def invokeHooks(self, request, ob):
        # Call __before_publishing_traverse__ hooks
        pass

    def traverseName(self, request, ob, name, check_auth=1):
        if name[:1] == '_':
            raise Unauthorized("Name %s begins with an underscore" % `name`)
        if hasattr(ob, name):
            subob = getattr(ob, name)
        else:
            try:
                subob = ob[name]
            except (KeyError, IndexError,
                    TypeError, AttributeError):
                raise NotFound(ob, name, request.getURL())
        if not getattr(subob, '__doc__', None):
            raise DebugError(subob, 'Missing or empty doc string at: %s' %
                             request.getURL())
        return subob

    def getDefaultTraversal(self, request, ob):
        return ob, None

    def afterTraversal(self, request, ob):
        #recordMetaData(object, request)
        pass

    def callObject(self, request, ob):
        return mapply(ob, request.args, request)

    def afterCall(self, request):
        get_transaction().commit()

    def handleException(self, request, exc_info, retry_allowed=1):
        # Abort the transaction.
        get_transaction().abort()

        t, v = exc_info[:2]

        # Look for a component to handle the exception.
        traversed = request.traversed
        if traversed:
            context = traversed[-1]
            handler = getExceptionHandler(context, t, self.ptype)
            if handler is not None:
                handler(request, exc_info)
                return request.response

        # Handle special exception types.
        if isinstance(t, ClassType):
            if retry_allowed and issubclass(t, ConflictError):
                LOG('Zope Publication', INFO,
                    'Competing writes at %s' % request.get('PATH_INFO', '???'),
                    error=sys.exc_info())
                raise Retry

        # Let the response handle it as best it can.
        response = request.response
        response.handleException(exc)
        return response




=== Added File Zope3/lib/python/Zope/App/ZopePublication/__init__.py ===
"""
Zope publication package.
"""