diff options
-rw-r--r-- | yaksh/forms.py | 7 | ||||
-rw-r--r-- | yaksh/static/yaksh/css/view_answerpaper.css | 61 | ||||
-rw-r--r-- | yaksh/templates/yaksh/courses.html | 18 | ||||
-rw-r--r-- | yaksh/templates/yaksh/view_answerpaper.html | 69 | ||||
-rw-r--r-- | yaksh/test_views.py | 22 | ||||
-rw-r--r-- | yaksh/urls.py | 4 | ||||
-rw-r--r-- | yaksh/views.py | 19 |
7 files changed, 159 insertions, 41 deletions
diff --git a/yaksh/forms.py b/yaksh/forms.py index 4a20102..23131b7 100644 --- a/yaksh/forms.py +++ b/yaksh/forms.py @@ -153,13 +153,14 @@ class QuizForm(forms.ModelForm): def __init__(self, *args, **kwargs): user = kwargs.pop('user') + course_id = kwargs.pop('course') super(QuizForm, self).__init__(*args, **kwargs) self.fields['prerequisite'] = forms.ModelChoiceField( - queryset=Quiz.objects.filter(course__creator=user)) + queryset=Quiz.objects.filter(course__id=course_id, + is_trial=False)) self.fields['prerequisite'].required = False self.fields['course'] = forms.ModelChoiceField( - queryset=Course.objects.filter(Q(creator=user)| - Q(teachers=user)).distinct()) + queryset=Course.objects.filter(id=course_id), empty_label=None) class Meta: model = Quiz diff --git a/yaksh/static/yaksh/css/view_answerpaper.css b/yaksh/static/yaksh/css/view_answerpaper.css new file mode 100644 index 0000000..50eab55 --- /dev/null +++ b/yaksh/static/yaksh/css/view_answerpaper.css @@ -0,0 +1,61 @@ +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + .panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-body > pre > code { + background-color:transparent; + color: red; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-body > pre > code { + background-color:transparent; + color: green; +} +.marks{ + float:right; +} +mark{ + background-color: #dff0d8; +} +code{ + background-color: transparent; +} +pre{ + background-color: transparent; +}
\ No newline at end of file diff --git a/yaksh/templates/yaksh/courses.html b/yaksh/templates/yaksh/courses.html index 42f49d1..109b996 100644 --- a/yaksh/templates/yaksh/courses.html +++ b/yaksh/templates/yaksh/courses.html @@ -65,13 +65,17 @@ <p><b><u>Quiz(zes)</u></b></p> {% if course.get_quizzes %} {% for quiz in course.get_quizzes %} - <a href="{{URL_ROOT}}/exam/manage/addquiz/{{quiz.id}}/">{{ quiz.description }}</a><br> + <a href="{{URL_ROOT}}/exam/manage/addquiz/{{course.id}}/{{quiz.id}}/">{{ quiz.description }}</a><br> + {% endfor %} {% else %} <p><b>No quiz </b></p> {% endif %} </div> </div> + <br/> + <button class="btn primary"type="button" onClick='location.replace("{{URL_ROOT}}/exam/manage/addquiz/{{course.id}}/");'>Add New Quiz</button> + </div> </div> <br><br> @@ -130,22 +134,22 @@ <p><b><u>Quiz(zes)</u></b></p> {% if course.get_quizzes %} {% for quiz in course.get_quizzes %} - <a href="{{URL_ROOT}}/exam/manage/addquiz/{{quiz.id}}/">{{ quiz.description }}</a><br> + <a href="{{URL_ROOT}}/exam/manage/addquiz/{{course.id}}/{{quiz.id}}/">{{ quiz.description }}</a><br> {% endfor %} {% else %} <p><b>No quiz </b></p> {% endif %} </div> </div> + <button class="btn primary"type="button" onClick='location.replace("{{URL_ROOT}}/exam/manage/addquiz/{{course.id}}/");'>Add New Quiz</button> </div> </div> <br><br> {% endfor %} {% else %} - <center><h4> No new Courses allotted </h4></center> + <center><h4> No new Courses allotted</h4></center> + <br><br> {% endif %} -<button class="btn primary" type="button" onClick='location.replace("{{URL_ROOT}}/exam/manage/add_course");'>Add New Course</button> - {% if courses or allotted_courses %} - <button class="btn primary" type="button" onClick='location.replace("{{URL_ROOT}}/exam/manage/addquiz");'>Add New Quiz</button> -{% endif %} +<center><button class="btn primary" type="button" onClick='location.replace("{{URL_ROOT}}/exam/manage/add_course");'>Add New Course</button></center> + {% endblock %} diff --git a/yaksh/templates/yaksh/view_answerpaper.html b/yaksh/templates/yaksh/view_answerpaper.html index ae70e69..9227561 100644 --- a/yaksh/templates/yaksh/view_answerpaper.html +++ b/yaksh/templates/yaksh/view_answerpaper.html @@ -1,4 +1,7 @@ {% extends "user.html" %} +{% block css %} +<link rel="stylesheet" media="all" type="text/css" href="{{ URL_ROOT }}/static/yaksh/css/view_answerpaper.css" /> +{% endblock %} {% block title %} Answer Paper for {{ quiz.description }}{% endblock title %} @@ -6,7 +9,6 @@ {% block subtitle %} Answer Paper for {{ quiz.description }}{% endblock %} - {% if not data.papers %} <p><b> You have not attempted the quiz {{ quiz.description }} </b></p> {% else %} @@ -21,32 +23,67 @@ Questions correctly answered: {{ paper.get_answered_str }} <br/> Marks obtained: {{ paper.marks_obtained }} <br/> Start time: {{ paper.start_time }} <br/> + End time : {{ paper.end_time }} <br/> + Percentage obtained: {{ paper.percent }}% <br/> + {% if paper.passed == 0 %} + Status : <b style="color: red;"> Failed </b><br/> + {% else %} + Status : <b style="color: green;"> Passed </b><br/> + {% endif %} </p> {% if paper.answers.count %} - <h3> Answers </h3> + <h3> Answerpaper: </h3> {% for question, answers in paper.get_question_answers.items %} - <p><strong> Question: {{ question.id }}. {{ question.summary }} (Mark(s): {{ question.points }})</strong> </p> + + <div class="panel panel-info"> + <div class="panel-heading"> + <strong> Details: {{forloop.counter}}. {{ question.summary }} + <span class="marks"> Mark(s): {{ question.points }} </span> + </strong> + </div> + <div class="panel-body"> + <h5><u>Question:</u></h5> <strong>{{ question.description|safe }}</strong> + {% 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 }}</strong> + {% endfor %} + {%endif%} + + </div> + </div> {% if question.type == "mcq" or question.type == "mcc" %} - <p> Choices: - {% for testcase in question.get_test_cases %} <br>{{ testcase.options }} {% endfor %} - </p> - <p>Student answer: {{ answers.0 }}</p> - Autocheck: {{ answers.0.error }} - {% else %}{# non-mcq questions #} - <p>Student answer: </p> + {% if "Correct answer" in answers.0.error %} + <div class="panel panel-success"> + {% else %} + <div class="panel panel-danger"> + {% endif %} + <div class="panel-heading"> + Autocheck: {{ answers.0.error }} + </div> + <div class="panel-body"> + <h5><u>Student answer:</u></h5> + <pre><code>{{forloop.counter}}. {{ answers.0 }}</code></pre> + </div> + </div> + {% else %} + <h5>Student answer: </h5> {% for answer in answers %} {% if not answer.skipped %} - <pre> - ############################################################################### - {{ answer.answer.strip }} - # Autocheck: {{ answer.error }} - </pre> + {% if "Correct answer" in answer.error %} + <div class="panel panel-success"> + {% else %} + <div class="panel panel-danger"> + {% endif %} + <div class="panel-heading">Autocheck: {{ answer.error }}</div> + <div class="panel-body"><pre><code>{{ answer.answer.strip }}</code></pre></div> + </div> {% endif %} {% endfor %} {% endif %} {% with answers|last as answer %} - <p><em>Obtained Marks: {{answer.marks}} </em> </p> + <p><em><mark>Obtained Marks: {{answer.marks}}</mark></em> </p> {% endwith %} <hr> {% endfor %} {# for question, answers ... #} diff --git a/yaksh/test_views.py b/yaksh/test_views.py index e232bc0..7d23ce9 100644 --- a/yaksh/test_views.py +++ b/yaksh/test_views.py @@ -213,8 +213,11 @@ class TestAddQuiz(TestCase): """ If not logged in redirect to login page """ - response = self.client.get(reverse('yaksh:add_quiz'), follow=True) - redirect_destination = '/exam/login/?next=/exam/manage/addquiz/' + response = self.client.get(reverse('yaksh:add_quiz', + kwargs={'course_id': self.course.id}), + follow=True + ) + redirect_destination = '/exam/login/?next=/exam/manage/addquiz/{0}/'.format(self.course.id) self.assertRedirects(response, redirect_destination) def test_view_profile_denies_non_moderator(self): @@ -225,8 +228,11 @@ class TestAddQuiz(TestCase): username=self.student.username, password=self.student_plaintext_pass ) - - response = self.client.get(reverse('yaksh:add_quiz'), follow=True) + course_id = self.course.id + response = self.client.get(reverse('yaksh:add_quiz', + kwargs={'course_id': self.course.id}), + follow=True + ) self.assertEqual(response.status_code, 404) def test_add_quiz_get(self): @@ -237,7 +243,9 @@ class TestAddQuiz(TestCase): username=self.user.username, password=self.user_plaintext_pass ) - response = self.client.get(reverse('yaksh:add_quiz')) + response = self.client.get(reverse('yaksh:add_quiz', + kwargs={'course_id': self.course.id}) + ) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, 'yaksh/add_quiz.html') self.assertIsNotNone(response.context['form']) @@ -252,7 +260,7 @@ class TestAddQuiz(TestCase): ) tzone = pytz.timezone('UTC') response = self.client.post(reverse('yaksh:edit_quiz', - kwargs={'quiz_id': self.quiz.id}), + kwargs={'course_id':self.course.id, 'quiz_id': self.quiz.id}), data={ 'start_date_time': '2016-01-10 09:00:15', 'end_date_time': '2016-01-15 09:00:15', @@ -298,7 +306,7 @@ class TestAddQuiz(TestCase): ) tzone = pytz.timezone('UTC') - response = self.client.post(reverse('yaksh:add_quiz'), + response = self.client.post(reverse('yaksh:add_quiz', kwargs={"course_id": self.course.id}), data={ 'start_date_time': '2016-01-10 09:00:15', 'end_date_time': '2016-01-15 09:00:15', diff --git a/yaksh/urls.py b/yaksh/urls.py index 69d7f87..daa6008 100644 --- a/yaksh/urls.py +++ b/yaksh/urls.py @@ -53,8 +53,8 @@ urlpatterns += [ url(r'^manage/$', views.prof_manage, name='manage'), url(r'^manage/addquestion/$', views.add_question), url(r'^manage/addquestion/(?P<question_id>\d+)/$', views.edit_question), - url(r'^manage/addquiz/$', views.add_quiz, name='add_quiz'), - url(r'^manage/addquiz/(?P<quiz_id>\d+)/$', views.add_quiz, name='edit_quiz'), + url(r'^manage/addquiz/(?P<course_id>\d+)/$', views.add_quiz, name='add_quiz'), + url(r'^manage/addquiz/(?P<course_id>\d+)/(?P<quiz_id>\d+)/$', views.add_quiz, name='edit_quiz'), url(r'^manage/gradeuser/$', views.grade_user), url(r'^manage/gradeuser/(?P<quiz_id>\d+)/$',views.grade_user), url(r'^manage/gradeuser/(?P<quiz_id>\d+)/(?P<user_id>\d+)/$',views.grade_user), diff --git a/yaksh/views.py b/yaksh/views.py index 592dd20..9f7c7a9 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -246,33 +246,40 @@ def edit_question(request, question_id=None): context_instance=ci) @login_required -def add_quiz(request, quiz_id=None): +def add_quiz(request, course_id, quiz_id=None): """To add a new quiz in the database. Create a new quiz and store it.""" user = request.user + course = get_object_or_404(Course, pk=course_id) ci = RequestContext(request) - if not is_moderator(user): + if not is_moderator(user) or (user != course.creator and user not in course.teachers.all()): raise Http404('You are not allowed to view this page!') context = {} if request.method == "POST": if quiz_id is None: - form = QuizForm(request.POST, user=user) + form = QuizForm(request.POST, user=user, course=course_id) if form.is_valid(): form.save() return my_redirect(reverse('yaksh:design_questionpaper')) + else: + context["form"] = form + return my_render_to_response('yaksh/add_quiz.html', + context, + context_instance=ci) else: quiz = Quiz.objects.get(id=quiz_id) - form = QuizForm(request.POST, user=user, instance=quiz) + form = QuizForm(request.POST, user=user, course=course_id, + instance=quiz) if form.is_valid(): form.save() context["quiz_id"] = quiz_id return my_redirect("/exam/manage/") else: if quiz_id is None: - form = QuizForm(user=user) + form = QuizForm(course=course_id, user=user) else: quiz = Quiz.objects.get(id=quiz_id) - form = QuizForm(user=user, instance=quiz) + form = QuizForm(user=user,course=course_id, instance=quiz) context["quiz_id"] = quiz_id context["form"] = form return my_render_to_response('yaksh/add_quiz.html', |