Commit 47168b89 authored by Wichert Akkerman's avatar Wichert Akkerman

Wrap exception views in the context of the published object.

parent 424231f9
...@@ -16,6 +16,7 @@ Bugs Fixed ...@@ -16,6 +16,7 @@ Bugs Fixed
- LP #142478: normalize terms passed to ``PLexicon.queryLexicon`` using - LP #142478: normalize terms passed to ``PLexicon.queryLexicon`` using
the lexicon's pipeline (e.g., case flattening, stop word removal, etc.) the lexicon's pipeline (e.g., case flattening, stop word removal, etc.)
- Wrap exception views in the context of the published object.
2.12.4 (2010-04-05) 2.12.4 (2010-04-05)
------------------- -------------------
......
...@@ -20,6 +20,7 @@ from Acquisition import aq_acquire ...@@ -20,6 +20,7 @@ from Acquisition import aq_acquire
from Acquisition import aq_base from Acquisition import aq_base
from Acquisition import aq_inner from Acquisition import aq_inner
from Acquisition import aq_parent from Acquisition import aq_parent
from Acquisition.interfaces import IAcquirer
from App.config import getConfiguration from App.config import getConfiguration
from time import asctime from time import asctime
from types import StringType, ListType from types import StringType, ListType
...@@ -208,6 +209,8 @@ class ZPublisherExceptionHook: ...@@ -208,6 +209,8 @@ class ZPublisherExceptionHook:
# Zope 3 uses as well. # Zope 3 uses as well.
view = queryMultiAdapter((v, REQUEST), name=u'index.html') view = queryMultiAdapter((v, REQUEST), name=u'index.html')
if view is not None: if view is not None:
if IAcquirer.providedBy(published):
view = view.__of__(published)
v = view() v = view()
response = REQUEST.RESPONSE response = REQUEST.RESPONSE
response.setStatus(t) response.setStatus(t)
......
...@@ -16,6 +16,7 @@ import sys ...@@ -16,6 +16,7 @@ import sys
import unittest import unittest
import logging import logging
import Acquisition
from zope.component.testing import PlacelessSetup from zope.component.testing import PlacelessSetup
from zope.interface.common.interfaces import IException from zope.interface.common.interfaces import IException
from zope.publisher.skinnable import setDefaultSkin from zope.publisher.skinnable import setDefaultSkin
...@@ -215,7 +216,7 @@ class ExceptionHookTest(ExceptionHookTestCase): ...@@ -215,7 +216,7 @@ class ExceptionHookTest(ExceptionHookTestCase):
self.call_no_exc(hook, None, None, f) self.call_no_exc(hook, None, None, f)
self.assertEquals(hook.unresolved_conflict_errors, 2) self.assertEquals(hook.unresolved_conflict_errors, 2)
class Client: class Client(Acquisition.Explicit):
def __init__(self): def __init__(self):
self.standard_error_message = True self.standard_error_message = True
...@@ -320,14 +321,16 @@ class ExceptionMessageRenderTest(ExceptionHookTestCase): ...@@ -320,14 +321,16 @@ class ExceptionMessageRenderTest(ExceptionHookTestCase):
tb = client.messages[0] tb = client.messages[0]
self.failUnless("ConflictError: database conflict error" in tb, tb) self.failUnless("ConflictError: database conflict error" in tb, tb)
class CustomExceptionView: class CustomExceptionView(Acquisition.Explicit):
def __init__(self, context, request): def __init__(self, context, request):
self.context = context self.context = context
self.request = request self.request = request
def __call__(self): def __call__(self):
return "Exception View: %s" % self.context.__class__.__name__ return "Exception View: %s\nContext: %s" % (
self.context.__class__.__name__,
Acquisition.aq_parent(self).__class__.__name__)
def registerExceptionView(for_): def registerExceptionView(for_):
from zope.interface import Interface from zope.interface import Interface
...@@ -355,6 +358,7 @@ class ExceptionViewsTest(PlacelessSetup, ExceptionHookTestCase): ...@@ -355,6 +358,7 @@ class ExceptionViewsTest(PlacelessSetup, ExceptionHookTestCase):
self.failUnless(isinstance(v, HTTPResponse), v) self.failUnless(isinstance(v, HTTPResponse), v)
self.failUnless(v.status == 401, (v.status, 401)) self.failUnless(v.status == 401, (v.status, 401))
self.failUnless("Exception View: Unauthorized" in str(v)) self.failUnless("Exception View: Unauthorized" in str(v))
self.failUnless("Context: StandardClient" in str(v))
def testCustomExceptionViewForbidden(self): def testCustomExceptionViewForbidden(self):
from ZPublisher.HTTPResponse import HTTPResponse from ZPublisher.HTTPResponse import HTTPResponse
......
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