<filename>templation/views.py
"""
Mixin to add in your CCBV to store the object.pk as resource to be fetched in
the template.
"""
from __future__ import absolute_import
import sys
from django.conf import settings
from django.http import HttpResponseServerError
from django.template import Template, Context
from django.views.static import serve
from django.views.debug import ExceptionReporter
from django.views.defaults import server_error as django_server_error
from .locals import thread_locals
from .settings import DUMP_EXCEPTIONS, get_resource_access_model


class ResourceStoreMixin(object):
    """
    Addicted to Class Based Views? we too! here you had a mixin
    to add to any DetailView to handle custom templates.

    If you can't rely con `self.object` or kwargs['pk'] to get the instance,
    override `get_templation_object()`to return a instance of the resource in
    `templation.settings.get_resource_model()`.
    """
    def get_templation_object(self, *args, **kwargs):
        return getattr(self, 'object', getattr(kwargs, 'pk', None))

    def dispatch(self, request, *args, **kwargs):
        context = super(ResourceStoreMixin, self).dispatch(request, *args,
                                                           **kwargs)
        thread_locals.resource = self.get_templation_object(**kwargs)
        return context


def static_view(request, resource_id, path, document_root=None,
                show_indexes=False):
    """
    Composition to return the static in development
    """
    path = '/' + '/'.join((resource_id, 'static', path))
    return serve(request, path, document_root, show_indexes)


