annotate roundup/cgi/cgitb.py @ 7658:d30e534b078a

clarify doc on dispatcher_email config setting. An issue was brought up on the mailing list. https://sourceforge.net/p/roundup/mailman/message/43383465/ The description of dispatcher_email sounds like it should be sent email on issue creation. That's not it's role. Try to make it's role more obvious. Fix config.ini and reference.txt description. Add the newissuecopy.py detector to send email on the creation of an issue
author John Rouillard <rouilj@ieee.org>
date Tue, 10 Oct 2023 20:33:22 -0400
parents 57f34b0b912c
children 6c5f8da9fca7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 #
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 # This module was written by Ka-Ping Yee, <ping@lfw.org>.
2426
cafdf8b7cc69 use templating translation service instead of commandline-oriented gettext()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2005
diff changeset
3 #
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1947
diff changeset
5 """Extended CGI traceback handler by Ka-Ping Yee, <ping@lfw.org>.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 """
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4570
diff changeset
7 from __future__ import print_function
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1947
diff changeset
8 __docformat__ = 'restructuredtext'
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
10 import inspect
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
11 import keyword
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
12 import linecache
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
13 import os
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
14 import pydoc
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
15 import sys
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
16 import tokenize
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
17 import traceback
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18
5837
883c9e90b403 Fix problem with cgi.escape being depricated a different way. This way
John Rouillard <rouilj@ieee.org>
parents: 5800
diff changeset
19 from roundup.anypy.html import html_escape
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
20 from roundup.anypy.strings import s2b
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
21 from roundup.cgi import TranslationService
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
22
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
23
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
24 def get_translator(i18n=None):
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
25 """Return message translation function (gettext)
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
26
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
27 Parameters:
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
28 i18n - translation service, such as roundup.i18n module
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
29 or TranslationService object.
2426
cafdf8b7cc69 use templating translation service instead of commandline-oriented gettext()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2005
diff changeset
30
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
31 Return ``gettext`` attribute of the ``i18n`` object, if available
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
32 (must be a message translation function with one argument).
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
33 If ``gettext`` cannot be obtained from ``i18n``, take default
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
34 TranslationService.
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
35
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
36 """
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
37 try:
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
38 return i18n.gettext
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
39 except AttributeError:
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
40 return TranslationService.get_translation().gettext
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
42
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 def breaker():
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 return ('<body bgcolor="white">' +
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 '<font color="white" size="-5"> > </font> ' +
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 '</table>' * 5)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
48
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
49 def niceDict(indent, dict):
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
50 l = []
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
51 for k in sorted(dict):
4264
b1e614c6759f Improve error reporting.
Stefan Seefeld <stefan@seefeld.name>
parents: 2564
diff changeset
52 v = dict[k]
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
53 l.append('<tr><td><strong>%s</strong></td><td>%s</td></tr>' % (
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
54 k, html_escape(repr(v))))
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
55 return '\n'.join(l)
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
56
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
57
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
58 def pt_html(context=5, i18n=None):
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
59 _ = get_translator(i18n)
5800
1a835db41674 Call cgi.escape only on python 2. Replace with html.escapeif it can be
John Rouillard <rouilj@ieee.org>
parents: 5436
diff changeset
60 esc = html_escape
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
61 exc_info = [esc(str(value)) for value in sys.exc_info()[:2]]
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
62 l = [_('<h1>Templating Error</h1>\n'
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
63 '<p><b>%(exc_type)s</b>: %(exc_value)s</p>\n'
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
64 '<p class="help">Debugging information follows</p>'
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
65 ) % {'exc_type': exc_info[0], 'exc_value': exc_info[1]},
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
66 '<ol>', ]
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
67 from roundup.cgi.PageTemplates.Expressions import TraversalError
1204
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1136
diff changeset
68 t = inspect.trace(context)
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1136
diff changeset
69 t.reverse()
7300
57f34b0b912c flake8 fixes
John Rouillard <rouilj@ieee.org>
parents: 6983
diff changeset
70 for frame, _file, _lnum, _func, _lines, _index in t:
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
71 args, varargs, varkw, locals = inspect.getargvalues(frame)
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
72 if '__traceback_info__' in locals:
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
73 ti = locals['__traceback_info__']
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
74 if isinstance(ti, TraversalError):
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
75 s = []
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
76 for name, info in ti.path:
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
77 s.append(_('<li>"%(name)s" (%(info)s)</li>')
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
78 % {'name': name, 'info': esc(repr(info))})
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
79 s = '\n'.join(s)
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
80 l.append(_(
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
81 '<li>Looking for "%(name)s", '
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
82 'current path:<ol>%(path)s</ol></li>'
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
83 ) % {'name': ti.name, 'path': s})
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
84 else:
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
85 l.append(_('<li>In %s</li>') % esc(str(ti)))
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
86 if '__traceback_supplement__' in locals:
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
87 ts = locals['__traceback_supplement__']
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
88 if len(ts) == 2:
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
89 supp, context = ts
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
90 s = _('A problem occurred in your template "%s".') \
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
91 % str(context.id)
1204
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1136
diff changeset
92 if context._v_errors:
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1136
diff changeset
93 s = s + '<br>' + '<br>'.join(
1396
cce5b4309005 extra info in template error report
Richard Jones <richard@users.sourceforge.net>
parents: 1204
diff changeset
94 [esc(x) for x in context._v_errors])
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
95 l.append('<li>%s</li>' % s)
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
96 elif len(ts) == 3:
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
97 supp, context, info = ts
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
98 l.append(_('''
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
99 <li>While evaluating the %(info)r expression on line %(line)d
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
100 <table class="otherinfo" style="font-size: 90%%">
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
101 <tr><th colspan="2" class="header">Current variables:</th></tr>
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
102 %(globals)s
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
103 %(locals)s
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
104 </table></li>
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
105 ''') % {
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
106 'info': info,
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
107 'line': context.position[0],
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
108 'globals': niceDict(' ', context.global_vars),
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
109 'locals': niceDict(' ', context.local_vars)
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
110 })
1079
04b44df7af1d removed some property name clashes
Richard Jones <richard@users.sourceforge.net>
parents: 1066
diff changeset
111
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
112 l.append('''
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
113 </ol>
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
114 <table style="font-size: 80%%; color: gray">
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
115 <tr><th class="header" align="left">%s</th></tr>
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
116 <tr><td><pre>%s</pre></td></tr>
5800
1a835db41674 Call cgi.escape only on python 2. Replace with html.escapeif it can be
John Rouillard <rouilj@ieee.org>
parents: 5436
diff changeset
117 </table>''' % (_('Full traceback:'), html_escape(''.join(
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
118 traceback.format_exception(*sys.exc_info())
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
119 ))))
1136
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
120 l.append('<p>&nbsp;</p>')
7e193bbda38e added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents: 1092
diff changeset
121 return '\n'.join(l)
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
122
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
123
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
124 def html(context=5, i18n=None):
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
125 _ = get_translator(i18n)
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
126 etype, evalue = sys.exc_info()[0], sys.exc_info()[1]
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
127 if type(etype) is type:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128 etype = etype.__name__
5433
86b6cea7a975 Python 3 preparation: avoid string.split().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5420
diff changeset
129 pyver = 'Python ' + sys.version.split()[0] + '<br>' + sys.executable
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 head = pydoc.html.heading(
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
131 _('<font size=+1><strong>%(exc_type)s</strong>: %(exc_value)s</font>')
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
132 % {'exc_type': etype, 'exc_value': evalue},
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133 '#ffffff', '#777777', pyver)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
135 head = head + (_('<p>A problem occurred while running a Python script. '
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
136 'Here is the sequence of function calls leading up to '
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
137 'the error, with the most recent (innermost) call first. '
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
138 'The exception attributes are:'))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
139
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140 indent = '<tt><small>%s</small>&nbsp;</tt>' % ('&nbsp;' * 5)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141 traceback = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142 for frame, file, lnum, func, lines, index in inspect.trace(context):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 if file is None:
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
144 link = _("&lt;file is None - probably inside <tt>eval</tt> "
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
145 "or <tt>exec</tt>&gt;")
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
146 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
147 file = os.path.abspath(file)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
148 link = '<a href="file:%s">%s</a>' % (file, pydoc.html.escape(file))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
149 args, varargs, varkw, locals = inspect.getargvalues(frame)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
150 if func == '?':
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
151 call = ''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
152 else:
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
153 call = _('in <strong>%s</strong>') % \
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
154 func + inspect.formatargvalues(
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
155 args, varargs, varkw, locals,
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
156 formatvalue=lambda value: '=' + pydoc.html.repr(value))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
157
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158 level = '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
159 <table width="100%%" bgcolor="#dddddd" cellspacing=0 cellpadding=2 border=0>
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
160 <tr><td>%s %s</td></tr></table>''' % (link, call)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
161
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162 if index is None or file is None:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
163 traceback.append('<p>' + level)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
164 continue
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
165
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
166 # do a file inspection
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
167 names = []
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
168
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
169 def tokeneater(type, token, start, end, line, names=names):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
170 if type == tokenize.NAME and token not in keyword.kwlist:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
171 if token not in names:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172 names.append(token)
6983
3129d73e8535 flake8 plus tests for cgitb.py
John Rouillard <rouilj@ieee.org>
parents: 6201
diff changeset
173 if type == tokenize.NEWLINE: raise IndexError # noqa: E701
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
174
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175 def linereader(file=file, lnum=[lnum]):
5436
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
176 line = s2b(linecache.getline(file, lnum[0]))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
177 lnum[0] = lnum[0] + 1
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178 return line
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
179
5436
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
180 # The interface that is tokenize.tokenize in Python 3 is
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
181 # called tokenize.generate_tokens in Python 2. However,
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
182 # Python 2 has tokenize.tokenize with a different interface,
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
183 # and Python 3 has an undocumented generate_tokens function,
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
184 # also with a different interface, so a version check is
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
185 # needed instead of checking for which functions exist.
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
186 if sys.version_info[0] > 2:
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
187 tokenize_fn = tokenize.tokenize
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
188 else:
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
189 tokenize_fn = tokenize.generate_tokens
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
190 try:
5436
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
191 for t in tokenize_fn(linereader):
e70fe1d1215b Python 3 preparation: update tokenize use in cgitb.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5434
diff changeset
192 tokeneater(*t)
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
193 except IndexError:
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
194 pass
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
195 lvals = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
196 for name in names:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
197 if name in frame.f_code.co_varnames:
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
198 if name in locals:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
199 value = pydoc.html.repr(locals[name])
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
200 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
201 value = _('<em>undefined</em>')
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
202 name = '<strong>%s</strong>' % name
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
203 else:
4362
74476eaac38a more modernisation
Richard Jones <richard@users.sourceforge.net>
parents: 4264
diff changeset
204 if name in frame.f_globals:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205 value = pydoc.html.repr(frame.f_globals[name])
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
207 value = _('<em>undefined</em>')
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
208 name = '<em>global</em> <strong>%s</strong>' % name
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
209 lvals.append('%s&nbsp;= %s' % (name, value))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210 if lvals:
5434
1ab2c81a64df Python 3 preparation: avoid string.join().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5433
diff changeset
211 lvals = ', '.join(lvals)
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
212 lvals = indent + '<small><font color="#909090">%s'\
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
213 '</font></small><br>' % lvals
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
214 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
215 lvals = ''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
216
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
217 excerpt = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
218 i = lnum - index
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
219 for line in lines:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
220 number = '&nbsp;' * (5-len(str(i))) + str(i)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
221 number = '<small><font color="#909090">%s</font></small>' % number
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
222 line = '<tt>%s&nbsp;%s</tt>' % (number, pydoc.html.preformat(line))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
223 if i == lnum:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
224 line = '''
1947
0e19e99075e3 fix #white in cgitb
Richard Jones <richard@users.sourceforge.net>
parents: 1396
diff changeset
225 <table width="100%%" bgcolor="white" cellspacing=0 cellpadding=0 border=0>
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
226 <tr><td>%s</td></tr></table>''' % line
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
227 excerpt.append('\n' + line)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
228 if i == lnum:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
229 excerpt.append(lvals)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
230 i = i + 1
5434
1ab2c81a64df Python 3 preparation: avoid string.join().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5433
diff changeset
231 traceback.append('<p>' + level + '\n'.join(excerpt))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
232
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
233 traceback.reverse()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
234
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
235 exception = '<p><strong>%s</strong>: %s' % (str(etype), str(evalue))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
236 attribs = []
5420
7172c201dec2 Python 3 preparation: avoid obsolete types.*Type names.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
237 for name in dir(evalue):
7172c201dec2 Python 3 preparation: avoid obsolete types.*Type names.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
238 value = pydoc.html.repr(getattr(evalue, name))
7172c201dec2 Python 3 preparation: avoid obsolete types.*Type names.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
239 attribs.append('<br>%s%s&nbsp;= %s' % (indent, name, value))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240
5434
1ab2c81a64df Python 3 preparation: avoid string.join().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5433
diff changeset
241 return head + ' '.join(attribs) + ' '.join(traceback) + '<p>&nbsp;</p>'
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
242
6201
70e6b053193b pep8 fixes
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
243
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
244 def handler():
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4570
diff changeset
245 print(breaker())
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4570
diff changeset
246 print(html())
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
247
2564
7500a9bb8bf9 message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2426
diff changeset
248 # vim: set filetype=python ts=4 sw=4 et si :

Roundup Issue Tracker: http://roundup-tracker.org/