From ae4e2dad126535cda41a7b4a05fdb247f9cdf737 Mon Sep 17 00:00:00 2001
From: mahesh
Date: Thu, 23 Nov 2017 01:11:59 +0530
Subject: Render error output with django template instead of javascript
---
yaksh/static/yaksh/css/exam.css | 2 +-
yaksh/static/yaksh/js/requesthandler.js | 43 ++++----------
yaksh/templates/exam.html | 16 +-----
yaksh/templates/yaksh/error_template.html | 93 +++++++++++++++++++++++++++++++
yaksh/views.py | 26 +++++----
5 files changed, 123 insertions(+), 57 deletions(-)
create mode 100644 yaksh/templates/yaksh/error_template.html
diff --git a/yaksh/static/yaksh/css/exam.css b/yaksh/static/yaksh/css/exam.css
index ec48a14..7d10629 100644
--- a/yaksh/static/yaksh/css/exam.css
+++ b/yaksh/static/yaksh/css/exam.css
@@ -4,4 +4,4 @@ table td, table th { border: black solid 1px !important;
}
#stdio, #assertion {
table-layout: fixed
-}
\ No newline at end of file
+}
diff --git a/yaksh/static/yaksh/js/requesthandler.js b/yaksh/static/yaksh/js/requesthandler.js
index 1c9a290..5d72241 100644
--- a/yaksh/static/yaksh/js/requesthandler.js
+++ b/yaksh/static/yaksh/js/requesthandler.js
@@ -61,9 +61,9 @@ function response_handler(method_type, content_type, data, uid){
}
else{
unlock_screen();
- error_array = res.error;
- generic_error(error_array)
-
+ var error_output = document.getElementById("error_panel");
+ error_output.innerHTML = res.error;
+ focus_on_error();
}
} else {
reset_values();
@@ -71,35 +71,14 @@ function response_handler(method_type, content_type, data, uid){
}
}
-function generic_error(error_array){
- var error_output = document.getElementById("error_panel");
- error_output.innerHTML = ""
- for (var i = 0; i < error_array.length; i++) {
- var panel_danger = document.createElement('div');
- panel_danger.setAttribute('class', "panel panel-danger");
-
- var panel_heading = document.createElement('div');
- panel_heading.setAttribute('class', "panel-heading");
- panel_heading.innerHTML = "Error no. " + (i + 1);
-
- var panel_body = document.createElement('div');
- panel_body.setAttribute('class', "panel-body");
-
- var well = document.createElement('div');
- well.setAttribute('class', "well well-sm");
-
- var pre = document.createElement('pre');
- var code = document.createElement('code');
- console.log(error_array[i])
- code.append(error_array[i]);
- pre.appendChild(code);
- well.appendChild(pre);
- panel_body.appendChild(well);
- panel_danger.appendChild(panel_heading);
- panel_danger.appendChild(panel_body);
- error_output.appendChild(panel_danger);
- }
-}
+function focus_on_error(){
+ var ele = document.getElementById('error_panel')
+ if (ele) {
+ ele.scrollIntoView(true);
+ window.scrollBy(0, -15);
+ }
+ }
+
function ajax_check_code(url, method_type, data_type, data, uid) {
$.ajax({
method: method_type,
diff --git a/yaksh/templates/exam.html b/yaksh/templates/exam.html
index f722c5f..fede185 100644
--- a/yaksh/templates/exam.html
+++ b/yaksh/templates/exam.html
@@ -33,15 +33,6 @@
{% endblock %}
{% block content %}
-
+
+
{% if question.type == 'code' or question.type == 'upload' %}
-
-
-
+
{% endif %}
-
diff --git a/yaksh/templates/yaksh/error_template.html b/yaksh/templates/yaksh/error_template.html
new file mode 100644
index 0000000..d42a259
--- /dev/null
+++ b/yaksh/templates/yaksh/error_template.html
@@ -0,0 +1,93 @@
+{% block css%}
+
+{% endblock %}
+
+{% load custom_filters %}
+
+{% if error_message %}
+
+ {% for error in error_message %}
+
+
+
Error No. {{ forloop.counter }}
+
+
+ {% if not error.type %}
+
{{error|safe}}
+
+ {% elif error.type == 'assertion' %}
+
+ {% if error.test_case %}
+
We tried your code with the following test case:
+
+
+ {{error.test_case}}
+
+ {% endif %}
+
The following error took place:
+
+
+
+ Exception Name: |
+ {{error.exception}} |
+
+
+ Exception Message: | {{error.message}} |
+
+
+ {% if error.traceback %}
+ Full Traceback: |
+ {{error.traceback}} |
+ {% endif %}
+
+
+
+ {% elif error.type == 'stdio' %}
+
+ {% if error.given_input %}
+
+
+
+ For given Input value(s): |
+ {{error.given_input}} |
+
+
+ {% endif %}
+
+
+
+
+
+
+
+ Line No. |
+ Expected Output |
+ User output |
+ Status |
+
+ {% for expected,user in error.expected_output|zip:error.user_output %}
+ {{forloop.counter}} |
+ {{expected|default:""}} |
+ {{user|default:""}} |
+ {% if forloop.counter0 in error.error_line_numbers or not expected or not user %}
+ |
+ {% else %}
+ |
+ {% endif %}
+
+ {% endfor %}
+
+
+
+
+ Error: |
+ {{error.error_msg}} |
+
+
+ {% endif %}
+
+
+
+ {% endfor %}
+
+{% endif %}
\ No newline at end of file
diff --git a/yaksh/views.py b/yaksh/views.py
index dd86e40..29f017e 100644
--- a/yaksh/views.py
+++ b/yaksh/views.py
@@ -662,19 +662,23 @@ def get_result(request, uid):
result['status'] = result_state.get('status')
if result['status'] == 'done':
result = json.loads(result_state.get('result'))
+ template_path = os.path.join(*[os.path.dirname(__file__),
+ 'templates','yaksh',
+ 'error_template.html'
+ ]
+ )
+ next_question, error_message, paper = _update_paper(request,uid,
+ result
+ )
if result.get('success'):
- next_question, error_message, paper = _update_paper(request,
- uid, result
- )
return show_question(request, next_question, paper, error_message)
- # else:
- # with open(template_path) as f:
- # template_data = f.read()
- # template = Template(template_data)
- # context = Context(result.get('error')[0])
- # render_error = template.render(context)
- # print(render_error)
- # result["error"] = render_error
+ else:
+ with open(template_path) as f:
+ template_data = f.read()
+ template = Template(template_data)
+ context = Context({"error_message": result.get('error')})
+ render_error = template.render(context)
+ result["error"] = render_error
return JsonResponse(result)
--
cgit