TEMPLATION_500_TEMPLATE = """
<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta name="robots" content="NONE,NOARCHIVE">
  <title>
    {% if exception_type %}
        {{ exception_type }}
    {% else %}
        Report
    {% endif %}
    {% if request %} at {{ request.path_info|escape }}{% endif %}</title>
  <style type="text/css">
    html * { padding:0; margin:0; }
    body * { padding:10px 20px; }
    body * * { padding:0; }
    body { font:small sans-serif; }
    body>div { border-bottom:1px solid #ddd; }
    h1 { font-weight:normal; }
    h2 { margin-bottom:.8em; }
    h2 span { font-size:80%; color:#666; font-weight:normal; }
    h3 { margin:1em 0 .5em 0; }
    h4 { margin:0 0 .5em 0; font-weight: normal; }
    code, pre { font-size: 100%; white-space: pre-wrap; }
    table { border:1px solid #ccc;
            border-collapse: collapse;
            width:100%;
            background:white; }
    tbody td, tbody th { vertical-align:top; padding:2px 3px; }
    thead th { padding:1px 6px 1px 3px; background:#fefefe; text-align:left;
               font-weight:normal; font-size:11px; border:1px solid #ddd; }
    tbody th { width:12em; text-align:right; color:#666; padding-right:.5em; }
    table.vars { margin:5px 0 2px 40px; }
    table.vars td, table.req td { font-family:monospace; }
    table td.code { width:100%; }
    table td.code pre { overflow:hidden; }
    table.source th { color:#666; }
    table.source td { font-family:monospace; white-space:pre;
                      border-bottom:1px solid #eee; }
    ul.traceback { list-style-type:none; color: #222; }
    ul.traceback li.frame { padding-bottom:1em; color:#666; }
    ul.traceback li.user { background-color:#e0e0e0; color:#000 }
    div.context { padding:10px 0; overflow:hidden; }
    div.context ol { padding-left:30px; margin:0 10px;
                     list-style-position: inside; }
    div.context ol li { font-family:monospace; white-space:pre; color:#777;
                        cursor:pointer; }
    div.context ol li pre { display:inline; }
    div.context ol.context-line li { color:#505050; background-color:#dfdfdf; }
    div.context ol.context-line li span { position:absolute; right:32px; }
    .user div.context ol.context-line li { background-color:#bbb; color:#000; }
    .user div.context ol li { color:#666; }
    div.commands { margin-left: 40px; }
    div.commands a { color:#555; text-decoration:none; }
    .user div.commands a { color: black; }
    #summary { background: #ffc; }
    #summary h2 { font-weight: normal; color: #666; }
    #explanation { background:#eee; }
    #template, #template-not-exist { background:#f6f6f6; }
    #template-not-exist ul { margin: 0 0 0 20px; }
    #unicode-hint { background:#eee; }
    #traceback { background:#eee; }
    #requestinfo { background:#f6f6f6; padding-left:120px; }
    #summary table { border:none; background:transparent; }
    #requestinfo h2, #requestinfo h3 { position:relative; margin-left:-100px; }
    #requestinfo h3 { margin-bottom:-1em; }
    .error { background: #ffc; }
    .specific { color:#cc3300; font-weight:bold; }
    h2 span.commands { font-size:.7em;}
    span.commands a:link {color:#5E5694;}
    pre.exception_value { font-family: sans-serif; color: #666;
                          font-size: 1.5em; margin: 10px 0 10px 0; }
  </style>
  {% if not is_email %}
  <script type="text/javascript">
  //<!--
    function getElementsByClassName(oElm, strTagName, strClassName){
        // Written by <NAME>, http://www.snook.ca/jon;
        // Add-ons by <NAME>, http://www.robertnyman.com
        var arrElements = (strTagName == "*" && document.all)? document.all :
        oElm.getElementsByTagName(strTagName);
        var arrReturnElements = new Array();
        strClassName = strClassName.replace(/\-/g, "\\-");
        var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
        var oElement;
        for(var i=0; i<arrElements.length; i++){
            oElement = arrElements[i];
            if(oRegExp.test(oElement.className)){
                arrReturnElements.push(oElement);
            }
        }
        return (arrReturnElements)
    }
    function hideAll(elems) {
      for (var e = 0; e < elems.length; e++) {
        elems[e].style.display = 'none';
      }
    }
    window.onload = function() {
      hideAll(getElementsByClassName(document, 'table', 'vars'));
      hideAll(getElementsByClassName(document, 'ol', 'pre-context'));
      hideAll(getElementsByClassName(document, 'ol', 'post-context'));
      hideAll(getElementsByClassName(document, 'div', 'pastebin'));
    }
    function toggle() {
      for (var i = 0; i < arguments.length; i++) {
        var e = document.getElementById(arguments[i]);
        if (e) {
          e.style.display = e.style.display == 'none' ? 'block': 'none';
        }
      }
      return false;
    }
    function varToggle(link, id) {
      toggle('v' + id);
      var s = link.getElementsByTagName('span')[0];
      var uarr = String.fromCharCode(0x25b6);
      var darr = String.fromCharCode(0x25bc);
      s.innerHTML = s.innerHTML == uarr ? darr : uarr;
      return false;
    }
    function switchPastebinFriendly(link) {
      s1 = "Switch to copy-and-paste view";
      s2 = "Switch back to interactive view";
      link.innerHTML = link.innerHTML == s1 ? s2: s1;
      toggle('browserTraceback', 'pastebinTraceback');
      return false;
    }
    //-->
  </script>
  {% endif %}
</head>
<body>
<div id="summary">
  <h1>
    {% if exception_type %}
        {{ exception_type }}
    {% else %}
        Report
    {% endif %}
    {% if request %} at {{ request.path_info|escape }}{% endif %}</h1>
  <pre class="exception_value">
    {% if exception_value %}
        {{ exception_value|force_escape }}
    {% else %}No exception message supplied{% endif %}
  </pre>
</div>
{% if unicode_hint %}
<div id="unicode-hint">
    <h2>Unicode error hint</h2>
    <p>The string that could not be encoded/decoded was:
    <strong>{{ unicode_hint|force_escape }}</strong></p>
</div>
{% endif %}
{% if template_does_not_exist %}
<div id="template-not-exist">
    <h2>Template-loader postmortem</h2>
    {% if loader_debug_info %}
        <p>Django tried loading these templates, in this order:</p>
        <ul>
        {% for loader in loader_debug_info %}
            <li>Using loader <code>{{ loader.loader }}</code>:
                <ul>
                    {% for t in loader.templates %}
                        <li><code>{{ t.name }}</code> ({{ t.status }})</li>
                    {% endfor %}
                </ul>
            </li>
        {% endfor %}
        </ul>
    {% else %}
        <p>Django couldn't find any templates because your
        <code>TEMPLATE_LOADERS</code> setting is empty!</p>
    {% endif %}
</div>
{% endif %}
{% if template_info %}
<div id="template">
   <h2>Error during template rendering</h2>
   <p>In template <code>{{ template_info.name }}</code>,
   error at line <strong>{{ template_info.line }}</strong></p>
   <h3>{{ template_info.message }}</h3>
   <table class="source{% if template_info.top %} cut-top{% endif %}
   {% ifnotequal template_info.bottom template_info.total %}
      cut-bottom{% endifnotequal %}">
   {% for source_line in template_info.source_lines %}
   {% ifequal source_line.0 template_info.line %}
       <tr class="error"><th>{{ source_line.0 }}</th>
           <td>
            {{ template_info.before }}
            <span class="specific">
                {{ template_info.during }}
            </span>{{ template_info.after }}
            </td>
        </tr>
   {% else %}
      <tr><th>{{ source_line.0 }}</th>
      <td>{{ source_line.1 }}</td></tr>
   {% endifequal %}
   {% endfor %}
   </table>
</div>
{% endif %}
</body>
</html>
"""


