summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrabhu Ramachandran2018-03-21 18:38:06 +0530
committerGitHub2018-03-21 18:38:06 +0530
commit4b356aa2f6097cd0f46292218f31ded18b631e53 (patch)
tree35f7ea09a2464eab2ef185209b7296a63af3f605
parent30d8671a7c46505561f885e463f60cd04a61a76a (diff)
parent88fbad3f08dfcf8d139f8bc572860469c64e3104 (diff)
downloadonline_test-4b356aa2f6097cd0f46292218f31ded18b631e53.tar.gz
online_test-4b356aa2f6097cd0f46292218f31ded18b631e53.tar.bz2
online_test-4b356aa2f6097cd0f46292218f31ded18b631e53.zip
Merge pull request #456 from ankitjavalkar/preview-qp
Preview QuestionPaper as an HTML
-rw-r--r--yaksh/templates/yaksh/courses.html3
-rw-r--r--yaksh/templates/yaksh/preview_questionpaper.html42
-rw-r--r--yaksh/test_views.py66
-rw-r--r--yaksh/urls.py2
-rw-r--r--yaksh/views.py22
5 files changed, 134 insertions, 1 deletions
diff --git a/yaksh/templates/yaksh/courses.html b/yaksh/templates/yaksh/courses.html
index 78d21bf..dabf8eb 100644
--- a/yaksh/templates/yaksh/courses.html
+++ b/yaksh/templates/yaksh/courses.html
@@ -368,6 +368,9 @@
{% if quiz.questionpaper_set.get %}
<a href="{{URL_ROOT}}/exam/manage/designquestionpaper/{{ quiz.id }}/{{quiz.questionpaper_set.get.id}}/">
Question Paper for {{ quiz.description }}</a>
+ <a href="{{URL_ROOT}}/exam/manage/preview_questionpaper/{{quiz.questionpaper_set.get.id}}" class="btn btn-primary active btn-xs" target="_blank">
+ View
+ </a>
<br>
{% else %}
<p>No Question Paper
diff --git a/yaksh/templates/yaksh/preview_questionpaper.html b/yaksh/templates/yaksh/preview_questionpaper.html
new file mode 100644
index 0000000..123218f
--- /dev/null
+++ b/yaksh/templates/yaksh/preview_questionpaper.html
@@ -0,0 +1,42 @@
+{% extends "base.html" %}
+
+{% block pagetitle %} Quiz: {{ paper.quiz.description }} {% endblock pagetitle %}
+
+{% block content %}
+<div class="well">
+ <div class="col-md-12">
+ <div class="col-md-6">Maximum Mark(s): {{ paper.total_marks }}</div>
+ <div class="col-md-6"><span class="pull-right">Total Time: {{ paper.quiz.duration }} minutes</span></div>
+ </div>
+</div>
+<div class="panel panel-default">
+ <div class="panel-heading">Instructions</div>
+ <div class="panel-body" id="instructions">
+ {{ paper.quiz.instructions|safe }}
+ </div>
+</div>
+{% for question in questions %}
+ <div class="panel panel-info">
+ <div class="panel-heading">
+ <strong> {{forloop.counter}}. {{ question.summary }}
+ <span class="marks pull-right"> Mark(s): {{ question.points }} </span>
+ </strong>
+ </div>
+ <div class="panel-body">
+ <h5><u>Question:</u></h5> <strong>{{ question.description|safe }}</strong>
+ <br/><b>Answer:</b><br/>
+ {% if question.type == "code" %}
+ <div class="well">{{ question.snippet }}<br/></div>
+ {% endif %}
+ {% if question.type == "mcq" or question.type == "mcc" %}
+ <h5> <u>Choices:</u></h5>
+ {% for testcase in question.get_test_cases %}
+ <br/><strong>
+ {{ forloop.counter }}. {{ testcase.options|safe }}</strong>
+ {% endfor %}
+ {% endif %}
+
+ </div>
+ </div>
+{% endfor %}
+{% endblock %}
diff --git a/yaksh/test_views.py b/yaksh/test_views.py
index faac617..fd4f040 100644
--- a/yaksh/test_views.py
+++ b/yaksh/test_views.py
@@ -4100,6 +4100,24 @@ class TestQuestionPaper(TestCase):
timezone='UTC'
)
+ self.user2_plaintext_pass = 'demo2'
+ self.user2 = User.objects.create_user(
+ username='demo_user2',
+ password=self.user_plaintext_pass,
+ first_name='first_name2',
+ last_name='last_name2',
+ email='demo2@test.com'
+ )
+
+ Profile.objects.create(
+ user=self.user2,
+ roll_number=11,
+ institute='IIT',
+ department='Chemical',
+ position='Student',
+ timezone='UTC'
+ )
+
self.teacher_plaintext_pass = 'demo_teacher'
self.teacher = User.objects.create_user(
username='demo_teacher',
@@ -4254,6 +4272,54 @@ class TestQuestionPaper(TestCase):
self.learning_module.delete()
self.learning_unit.delete()
+ def test_preview_questionpaper_correct(self):
+ self.client.login(
+ username=self.user.username,
+ password=self.user_plaintext_pass
+ )
+
+ # Should successfully preview question paper
+ response = self.client.get(
+ reverse('yaksh:preview_questionpaper',
+ kwargs={"questionpaper_id": self.question_paper.id}
+ )
+ )
+ self.assertEqual(response.status_code, 200)
+ self.assertTemplateUsed(response, 'yaksh/preview_questionpaper.html')
+ self.assertEqual(
+ response.context['questions'],
+ self.questions_list
+ )
+ self.assertEqual(response.context['paper'], self.question_paper)
+
+ def test_preview_questionpaper_without_moderator(self):
+ self.client.login(
+ username=self.user2.username,
+ password=self.user_plaintext_pass
+ )
+
+ # Should raise an HTTP 404 response
+ response = self.client.get(
+ reverse('yaksh:preview_questionpaper',
+ kwargs={"questionpaper_id": self.question_paper.id}
+ )
+ )
+ self.assertEqual(response.status_code, 404)
+
+ def test_preview_qustionpaper_without_quiz_owner(self):
+ self.client.login(
+ username=self.teacher.username,
+ password=self.teacher_plaintext_pass
+ )
+
+ # Should raise an HTTP 404 response
+ response = self.client.get(
+ reverse('yaksh:preview_questionpaper',
+ kwargs={"questionpaper_id": self.question_paper.id}
+ )
+ )
+ self.assertEqual(response.status_code, 404)
+
def test_mcq_attempt_right_after_wrong(self):
""" Case:- Check if answerpaper and answer marks are updated after
attempting same mcq question with wrong answer and then right
diff --git a/yaksh/urls.py b/yaksh/urls.py
index b81c7b2..dd450ba 100644
--- a/yaksh/urls.py
+++ b/yaksh/urls.py
@@ -172,4 +172,6 @@ urlpatterns = [
views.design_course, name="design_course"),
url(r'^manage/course_status/(?P<course_id>\d+)/$',
views.course_status, name="course_status"),
+ url(r'^manage/preview_questionpaper/(?P<questionpaper_id>\d+)/$',
+ views.preview_questionpaper, name="preview_questionpaper"),
]
diff --git a/yaksh/views.py b/yaksh/views.py
index ec1807c..c22500d 100644
--- a/yaksh/views.py
+++ b/yaksh/views.py
@@ -9,6 +9,7 @@ from django.core.urlresolvers import reverse
from django.contrib.auth import login, logout, authenticate
from django.shortcuts import render_to_response, get_object_or_404, redirect
from django.template import RequestContext, Context, Template
+from django.template.loader import get_template, render_to_string
from django.http import Http404
from django.db.models import Sum, Max, Q, F
from django.views.decorators.csrf import csrf_exempt
@@ -1886,7 +1887,7 @@ def create_demo_course(request):
user = request.user
ci = RequestContext(request)
if not is_moderator(user):
- raise("You are not allowed to view this page")
+ raise Http404("You are not allowed to view this page")
demo_course = Course()
success = demo_course.create_demo(user)
if success:
@@ -2753,3 +2754,22 @@ def _update_unit_status(course_id, user, unit):
# make next available unit as current unit
course_status.current_unit = unit
course_status.save()
+
+
+@login_required
+@email_verified
+def preview_questionpaper(request, questionpaper_id):
+ user = request.user
+ if not is_moderator(user):
+ raise Http404('You are not allowed to view this page!')
+ paper = QuestionPaper.objects.get(id=questionpaper_id)
+ if not paper.quiz.creator == user:
+ raise Http404('This questionpaper does not belong to you')
+ context = {
+ 'questions': paper._get_questions_for_answerpaper(),
+ 'paper': paper,
+ }
+
+ return my_render_to_response(
+ 'yaksh/preview_questionpaper.html', context
+ )