Mercurial > p > roundup > code
annotate roundup/cgi/cgitb.py @ 3909:e89bcb28f683
indexargs_url force ids to int
ids appear as hyperdb.String instances, which confused indexargs_url when they
appear in the filterspec. They need to be treated as treated as integers when
generating URLs.
It feels sort of hacky to check for 'id' like this but I'm at a loss for what
else to do in this case. Suggestions are welcome :)
Maybe we should look into using some other hyperdb class to represent ids?
this fixes [SF#783492]
Some trailing whitespace also got trimmed.
| author | Justus Pendleton <jpend@users.sourceforge.net> |
|---|---|
| date | Tue, 18 Sep 2007 16:59:42 +0000 |
| parents | 7500a9bb8bf9 |
| children | b1e614c6759f |
| 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 # |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
4 # $Id: cgitb.py,v 1.12 2004-07-13 10:18:00 a1s Exp $ |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
5 |
|
2005
fc52d57c6c3e
documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents:
1947
diff
changeset
|
6 """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
|
7 """ |
|
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 |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
10 import sys, os, types, string, keyword, linecache, tokenize, inspect, cgi |
|
1079
04b44df7af1d
removed some property name clashes
Richard Jones <richard@users.sourceforge.net>
parents:
1066
diff
changeset
|
11 import pydoc, traceback |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
12 |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
13 from roundup.cgi import templating, TranslationService |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
14 |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
15 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
|
16 """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
|
17 |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
18 Parameters: |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
19 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
|
20 or TranslationService object. |
|
2426
cafdf8b7cc69
use templating translation service instead of commandline-oriented gettext()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2005
diff
changeset
|
21 |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
22 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
|
23 (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
|
24 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
|
25 TranslationService. |
|
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 """ |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
28 try: |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
29 return i18n.gettext |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
30 except: |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
31 return TranslationService.get_translation().gettext |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
32 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
33 def breaker(): |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
34 return ('<body bgcolor="white">' + |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
35 '<font color="white" size="-5"> > </font> ' + |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
36 '</table>' * 5) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
37 |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
38 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
|
39 l = [] |
|
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
40 for k,v in dict.items(): |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
41 l.append('<tr><td><strong>%s</strong></td><td>%s</td></tr>'%(k, |
|
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
42 cgi.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
|
43 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
|
44 |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
45 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
|
46 _ = get_translator(i18n) |
|
1396
cce5b4309005
extra info in template error report
Richard Jones <richard@users.sourceforge.net>
parents:
1204
diff
changeset
|
47 esc = cgi.escape |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
48 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
|
49 l = [_('<h1>Templating Error</h1>\n' |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
50 '<p><b>%(exc_type)s</b>: %(exc_value)s</p>\n' |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
51 '<p class="help">Debugging information follows</p>' |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
52 ) % {'exc_type': exc_info[0], 'exc_value': exc_info[1]}, |
|
1396
cce5b4309005
extra info in template error report
Richard Jones <richard@users.sourceforge.net>
parents:
1204
diff
changeset
|
53 '<ol>',] |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
54 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
|
55 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
|
56 t.reverse() |
|
b862bbf2067a
Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents:
1136
diff
changeset
|
57 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
|
58 args, varargs, varkw, locals = inspect.getargvalues(frame) |
|
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
59 if locals.has_key('__traceback_info__'): |
|
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
60 ti = locals['__traceback_info__'] |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
61 if isinstance(ti, TraversalError): |
|
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
62 s = [] |
|
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
63 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
|
64 s.append(_('<li>"%(name)s" (%(info)s)</li>') |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
65 % {'name': name, 'info': esc(repr(info))}) |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
66 s = '\n'.join(s) |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
67 l.append(_('<li>Looking for "%(name)s", ' |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
68 'current path:<ol>%(path)s</ol></li>' |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
69 ) % {'name': ti.name, 'path': s}) |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
70 else: |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
71 l.append(_('<li>In %s</li>') % esc(str(ti))) |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
72 if locals.has_key('__traceback_supplement__'): |
|
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
73 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
|
74 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
|
75 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
|
76 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
|
77 % 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
|
78 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
|
79 s = s + '<br>' + '<br>'.join( |
|
1396
cce5b4309005
extra info in template error report
Richard Jones <richard@users.sourceforge.net>
parents:
1204
diff
changeset
|
80 [esc(x) for x in context._v_errors]) |
|
1204
b862bbf2067a
Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents:
1136
diff
changeset
|
81 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
|
82 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
|
83 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
|
84 l.append(_(''' |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
85 <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
|
86 <table class="otherinfo" style="font-size: 90%%"> |
|
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
87 <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
|
88 %(globals)s |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
89 %(locals)s |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
90 </table></li> |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
91 ''') % { |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
92 'info': info, |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
93 '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
|
94 '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
|
95 'locals': niceDict(' ', context.local_vars) |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
96 }) |
|
1079
04b44df7af1d
removed some property name clashes
Richard Jones <richard@users.sourceforge.net>
parents:
1066
diff
changeset
|
97 |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
98 l.append(''' |
|
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
99 </ol> |
|
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
100 <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
|
101 <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
|
102 <tr><td><pre>%s</pre></td></tr> |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
103 </table>''' % (_('Full traceback:'), cgi.escape(''.join( |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
104 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
|
105 )))) |
|
1136
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
106 l.append('<p> </p>') |
|
7e193bbda38e
added generic item editing
Richard Jones <richard@users.sourceforge.net>
parents:
1092
diff
changeset
|
107 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
|
108 |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
109 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
|
110 _ = get_translator(i18n) |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
111 etype, evalue = sys.exc_type, sys.exc_value |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
112 if type(etype) is types.ClassType: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
113 etype = etype.__name__ |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
114 pyver = 'Python ' + string.split(sys.version)[0] + '<br>' + sys.executable |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
115 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
|
116 _('<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
|
117 % {'exc_type': etype, 'exc_value': evalue}, |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
118 '#ffffff', '#777777', pyver) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
119 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
120 head = head + (_('<p>A problem occurred while running a Python script. ' |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
121 'Here is the sequence of function calls leading up to ' |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
122 'the error, with the most recent (innermost) call first. ' |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
123 'The exception attributes are:')) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
124 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
125 indent = '<tt><small>%s</small> </tt>' % (' ' * 5) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
126 traceback = [] |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
127 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
|
128 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
|
129 link = _("<file is None - probably inside <tt>eval</tt> " |
|
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
130 "or <tt>exec</tt>>") |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
131 else: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
132 file = os.path.abspath(file) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
133 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
|
134 args, varargs, varkw, locals = inspect.getargvalues(frame) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
135 if func == '?': |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
136 call = '' |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
137 else: |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
138 call = _('in <strong>%s</strong>') % func + inspect.formatargvalues( |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
139 args, varargs, varkw, locals, |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
140 formatvalue=lambda value: '=' + pydoc.html.repr(value)) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
141 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
142 level = ''' |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
143 <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
|
144 <tr><td>%s %s</td></tr></table>''' % (link, call) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
145 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
146 if index is None or file is None: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
147 traceback.append('<p>' + level) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
148 continue |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
149 |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
150 # do a file inspection |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
151 names = [] |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
152 def tokeneater(type, token, start, end, line, names=names): |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
153 if type == tokenize.NAME and token not in keyword.kwlist: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
154 if token not in names: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
155 names.append(token) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
156 if type == tokenize.NEWLINE: raise IndexError |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
157 def linereader(file=file, lnum=[lnum]): |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
158 line = linecache.getline(file, lnum[0]) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
159 lnum[0] = lnum[0] + 1 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
160 return line |
|
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 try: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
163 tokenize.tokenize(linereader, tokeneater) |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
164 except IndexError: |
|
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
165 pass |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
166 lvals = [] |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
167 for name in names: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
168 if name in frame.f_code.co_varnames: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
169 if locals.has_key(name): |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
170 value = pydoc.html.repr(locals[name]) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
171 else: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
172 value = _('<em>undefined</em>') |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
173 name = '<strong>%s</strong>' % name |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
174 else: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
175 if frame.f_globals.has_key(name): |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
176 value = pydoc.html.repr(frame.f_globals[name]) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
177 else: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
178 value = _('<em>undefined</em>') |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
179 name = '<em>global</em> <strong>%s</strong>' % name |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
180 lvals.append('%s = %s'%(name, value)) |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
181 if lvals: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
182 lvals = string.join(lvals, ', ') |
|
1065
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
183 lvals = indent + '<small><font color="#909090">%s'\ |
|
0f9aa62917bd
much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents:
985
diff
changeset
|
184 '</font></small><br>'%lvals |
|
985
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
185 else: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
186 lvals = '' |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
187 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
188 excerpt = [] |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
189 i = lnum - index |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
190 for line in lines: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
191 number = ' ' * (5-len(str(i))) + str(i) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
192 number = '<small><font color="#909090">%s</font></small>' % number |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
193 line = '<tt>%s %s</tt>' % (number, pydoc.html.preformat(line)) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
194 if i == lnum: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
195 line = ''' |
|
1947
0e19e99075e3
fix #white in cgitb
Richard Jones <richard@users.sourceforge.net>
parents:
1396
diff
changeset
|
196 <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
|
197 <tr><td>%s</td></tr></table>''' % line |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
198 excerpt.append('\n' + line) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
199 if i == lnum: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
200 excerpt.append(lvals) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
201 i = i + 1 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
202 traceback.append('<p>' + level + string.join(excerpt, '\n')) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
203 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
204 traceback.reverse() |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
205 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
206 exception = '<p><strong>%s</strong>: %s' % (str(etype), str(evalue)) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
207 attribs = [] |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
208 if type(evalue) is types.InstanceType: |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
209 for name in dir(evalue): |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
210 value = pydoc.html.repr(getattr(evalue, name)) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
211 attribs.append('<br>%s%s = %s' % (indent, name, value)) |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
212 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
213 return head + string.join(attribs) + string.join(traceback) + '<p> </p>' |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
214 |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
215 def handler(): |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
216 print breaker() |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
217 print html() |
|
55ab0c5b49f9
New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
218 |
|
2564
7500a9bb8bf9
message translator is passed by the client in function arguments;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2426
diff
changeset
|
219 # vim: set filetype=python ts=4 sw=4 et si : |