def server_error(request, template_name='500.html'):
    """
    500 error handler.
    """

    # Get exception info
    exc_type, exc_value, exc_traceback = sys.exc_info()
    if getattr(settings, 'TEMPLATION_DEBUG', False) and \
       (exc_type.__name__ in DUMP_EXCEPTIONS) \
       and get_resource_access_model().objects.filter(
            resource_pointer__resource=thread_locals.resource):
        reporter = ExceptionReporter(request, exc_type, exc_value,
                                     exc_traceback)

        t = Template(TEMPLATION_500_TEMPLATE, name='Technical 500 template')
        c = Context(reporter.get_traceback_data(), use_l10n=False)
        html = t.render(c)
        return HttpResponseServerError(html, content_type='text/html')

    return django_server_error(request, template_name)

<filename>templation/views.py
"""
Mixin to add in your CCBV to store the object.pk as resource to be fetched in
the template.
"""
from __future__ import absolute_import
import sys
from django.conf import settings
from django.http import HttpResponseServerError
from django.template import Template, Context
from django.views.static import serve
from django.views.debug import ExceptionReporter
from django.views.defaults import server_error as django_server_error
from .locals import thread_locals
from .settings import DUMP_EXCEPTIONS, get_resource_access_model


class ResourceStoreMixin(object):
    """
    Addicted to Class Based Views? we too! here you had a mixin
    to add to any DetailView to handle custom templates.

    If you can't rely con `self.object` or kwargs['pk'] to get the instance,
    override `get_templation_object()`to return a instance of the resource in
    `templation.settings.get_resource_model()`.
    """
    def get_templation_object(self, *args, **kwargs):
        return getattr(self, 'object', getattr(kwargs, 'pk', None))

    def dispatch(self, request, *args, **kwargs):
        context = super(ResourceStoreMixin, self).dispatch(request, *args,
                                                           **kwargs)
        thread_locals.resource = self.get_templation_object(**kwargs)
        return context


def static_view(request, resource_id, path, document_root=None,
                show_indexes=False):
    """
    Composition to return the static in development
    """
    path = '/' + '/'.join((resource_id, 'static', path))
    return serve(request, path, document_root, show_indexes)


