7 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses |
7 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses |
8 """ |
8 """ |
9 __docformat__ = "restructuredtext en" |
9 __docformat__ = "restructuredtext en" |
10 _ = unicode |
10 _ = unicode |
11 |
11 |
12 from logilab.mtconverter import html_escape |
12 from logilab.mtconverter import xml_escape |
13 |
13 |
14 from cubicweb.selectors import yes, none_rset, match_user_groups, authenticated_user |
14 from cubicweb.selectors import yes, none_rset, match_user_groups, authenticated_user |
15 from cubicweb.view import AnyRsetView, StartupView, EntityView |
15 from cubicweb.view import AnyRsetView, StartupView, EntityView |
16 from cubicweb.common.uilib import html_traceback, rest_traceback |
16 from cubicweb.common.uilib import html_traceback, rest_traceback |
17 from cubicweb.web import formwidgets as wdgs |
17 from cubicweb.web import formwidgets as wdgs |
82 entity = self.entity(row, col) |
82 entity = self.entity(row, col) |
83 w = self.w |
83 w = self.w |
84 _ = self.req._ |
84 _ = self.req._ |
85 w(u'<h1><span class="etype">%s</span> <a href="%s">%s</a></h1>' |
85 w(u'<h1><span class="etype">%s</span> <a href="%s">%s</a></h1>' |
86 % (entity.dc_type().capitalize(), |
86 % (entity.dc_type().capitalize(), |
87 html_escape(entity.absolute_url()), |
87 xml_escape(entity.absolute_url()), |
88 html_escape(entity.dc_title()))) |
88 xml_escape(entity.dc_title()))) |
89 # first show permissions defined by the schema |
89 # first show permissions defined by the schema |
90 self.w('<h2>%s</h2>' % _('schema\'s permissions definitions')) |
90 self.w('<h2>%s</h2>' % _('schema\'s permissions definitions')) |
91 self.schema_definition(entity.e_schema) |
91 self.schema_definition(entity.e_schema) |
92 self.w('<h2>%s</h2>' % _('manage security')) |
92 self.w('<h2>%s</h2>' % _('manage security')) |
93 # ownership information |
93 # ownership information |
139 delurl = delurl.replace('%', '%%') |
139 delurl = delurl.replace('%', '%%') |
140 # don't give __delete value to build_url else it will be urlquoted |
140 # don't give __delete value to build_url else it will be urlquoted |
141 # and this will replace %s by %25s |
141 # and this will replace %s by %25s |
142 delurl += '&__delete=%s:require_permission:%%s' % entity.eid |
142 delurl += '&__delete=%s:require_permission:%%s' % entity.eid |
143 dellinktempl = u'[<a href="%s" title="%s">-</a>] ' % ( |
143 dellinktempl = u'[<a href="%s" title="%s">-</a>] ' % ( |
144 html_escape(delurl), _('delete this permission')) |
144 xml_escape(delurl), _('delete this permission')) |
145 else: |
145 else: |
146 dellinktempl = None |
146 dellinktempl = None |
147 w(u'<table class="schemaInfo">') |
147 w(u'<table class="schemaInfo">') |
148 w(u'<tr><th>%s</th><th>%s</th></tr>' % (_("permission"), |
148 w(u'<tr><th>%s</th><th>%s</th></tr>' % (_("permission"), |
149 _('granted to groups'))) |
149 _('granted to groups'))) |
216 exclass = ex.__class__.__name__ |
216 exclass = ex.__class__.__name__ |
217 ex = exc_message(ex, req.encoding) |
217 ex = exc_message(ex, req.encoding) |
218 if excinfo is not None and self.config['print-traceback']: |
218 if excinfo is not None and self.config['print-traceback']: |
219 if exclass is None: |
219 if exclass is None: |
220 w(u'<div class="tb">%s</div>' |
220 w(u'<div class="tb">%s</div>' |
221 % html_escape(ex).replace("\n","<br />")) |
221 % xml_escape(ex).replace("\n","<br />")) |
222 else: |
222 else: |
223 w(u'<div class="tb">%s: %s</div>' |
223 w(u'<div class="tb">%s: %s</div>' |
224 % (exclass, html_escape(ex).replace("\n","<br />"))) |
224 % (exclass, xml_escape(ex).replace("\n","<br />"))) |
225 w(u'<hr />') |
225 w(u'<hr />') |
226 w(u'<div class="tb">%s</div>' % html_traceback(excinfo, ex, '')) |
226 w(u'<div class="tb">%s</div>' % html_traceback(excinfo, ex, '')) |
227 else: |
227 else: |
228 w(u'<div class="tb">%s</div>' % (html_escape(ex).replace("\n","<br />"))) |
228 w(u'<div class="tb">%s</div>' % (xml_escape(ex).replace("\n","<br />"))) |
229 # if excinfo is not None, it's probably not a bug |
229 # if excinfo is not None, it's probably not a bug |
230 if excinfo is None: |
230 if excinfo is None: |
231 return |
231 return |
232 vcconf = self.config.vc_config() |
232 vcconf = self.config.vc_config() |
233 w(u"<div>") |
233 w(u"<div>") |
270 return unicode(str(ex), encoding, 'replace') |
270 return unicode(str(ex), encoding, 'replace') |
271 except: |
271 except: |
272 return unicode(repr(ex), encoding, 'replace') |
272 return unicode(repr(ex), encoding, 'replace') |
273 |
273 |
274 def text_error_description(ex, excinfo, req, eversion, cubes): |
274 def text_error_description(ex, excinfo, req, eversion, cubes): |
275 binfo = rest_traceback(excinfo, html_escape(ex)) |
275 binfo = rest_traceback(excinfo, xml_escape(ex)) |
276 binfo += u'\n\n:URL: %s\n' % req.url() |
276 binfo += u'\n\n:URL: %s\n' % req.url() |
277 if not '__bugreporting' in req.form: |
277 if not '__bugreporting' in req.form: |
278 binfo += u'\n:form params:\n' |
278 binfo += u'\n:form params:\n' |
279 binfo += u'\n'.join(u' * %s = %s' % (k, v) for k, v in req.form.iteritems()) |
279 binfo += u'\n'.join(u' * %s = %s' % (k, v) for k, v in req.form.iteritems()) |
280 binfo += u'\n\n:CubicWeb version: %s\n' % (eversion,) |
280 binfo += u'\n\n:CubicWeb version: %s\n' % (eversion,) |
320 return |
320 return |
321 self.w(u'<h3>%s</h3>' % _('Environment')) |
321 self.w(u'<h3>%s</h3>' % _('Environment')) |
322 self.w(u'<table border="1">') |
322 self.w(u'<table border="1">') |
323 for attr in env.keys(): |
323 for attr in env.keys(): |
324 self.w(u'<tr><th align="left">%s</th><td>%s</td></tr>' |
324 self.w(u'<tr><th align="left">%s</th><td>%s</td></tr>' |
325 % (attr, html_escape(env[attr]))) |
325 % (attr, xml_escape(env[attr]))) |
326 self.w(u'</table>') |
326 self.w(u'</table>') |
327 self.w(u'<h3>%s</h3>' % _('Request')) |
327 self.w(u'<h3>%s</h3>' % _('Request')) |
328 self.w(u'<table border="1">') |
328 self.w(u'<table border="1">') |
329 for attr in ('filename', 'form', 'hostname', 'main', 'method', |
329 for attr in ('filename', 'form', 'hostname', 'main', 'method', |
330 'path_info', 'protocol', |
330 'path_info', 'protocol', |
331 'search_state', 'the_request', 'unparsed_uri', 'uri'): |
331 'search_state', 'the_request', 'unparsed_uri', 'uri'): |
332 val = getattr(req, attr) |
332 val = getattr(req, attr) |
333 self.w(u'<tr><th align="left">%s</th><td>%s</td></tr>' |
333 self.w(u'<tr><th align="left">%s</th><td>%s</td></tr>' |
334 % (attr, html_escape(val))) |
334 % (attr, xml_escape(val))) |
335 self.w(u'</table>') |
335 self.w(u'</table>') |
336 server = req.server |
336 server = req.server |
337 self.w(u'<h3>%s</h3>' % _('Server')) |
337 self.w(u'<h3>%s</h3>' % _('Server')) |
338 self.w(u'<table border="1">') |
338 self.w(u'<table border="1">') |
339 for attr in dir(server): |
339 for attr in dir(server): |
340 val = getattr(server, attr) |
340 val = getattr(server, attr) |
341 if attr.startswith('_') or callable(val): |
341 if attr.startswith('_') or callable(val): |
342 continue |
342 continue |
343 self.w(u'<tr><th align="left">%s</th><td>%s</td></tr>' |
343 self.w(u'<tr><th align="left">%s</th><td>%s</td></tr>' |
344 % (attr, html_escape(val))) |
344 % (attr, xml_escape(val))) |
345 self.w(u'</table>') |
345 self.w(u'</table>') |
346 |
346 |