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
- LP #142478: normalize terms passed to ``PLexicon.queryLexicon`` using
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)
-------------------
......
......@@ -20,6 +20,7 @@ from Acquisition import aq_acquire
from Acquisition import aq_base
from Acquisition import aq_inner
from Acquisition import aq_parent
from Acquisition.interfaces import IAcquirer
from App.config import getConfiguration
from time import asctime
from types import StringType, ListType
......@@ -208,6 +209,8 @@ class ZPublisherExceptionHook:
# Zope 3 uses as well.
view = queryMultiAdapter((v, REQUEST), name=u'index.html')
if view is not None:
if IAcquirer.providedBy(published):
view = view.__of__(published)
v = view()
response = REQUEST.RESPONSE
response.setStatus(t)
......
......@@ -16,6 +16,7 @@ import sys
import unittest
import logging
import Acquisition
from zope.component.testing import PlacelessSetup
from zope.interface.common.interfaces import IException
from zope.publisher.skinnable import setDefaultSkin
......@@ -215,7 +216,7 @@ class ExceptionHookTest(ExceptionHookTestCase):
self.call_no_exc(hook, None, None, f)
self.assertEquals(hook.unresolved_conflict_errors, 2)
class Client:
class Client(Acquisition.Explicit):
def __init__(self):
self.standard_error_message = True
......@@ -320,14 +321,16 @@ class ExceptionMessageRenderTest(ExceptionHookTestCase):
tb = client.messages[0]
self.failUnless("ConflictError: database conflict error" in tb, tb)
class CustomExceptionView:
class CustomExceptionView(Acquisition.Explicit):
def __init__(self, context, request):
self.context = context
self.request = request
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_):
from zope.interface import Interface
......@@ -355,6 +358,7 @@ class ExceptionViewsTest(PlacelessSetup, ExceptionHookTestCase):
self.failUnless(isinstance(v, HTTPResponse), v)
self.failUnless(v.status == 401, (v.status, 401))
self.failUnless("Exception View: Unauthorized" in str(v))
self.failUnless("Context: StandardClient" in str(v))
def testCustomExceptionViewForbidden(self):
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