TEMPLATION_500_TEMPLATE = """
<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta name="robots" content="NONE,NOARCHIVE">
  <title>
    {% if exception_type %}
        {{ exception_type }}
    {% else %}
        Report
    {% endif %}
    {% if request %} at {{ request.path_info|escape }}{% endif %}</title>
  <style type="text/css">
    html * { padding:0; margin:0; }
    body * { padding:10px 20px; }
    body * * { padding:0; }
    body { font:small sans-serif; }
    body>div { border-bottom:1px solid #ddd; }
    h1 { font-weight:normal; }
    h2 { margin-bottom:.8em; }
    h2 span { font-size:80%; color:#666; font-weight:normal; }
    h3 { margin:1em 0 .5em 0; }
    h4 { margin:0 0 .5em 0; font-weight: normal; }
    code, pre { font-size: 100%; white-space: pre-wrap; }
    table { border:1px solid #ccc;
            border-collapse: collapse;
            width:100%;
            background:white; }
    tbody td, tbody th { vertical-align:top; padding:2px 3px; }
    thead th { padding:1px 6px 1px 3px; background:#fefefe; text-align:left;
               font-weight:normal; font-size:11px; border:1px solid #ddd; }
    tbody th { width:12em; text-align:right; color:#666; padding-right:.5em; }
    table.vars { margin:5px 0 2px 40px; }
    table.vars td, table.req td { font-family:monospace; }
    table td.code { width:100%; }
    table td.code pre { overflow:hidden; }
    table.source th { color:#666; }
    table.source td { font-family:monospace; white-space:pre;
                      border-bottom:1px solid #eee; }
    ul.traceback { list-style-type:none; color: #222; }
    ul.traceback li.frame { padding-bottom:1em; color:#666; }
    ul.traceback li.user { background-color:#e0e0e0; color:#000 }
    div.context { padding:10px 0; overflow:hidden; }
    div.context ol { padding-left:30px; margin:0 10px;
                     list-style-position: inside; }
    div.context ol li { font-family:monospace; white-space:pre; color:#777;
                        cursor:pointer; }
    div.context ol li pre { display:inline; }
    div.context ol.context-line li { color:#505050; background-color:#dfdfdf; }
    div.context ol.context-line li span { position:absolute; right:32px; }
    .user div.context ol.context-line li { background-color:#bbb; color:#000; }
    .user div.context ol li { color:#666; }
    div.commands { margin-left: 40px; }
    div.commands a { color:#555; text-decoration:none; }
    .user div.commands a { color: black; }
    #summary { background: #ffc; }
    #summary h2 { font-weight: normal; color: #666; }
    #explanation { background:#eee; }
    #template, #template-not-exist { background:#f6f6f6; }
    #template-not-exist ul { margin: 0 0 0 20px; }
    #unicode-hint { background:#eee; }
    #traceback { background:#eee; }
    #requestinfo { background:#f6f6f6; padding-left:120px; }
    #summary table { border:none; background:transparent; }
    #requestinfo h2, #requestinfo h3 { position:relative; margin-left:-100px; }
    #requestinfo h3 { margin-bottom:-1em; }
    .error { background: #ffc; }
    .specific { color:#cc3300; font-weight:bold; }
    h2 span.commands { font-size:.7em;}
    span.commands a:link {color:#5E5694;}
    pre.exception_value { font-family: sans-serif; color: #666;
                          font-size: 1.5em; margin: 10px 0 10px 0; }
  </style>
  {% if not is_email %}
  <script type="text/javascript">
  //<!--
    function getElementsByClassName(oElm, strTagName, strClassName){
        // Written by <NAME>, http://www.snook.ca/jon;
        // Add-ons by <NAME>, http://www.robertnyman.com
        var arrElements = (strTagName == "*" && document.all)? document.all :
        oElm.getElementsByTagName(strTagName);
        var arrReturnElements = new Array();
        strClassName = strClassName.replace(/\-/g, "\\-");
        var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
        var oElement;
        for(var i=0; i<arrElements.length; i++){
            oElement = arrElements[i];
            if(oRegExp.test(oElement.className)){
                arrReturnElements.push(oElement);
            }
        }
        return (arrReturnElements)
    }
    function hideAll(elems) {
      for (var e = 0; e < elems.length; e++) {
        elems[e].style.display = 'none';
      }
    }
    window.onload = function() {
      hideAll(getElementsByClassName(document, 'table', 'vars'));
      hideAll(getElementsByClassName(document, 'ol', 'pre-context'));
      hideAll(getElementsByClassName(document, 'ol', 'post-context'));
      hideAll(getElementsByClassName(document, 'div', 'pastebin'));
    }
    function toggle() {
      for (var i = 0; i < arguments.length; i++) {
        var e = document.getElementById(arguments[i]);
        if (e) {
          e.style.display = e.style.display == 'none' ? 'block': 'none';
        }
      }
      return false;
    }
    function varToggle(link, id) {
      toggle('v' + id);
      var s = link.getElementsByTagName('span')[0];
      var uarr = String.fromCharCode(0x25b6);
      var darr = String.fromCharCode(0x25bc);
      s.innerHTML = s.innerHTML == uarr ? darr : uarr;
      return false;
    }
    function switchPastebinFriendly(link) {
      s1 = "Switch to copy-and-paste view";
      s2 = "Switch back to interactive view";
      link.innerHTML = link.innerHTML == s1 ? s2: s1;
      toggle('browserTraceback', 'pastebinTraceback');
      return false;
    }
    //-->
  </script>
  {% endif %}
</head>
<body>
<div id="summary">
  <h1>
    {% if exception_type %}
        {{ exception_type }}
    {% else %}
        Report
    {% endif %}
    {% if request %} at {{ request.path_info|escape }}{% endif %}</h1>
  <pre class="exception_value">
    {% if exception_value %}
        {{ exception_value|force_escape }}
    {% else %}No exception message supplied{% endif %}
  </pre>
</div>
{% if unicode_hint %}
<div id="unicode-hint">
    <h2>Unicode error hint</h2>
    <p>The string that could not be encoded/decoded was:
    <strong>{{ unicode_hint|force_escape }}</strong></p>
</div>
{% endif %}
{% if template_does_not_exist %}
<div id="template-not-exist">
    <h2>Template-loader postmortem</h2>
    {% if loader_debug_info %}
        <p>Django tried loading these templates, in this order:</p>
        <ul>
        {% for loader in loader_debug_info %}
            <li>Using loader <code>{{ loader.loader }}</code>:
                <ul>
                    {% for t in loader.templates %}
                        <li><code>{{ t.name }}</code> ({{ t.status }})</li>
                    {% endfor %}
                </ul>
            </li>
        {% endfor %}
        </ul>
    {% else %}
        <p>Django couldn't find any templates because your
        <code>TEMPLATE_LOADERS</code> setting is empty!</p>
    {% endif %}
</div>
{% endif %}
{% if template_info %}
<div id="template">
   <h2>Error during template rendering</h2>
   <p>In template <code>{{ template_info.name }}</code>,
   error at line <strong>{{ template_info.line }}</strong></p>
   <h3>{{ template_info.message }}</h3>
   <table class="source{% if template_info.top %} cut-top{% endif %}
   {% ifnotequal template_info.bottom template_info.total %}
      cut-bottom{% endifnotequal %}">
   {% for source_line in template_info.source_lines %}
   {% ifequal source_line.0 template_info.line %}
       <tr class="error"><th>{{ source_line.0 }}</th>
           <td>
            {{ template_info.before }}
            <span class="specific">
                {{ template_info.during }}
            </span>{{ template_info.after }}
            </td>
        </tr>
   {% else %}
      <tr><th>{{ source_line.0 }}</th>
      <td>{{ source_line.1 }}</td></tr>
   {% endifequal %}
   {% endfor %}
   </table>
</div>
{% endif %}
</body>
</html>
"""


