Commit 2aa5f2cc authored by 's avatar

- fixed handling of errors in 'traverseName'

parent 1404f1da
......@@ -26,6 +26,7 @@ from zope.event import notify
from zope.publisher.defaultview import queryDefaultViewName
from zope.publisher.interfaces import EndRequestEvent
from zope.publisher.interfaces import IPublishTraverse
from zope.publisher.interfaces import NotFound as ztkNotFound
from zope.publisher.interfaces.browser import IBrowserPublisher
from zope.traversing.interfaces import TraversalError
from zope.traversing.namespace import nsParse, namespaceLookup
......@@ -312,7 +313,7 @@ class BaseRequest:
__repr__=__str__
# Original version: see zope.traversing.publicationtraverse
def traverseName(self, ob, name):
if name and name[:1] in '@+':
# Process URI segment parameters.
......@@ -321,7 +322,7 @@ class BaseRequest:
try:
ob2 = namespaceLookup(ns, nm, ob, self)
except TraversalError:
raise KeyError(ob, name)
raise ztkNotFound(ob, name)
if IAcquirer.providedBy(ob2):
ob2 = ob2.__of__(ob)
......@@ -343,7 +344,6 @@ class BaseRequest:
return ob2
def traverse(self, path, response=None, validated_hook=None):
"""Traverse the object space
......@@ -506,7 +506,8 @@ class BaseRequest:
object, check_name, subobject,
self.roles)
object = subobject
except (KeyError, AttributeError):
# traverseName() might raise ZTK's NotFound
except (KeyError, AttributeError, ztkNotFound):
if response.debug_mode:
return response.debugError(
"Cannot locate object at: %s" % URL)
......@@ -517,7 +518,6 @@ class BaseRequest:
return response.debugError(e.args)
else:
return response.forbiddenError(entry_name)
parents.append(object)
......
import unittest
from zope.interface import implements
from zope.publisher.interfaces import IPublishTraverse
from zope.publisher.interfaces import NotFound as ztkNotFound
class DummyTraverser(object):
implements(IPublishTraverse)
def publishTraverse(self, request, name):
if name == 'dummy':
return 'dummy object'
raise ztkNotFound(self, name)
class BaseRequest_factory:
def _makeOne(self, root):
......@@ -138,6 +153,7 @@ class BaseRequest_factory:
return 'unpublishable'
return DummyObjectWithEmptyDocstring()
class TestBaseRequest(unittest.TestCase, BaseRequest_factory):
def _getTargetClass(self):
......@@ -372,12 +388,18 @@ class TestBaseRequest(unittest.TestCase, BaseRequest_factory):
def test_traverse_unsubscriptable(self):
# See https://bugs.launchpad.net/bugs/213311
from ZPublisher import NotFound
class _Object(object):
pass
root = _Object()
r = self._makeOne(None)
self.assertRaises(NotFound, r.traverse, 'not_found')
def test_traverse_publishTraverse(self):
r = self._makeOne(DummyTraverser())
self.assertEqual(r.traverse('dummy'), 'dummy object')
def test_traverse_publishTraverse_error(self):
from ZPublisher import NotFound
r = self._makeOne(DummyTraverser())
self.assertRaises(NotFound, r.traverse, 'not_found')
class TestBaseRequestZope3Views(unittest.TestCase, BaseRequest_factory):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment