/
exceptions.py
57 lines (46 loc) · 1.97 KB
/
exceptions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from AccessControl import getSecurityManager
from plone.memoize.view import memoize
from Products.Five import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from zExceptions.ExceptionFormatter import format_exception
from zope.component import getMultiAdapter
import json
import sys
class ExceptionView(BrowserView):
basic_template = ViewPageTemplateFile("templates/basic_error_message.pt")
def is_manager(self):
return getSecurityManager().checkPermission("Manage portal", self.context)
@property
@memoize
def plone_redirector_view(self):
return getMultiAdapter(
(self.__parent__, self.request), name="plone_redirector_view"
)
def __call__(self):
exception = self.context
error_type = exception.__class__.__name__
if error_type == "NotFound" and self.plone_redirector_view.attempt_redirect():
# if a redirect is possible attempt_redirect returns True
# and sets the proper location header
return
self.context = self.__parent__
request = self.request
exc_type, value, traceback = sys.exc_info()
error_tb = "".join(format_exception(exc_type, value, traceback, as_html=False))
request.response.setStatus(exc_type)
# Indicate exception as JSON
if "text/html" not in request.getHeader("Accept", ""):
request.response.setHeader("Content-Type", "application/json")
return json.dumps(
{
"error_type": error_type,
}
)
# Render page with user-facing error notice
request.set("disable_border", True)
request.set("disable_plone.leftcolumn", True)
request.set("disable_plone.rightcolumn", True)
try:
return self.index(error_type=error_type, error_tb=error_tb)
except Exception:
return self.basic_template(error_type=error_type, error_tb=error_tb)