From 5a2ed309ff2f5f70571240b551978e25e51cd51f Mon Sep 17 00:00:00 2001 From: adityacp Date: Tue, 20 Feb 2018 11:43:50 +0530 Subject: Change in models.py, views.py and ursl.py - Change urls to take two types of course clone - Change view duplicate_course to copy or clone depending on type - Change view function prof_manage to avoid error while deleting trial answerpapers - Add new model methods for course, module, unit, lesson and quiz to create copies --- yaksh/views.py | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index 2bc5dfe..1055bda 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -390,8 +390,8 @@ def prof_manage(request, msg=None): return my_redirect('/exam/login') if not is_moderator(user): return my_redirect('/exam/') - courses = Course.objects.filter(creator=user, is_trial=False) - + courses = Course.objects.filter(Q(creator=user) | Q(teachers=user), + is_trial=False) trial_paper = AnswerPaper.objects.filter( user=user, question_paper__quiz__is_trial=True, course__is_trial=True @@ -399,17 +399,18 @@ def prof_manage(request, msg=None): if request.method == "POST": delete_paper = request.POST.getlist('delete_paper') for answerpaper_id in delete_paper: - answerpaper = AnswerPaper.objects.get(id=answerpaper_id) - qpaper = answerpaper.question_paper - answerpaper.course.remove_trial_modules() - answerpaper.course.delete() - if qpaper.quiz.is_trial: - qpaper.quiz.delete() - else: - if qpaper.answerpaper_set.count() == 1: + answerpaper = AnswerPaper.objects.filter(id=answerpaper_id) + if answerpaper.exists(): + qpaper = answerpaper.first().question_paper + answerpaper.first().course.remove_trial_modules() + answerpaper.first().course.delete() + if qpaper.quiz.is_trial: qpaper.quiz.delete() else: - answerpaper.delete() + if qpaper.answerpaper_set.count() == 1: + qpaper.quiz.delete() + else: + answerpaper.delete() context = {'user': user, 'courses': courses, 'trial_paper': trial_paper, 'msg': msg } @@ -2240,17 +2241,26 @@ def download_sample_csv(request): @login_required @email_verified -def duplicate_course(request, course_id): +def duplicate_course(request, copy_type, course_id): user = request.user course = Course.objects.get(id=course_id) if not is_moderator(user): raise Http404('You are not allowed to view this page!') if course.is_teacher(user) or course.is_creator(user): - course.create_duplicate_course(user) + if copy_type == "copy": + # Link all the modules from current course to copied course + course.create_duplicate_course(user) + else: + # Create new entries of modules, lessons/quizzes + # from current course to copied course + course.create_shallow_copy(user) else: - msg = 'You do not have permissions to clone this course, please contact your '\ - 'instructor/administrator.' + msg = dedent( + '''\ + You do not have permissions to clone {0} course, please contact + your instructor/administrator.'''.format(course.name) + ) return complete(request, msg, attempt_num=None, questionpaper_id=None) return my_redirect('/exam/manage/courses/') -- cgit From 333859a8c1ab57e70ea57e92a22eaac6a1a1c0ac Mon Sep 17 00:00:00 2001 From: adityacp Date: Thu, 22 Feb 2018 18:05:00 +0530 Subject: Change templates, test_views.py, urls.py, views.py - Change copy_type to shallow and deep --- yaksh/views.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index 62a448c..b4b0c76 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -399,18 +399,18 @@ def prof_manage(request, msg=None): if request.method == "POST": delete_paper = request.POST.getlist('delete_paper') for answerpaper_id in delete_paper: - answerpaper = AnswerPaper.objects.filter(id=answerpaper_id) - if answerpaper.exists(): - qpaper = answerpaper.first().question_paper - answerpaper.first().course.remove_trial_modules() - answerpaper.first().course.delete() - if qpaper.quiz.is_trial: + answerpaper = AnswerPaper.objects.get(id=answerpaper_id) + qpaper = answerpaper.question_paper + answerpaper.course.remove_trial_modules() + answerpaper.course.delete() + if qpaper.quiz.is_trial: + qpaper.quiz.delete() + else: + if qpaper.answerpaper_set.count() == 1: qpaper.quiz.delete() else: - if qpaper.answerpaper_set.count() == 1: - qpaper.quiz.delete() - else: - answerpaper.delete() + answerpaper.delete() + context = {'user': user, 'courses': courses, 'trial_paper': trial_paper, 'msg': msg } @@ -2253,7 +2253,7 @@ def duplicate_course(request, copy_type, course_id): raise Http404('You are not allowed to view this page!') if course.is_teacher(user) or course.is_creator(user): - if copy_type == "copy": + if copy_type == "shallow": # Link all the modules from current course to copied course course.create_duplicate_course(user) else: -- cgit From 0ae21e437775b056d346311bd9f50220e5d9fb28 Mon Sep 17 00:00:00 2001 From: adityacp Date: Tue, 27 Feb 2018 15:41:08 +0530 Subject: Change in models.py, views.py, urls.py, test_views.py, courses.html - Allow only deep cloning of a course - Remove tests for shallow course clone --- yaksh/views.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index b4b0c76..ce11558 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -2246,20 +2246,16 @@ def download_sample_csv(request): @login_required @email_verified -def duplicate_course(request, copy_type, course_id): +def duplicate_course(request, course_id): user = request.user course = Course.objects.get(id=course_id) if not is_moderator(user): raise Http404('You are not allowed to view this page!') if course.is_teacher(user) or course.is_creator(user): - if copy_type == "shallow": - # Link all the modules from current course to copied course - course.create_duplicate_course(user) - else: - # Create new entries of modules, lessons/quizzes - # from current course to copied course - course.create_shallow_copy(user) + # Create new entries of modules, lessons/quizzes + # from current course to copied course + course.create_duplicate_course(user) else: msg = dedent( '''\ -- cgit From 91fa9c6a40e16f43d935db9641b6833605afc1e8 Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Tue, 17 Oct 2017 12:48:51 +0530 Subject: Add a view to preview and download questionpapers --- yaksh/views.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index 011b417..0dab227 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 @@ -2744,3 +2745,20 @@ 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 download_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) + context = { + 'questions': paper._get_questions_for_answerpaper(), + 'paper': paper, + } + + return my_render_to_response( + 'yaksh/download_questionpaper.html', context + ) -- cgit From 7a892b8c664a69bd054efc6c662281e839546b7d Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Tue, 7 Nov 2017 15:49:35 +0530 Subject: - Change function names and urls to 'preview_questionpaper' - Add snippet to the questionpaper preview --- yaksh/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index 0dab227..94335a2 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -2749,7 +2749,7 @@ def _update_unit_status(course_id, user, unit): @login_required @email_verified -def download_questionpaper(request, questionpaper_id): +def preview_questionpaper(request, questionpaper_id): user = request.user if not is_moderator(user): raise Http404('You are not allowed to view this page!') @@ -2760,5 +2760,5 @@ def download_questionpaper(request, questionpaper_id): } return my_render_to_response( - 'yaksh/download_questionpaper.html', context + 'yaksh/preview_questionpaper.html', context ) -- cgit From 88fbad3f08dfcf8d139f8bc572860469c64e3104 Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Tue, 6 Mar 2018 20:47:42 +0530 Subject: Multiple fixes: - Add views test cases in test_views.py - Add minutes unit to preview_questionpaper template - Add error handling in views when random user accesses questionpaper --- yaksh/views.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index 94335a2..2b3c891 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -1883,7 +1883,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: @@ -2754,6 +2754,8 @@ def preview_questionpaper(request, questionpaper_id): 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, -- cgit From 9c5464a6edaaf2aaafc0e42fe88c8734fd952e12 Mon Sep 17 00:00:00 2001 From: mahesh Date: Mon, 15 Jan 2018 17:40:06 +0530 Subject: Add shuffle testcases option to questions --- yaksh/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index 011b417..17cfb13 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -616,7 +616,7 @@ def show_question(request, question, paper, error_message=None, notification=Non if question.type == "code" else 'You have already attempted this question' ) - test_cases = question.get_test_cases() + test_cases = question.get_ordered_test_cases(paper) files = FileUpload.objects.filter(question_id=question.id, hide=False) course = Course.objects.get(id=course_id) module = course.learning_module.get(id=module_id) -- cgit From 7fc24f1d4fe9208867ab38d600fa35a3c7b31386 Mon Sep 17 00:00:00 2001 From: mahesh Date: Tue, 16 Jan 2018 01:13:49 +0530 Subject: Add test case order in view_answerpaper --- yaksh/views.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index 17cfb13..27a07d2 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -616,7 +616,10 @@ def show_question(request, question, paper, error_message=None, notification=Non if question.type == "code" else 'You have already attempted this question' ) - test_cases = question.get_ordered_test_cases(paper) + if question.type in ['mcc', 'mcq']: + test_cases = question.get_ordered_test_cases(paper) + else: + test_cases = question.get_test_cases() files = FileUpload.objects.filter(question_id=question.id, hide=False) course = Course.objects.get(id=course_id) module = course.learning_module.get(id=module_id) -- cgit