diff --git a/src/OFS/browser/__init__.py b/src/OFS/browser/__init__.py index 1810a7ff79..3727bcca6c 100644 --- a/src/OFS/browser/__init__.py +++ b/src/OFS/browser/__init__.py @@ -11,24 +11,35 @@ # ############################################################################## +from Acquisition import aq_base from Acquisition import aq_parent from Products.Five import BrowserView +raiser = 'raise_standardErrorMessage' + + class StandardErrorMessageView(BrowserView): """ View rendered on SiteError. - Requires a DTML Method named ``standard_error_message`` + Requires a callable object named ``standard_error_message`` on the + published object's acquisition path. The callable can be a DTML Method, + DTML Document, Python Script or Page Template. """ def __call__(self): - published = getattr(self.request, 'PUBLISHED', None) - if published is not None: - root = aq_parent(published) - else: - root = self.request['PARENTS'][0] - - return root.standard_error_message( - client=root, + pub = getattr(self.request, 'PUBLISHED', self.request['PARENTS'][0]) + parent = aq_parent(pub) + + if pub is not None and parent is None: + # The published object is not an instance or not wrapped + pub = self.request['PARENTS'][0] + parent = aq_parent(pub) + + if getattr(aq_base(pub), raiser, None) is not None: + return getattr(pub, raiser)(REQUEST=self.request)[1] + + return parent.standard_error_message( + client=parent, error_type=self.context.__class__.__name__, error_value=str(self.context))