views.py 2.08 KB
Newer Older
1 2 3
"""Views for debugging and diagnostics"""

import pprint
4
import traceback
5

6
from django.http import Http404, HttpResponse, HttpResponseNotFound
7
from django.contrib.auth.decorators import login_required
8 9
from django.utils.html import escape

10
from django_future.csrf import ensure_csrf_cookie
David Baumgold committed
11
from edxmako.shortcuts import render_to_response
12 13 14

from codejail.safe_exec import safe_exec

15 16
from mako.exceptions import TopLevelLookupException

17

18 19 20
@login_required
@ensure_csrf_cookie
def run_python(request):
21
    """A page to allow testing the Python sandbox on a production server."""
22 23 24 25 26 27 28
    if not request.user.is_staff:
        raise Http404
    c = {}
    c['code'] = ''
    c['results'] = None
    if request.method == 'POST':
        py_code = c['code'] = request.POST.get('code')
29
        g = {}
30
        try:
31
            safe_exec(py_code, g)
32
        except Exception as e:
33
            c['results'] = traceback.format_exc()
34
        else:
35
            c['results'] = pprint.pformat(g)
36
    return render_to_response("debug/run_python_form.html", c)
37 38 39 40


@login_required
def show_parameters(request):
41 42 43 44 45 46 47
    """A page that shows what parameters were on the URL and post."""
    html = []
    for name, value in sorted(request.GET.items()):
        html.append(escape("GET {}: {!r}".format(name, value)))
    for name, value in sorted(request.POST.items()):
        html.append(escape("POST {}: {!r}".format(name, value)))
    return HttpResponse("\n".join("<p>{}</p>".format(h) for h in html))
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62


def show_reference_template(request, template):
    """
    Shows the specified template as an HTML page. This is used only in debug mode to allow the UX team
    to produce and work with static reference templates.
    e.g. /template/ux/reference/container.html shows the template under ux/reference/container.html

    Note: dynamic parameters can also be passed to the page.
    e.g. /template/ux/reference/container.html?name=Foo
    """
    try:
        return render_to_response(template, request.GET.dict())
    except TopLevelLookupException:
        return HttpResponseNotFound("Couldn't find template {template}".format(template=template))