def server_error(request, template_name='500.html'):
    """
    500 error handler.
    """

    # Get exception info
    exc_type, exc_value, exc_traceback = sys.exc_info()
    if getattr(settings, 'TEMPLATION_DEBUG', False) and \
       (exc_type.__name__ in DUMP_EXCEPTIONS) \
       and get_resource_access_model().objects.filter(
            resource_pointer__resource=thread_locals.resource):
        reporter = ExceptionReporter(request, exc_type, exc_value,
                                     exc_traceback)

        t = Template(TEMPLATION_500_TEMPLATE, name='Technical 500 template')
        c = Context(reporter.get_traceback_data(), use_l10n=False)
        html = t.render(c)
        return HttpResponseServerError(html, content_type='text/html')

    return django_server_error(request, template_name)

Mixin to add in your CCBV to store the object.pk as resource to be fetched in the template. Addicted to Class Based Views? we too! here you had a mixin     to add to any DetailView to handle custom templates.      If you can't rely con `self.object` or kwargs['pk'] to get the instance,     override `get_templation_object()`to return a instance of the resource in     `templation.settings.get_resource_model()`. Composition to return the static in development <!DOCTYPE html> <html lang="en"> <head>   <meta http-equiv="content-type" content="text/html; charset=utf-8">   <meta name="robots" content="NONE,NOARCHIVE">   <title>     {% if exception_type %}         {{ exception_type }}     {% else %}         Report     {% endif %}     {% if request %} at {{ request.path_info|escape }}{% endif %}</title>   <style type="text/css">     html * { padding:0; margin:0; }     body * { padding:10px 20px; }     body * * { padding:0; }     body { font:small sans-serif; }     body>div { border-bottom:1px solid #ddd; }     h1 { font-weight:normal; }     h2 { margin-bottom:.8em; }     h2 span { font-size:80%; color:#666; font-weight:normal; }     h3 { margin:1em 0 .5em 0; }     h4 { margin:0 0 .5em 0; font-weight: normal; }     code, pre { font-size: 100%; white-space: pre-wrap; }     table { border:1px solid #ccc;             border-collapse: collapse;             width:100%;             background:white; }     tbody td, tbody th { vertical-align:top; padding:2px 3px; }     thead th { padding:1px 6px 1px 3px; background:#fefefe; text-align:left;                font-weight:normal; font-size:11px; border:1px solid #ddd; }     tbody th { width:12em; text-align:right; color:#666; padding-right:.5em; }     table.vars { margin:5px 0 2px 40px; }     table.vars td, table.req td { font-family:monospace; }     table td.code { width:100%; }     table td.code pre { overflow:hidden; }     table.source th { color:#666; }     table.source td { font-family:monospace; white-space:pre;                       border-bottom:1px solid #eee; }     ul.traceback { list-style-type:none; color: #222; }     ul.traceback li.frame { padding-bottom:1em; color:#666; }     ul.traceback li.user { background-color:#e0e0e0; color:#000 }     div.context { padding:10px 0; overflow:hidden; }     div.context ol { padding-left:30px; margin:0 10px;                      list-style-position: inside; }     div.context ol li { font-family:monospace; white-space:pre; color:#777;                         cursor:pointer; }     div.context ol li pre { display:inline; }     div.context ol.context-line li { color:#505050; background-color:#dfdfdf; }     div.context ol.context-line li span { position:absolute; right:32px; }     .user div.context ol.context-line li { background-color:#bbb; color:#000; }     .user div.context ol li { color:#666; }     div.commands { margin-left: 40px; }     div.commands a { color:#555; text-decoration:none; }     .user div.commands a { color: black; }     #summary { background: #ffc; }     #summary h2 { font-weight: normal; color: #666; }     #explanation { background:#eee; }     #template, #template-not-exist { background:#f6f6f6; }     #template-not-exist ul { margin: 0 0 0 20px; }     #unicode-hint { background:#eee; }     #traceback { background:#eee; }     #requestinfo { background:#f6f6f6; padding-left:120px; }     #summary table { border:none; background:transparent; }     #requestinfo h2, #requestinfo h3 { position:relative; margin-left:-100px; }     #requestinfo h3 { margin-bottom:-1em; }     .error { background: #ffc; }     .specific { color:#cc3300; font-weight:bold; }     h2 span.commands { font-size:.7em;}     span.commands a:link {color:#5E5694;}     pre.exception_value { font-family: sans-serif; color: #666;                           font-size: 1.5em; margin: 10px 0 10px 0; }   </style>   {% if not is_email %}   <script type="text/javascript">   //<!--     function getElementsByClassName(oElm, strTagName, strClassName){         // Written by <NAME>, http://www.snook.ca/jon;         // Add-ons by <NAME>, http://www.robertnyman.com         var arrElements = (strTagName == "*" && document.all)? document.all :         oElm.getElementsByTagName(strTagName);         var arrReturnElements = new Array();         strClassName = strClassName.replace(/\-/g, "\\-");         var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");         var oElement;         for(var i=0; i<arrElements.length; i++){             oElement = arrElements[i];             if(oRegExp.test(oElement.className)){                 arrReturnElements.push(oElement);             }         }         return (arrReturnElements)     }     function hideAll(elems) {       for (var e = 0; e < elems.length; e++) {         elems[e].style.display = 'none';       }     }     window.onload = function() {       hideAll(getElementsByClassName(document, 'table', 'vars'));       hideAll(getElementsByClassName(document, 'ol', 'pre-context'));       hideAll(getElementsByClassName(document, 'ol', 'post-context'));       hideAll(getElementsByClassName(document, 'div', 'pastebin'));     }     function toggle() {       for (var i = 0; i < arguments.length; i++) {         var e = document.getElementById(arguments[i]);         if (e) {           e.style.display = e.style.display == 'none' ? 'block': 'none';         }       }       return false;     }     function varToggle(link, id) {       toggle('v' + id);       var s = link.getElementsByTagName('span')[0];       var uarr = String.fromCharCode(0x25b6);       var darr = String.fromCharCode(0x25bc);       s.innerHTML = s.innerHTML == uarr ? darr : uarr;       return false;     }     function switchPastebinFriendly(link) {       s1 = "Switch to copy-and-paste view";       s2 = "Switch back to interactive view";       link.innerHTML = link.innerHTML == s1 ? s2: s1;       toggle('browserTraceback', 'pastebinTraceback');       return false;     }     //-->   </script>   {% endif %} </head> <body> <div id="summary">   <h1>     {% if exception_type %}         {{ exception_type }}     {% else %}         Report     {% endif %}     {% if request %} at {{ request.path_info|escape }}{% endif %}</h1>   <pre class="exception_value">     {% if exception_value %}         {{ exception_value|force_escape }}     {% else %}No exception message supplied{% endif %}   </pre> </div> {% if unicode_hint %} <div id="unicode-hint">     <h2>Unicode error hint</h2>     <p>The string that could not be encoded/decoded was:     <strong>{{ unicode_hint|force_escape }}</strong></p> </div> {% endif %} {% if template_does_not_exist %} <div id="template-not-exist">     <h2>Template-loader postmortem</h2>     {% if loader_debug_info %}         <p>Django tried loading these templates, in this order:</p>         <ul>         {% for loader in loader_debug_info %}             <li>Using loader <code>{{ loader.loader }}</code>:                 <ul>                     {% for t in loader.templates %}                         <li><code>{{ t.name }}</code> ({{ t.status }})</li>                     {% endfor %}                 </ul>             </li>         {% endfor %}         </ul>     {% else %}         <p>Django couldn't find any templates because your         <code>TEMPLATE_LOADERS</code> setting is empty!</p>     {% endif %} </div> {% endif %} {% if template_info %} <div id="template">    <h2>Error during template rendering</h2>    <p>In template <code>{{ template_info.name }}</code>,    error at line <strong>{{ template_info.line }}</strong></p>    <h3>{{ template_info.message }}</h3>    <table class="source{% if template_info.top %} cut-top{% endif %}    {% ifnotequal template_info.bottom template_info.total %}       cut-bottom{% endifnotequal %}">    {% for source_line in template_info.source_lines %}    {% ifequal source_line.0 template_info.line %}        <tr class="error"><th>{{ source_line.0 }}</th>            <td>             {{ template_info.before }}             <span class="specific">                 {{ template_info.during }}             </span>{{ template_info.after }}             </td>         </tr>    {% else %}       <tr><th>{{ source_line.0 }}</th>       <td>{{ source_line.1 }}</td></tr>    {% endifequal %}    {% endfor %}    </table> </div> {% endif %} </body> </html> 500 error handler. # Get exception info