summaryrefslogtreecommitdiff
path: root/yaksh/views.py
diff options
context:
space:
mode:
authorprathamesh2016-10-04 16:57:25 +0530
committerprathamesh2016-10-04 16:57:25 +0530
commitc5ae3d4589a71c3f3b9f622c7b67a04277269cde (patch)
tree78bd889cb40f647db6ba152063dce47ae7b8f430 /yaksh/views.py
parent64bb8507cbfbaf8b4558926a0c3206eb85547ed1 (diff)
downloadonline_test-c5ae3d4589a71c3f3b9f622c7b67a04277269cde.tar.gz
online_test-c5ae3d4589a71c3f3b9f622c7b67a04277269cde.tar.bz2
online_test-c5ae3d4589a71c3f3b9f622c7b67a04277269cde.zip
Edit Question Paper Feature.
Can edit question paper. For creating new and editing existing question paper, same UI and view is used. Ajax previously used for creation is removed. Not necessary as post request handles the same. Removed unnecessary js.
Diffstat (limited to 'yaksh/views.py')
-rw-r--r--yaksh/views.py174
1 files changed, 93 insertions, 81 deletions
diff --git a/yaksh/views.py b/yaksh/views.py
index 4c5b9b8..f25a685 100644
--- a/yaksh/views.py
+++ b/yaksh/views.py
@@ -28,7 +28,7 @@ from yaksh.models import Profile, Answer, AnswerPaper, User, TestCase, FileUploa
from yaksh.forms import UserRegisterForm, UserLoginForm, QuizForm,\
QuestionForm, RandomQuestionForm,\
QuestionFilterForm, CourseForm, ProfileForm, UploadFileForm,\
- get_object_form, FileForm
+ get_object_form, FileForm, QuestionPaperForm
from settings import URL_ROOT
from yaksh.models import AssignmentUpload
from file_utils import extract_files
@@ -245,7 +245,7 @@ def add_quiz(request, course_id, quiz_id=None):
form = QuizForm(request.POST, user=user, course=course_id)
if form.is_valid():
form.save()
- return my_redirect(reverse('yaksh:design_questionpaper'))
+ return my_redirect("/exam/manage/courses/")
else:
context["form"] = form
return my_render_to_response('yaksh/add_quiz.html',
@@ -258,7 +258,7 @@ def add_quiz(request, course_id, quiz_id=None):
if form.is_valid():
form.save()
context["quiz_id"] = quiz_id
- return my_redirect("/exam/manage/")
+ return my_redirect("/exam/manage/courses/")
else:
if quiz_id is None:
form = QuizForm(course=course_id, user=user)
@@ -630,7 +630,6 @@ def courses(request):
raise Http404('You are not allowed to view this page')
courses = Course.objects.filter(creator=user, is_trial=False)
allotted_courses = Course.objects.filter(teachers=user, is_trial=False)
-
context = {'courses': courses, "allotted_courses": allotted_courses}
return my_render_to_response('yaksh/courses.html', context,
context_instance=ci)
@@ -812,6 +811,95 @@ def ajax_questions_filter(request):
{'questions': questions})
+def _get_questions(user, question_type, marks):
+ if question_type is None and marks is None:
+ return None
+ if question_type:
+ questions = Question.objects.filter(type=question_type, user=user)
+ if marks:
+ questions = questions.filter(points=marks)
+ return questions
+
+
+def _remove_already_present(questionpaper_id, questions):
+ if questionpaper_id is None:
+ return questions
+ questionpaper = QuestionPaper.objects.get(pk=questionpaper_id)
+ questions = questions.exclude(
+ id__in=questionpaper.fixed_questions.values_list('id', flat=True))
+ for random_set in questionpaper.random_questions.all():
+ questions = questions.exclude(
+ id__in=random_set.questions.values_list('id', flat=True))
+ return questions
+
+
+@login_required
+def design_questionpaper(request, quiz_id, questionpaper_id=None):
+ user = request.user
+
+ if not is_moderator(user):
+ raise Http404('You are not allowed to view this page!')
+
+ filter_form = QuestionFilterForm(user=user)
+ questions = None
+ marks = None
+ state = None
+ if questionpaper_id is None:
+ question_paper = QuestionPaper.objects.get_or_create(quiz_id=quiz_id)[0]
+ else:
+ question_paper = get_object_or_404(QuestionPaper, id=questionpaper_id)
+ qpaper_form = QuestionPaperForm(instance=question_paper)
+
+ if request.method == 'POST':
+
+ filter_form = QuestionFilterForm(request.POST, user=user)
+ qpaper_form = QuestionPaperForm(request.POST, instance=question_paper)
+ question_type = request.POST.get('question_type', None)
+ marks = request.POST.get('marks', None)
+ state = request.POST.get('is_active', None)
+
+ if 'add-fixed' in request.POST:
+ question_ids = request.POST.getlist('questions', None)
+ for question in Question.objects.filter(id__in=question_ids):
+ question_paper.fixed_questions.add(question)
+
+ if 'remove-fixed' in request.POST:
+ question_ids = request.POST.getlist('added-questions', None)
+ question_paper.fixed_questions.remove(*question_ids)
+
+ if 'add-random' in request.POST:
+ question_ids = request.POST.getlist('random_questions', None)
+ num_of_questions = request.POST.get('num_of_questions', 1)
+ if question_ids and marks:
+ random_set = QuestionSet(marks=marks, num_questions=num_of_questions)
+ random_set.save()
+ for question in Question.objects.filter(id__in=question_ids):
+ random_set.questions.add(question)
+ question_paper.random_questions.add(random_set)
+
+ if 'remove-random' in request.POST:
+ random_set_ids = request.POST.getlist('random_sets', None)
+ question_paper.random_questions.remove(*random_set_ids)
+
+ if 'save' in request.POST or 'back' in request.POST:
+ qpaper_form.save()
+ return my_redirect('/exam/manage/courses/')
+
+ if marks:
+ questions = _get_questions(user, question_type, marks)
+ questions = _remove_already_present(questionpaper_id, questions)
+
+ question_paper.update_total_marks()
+ question_paper.save()
+ random_sets = question_paper.random_questions.all()
+ fixed_questions = question_paper.fixed_questions.all()
+ context = {'qpaper_form': qpaper_form, 'filter_form': filter_form, 'qpaper':
+ question_paper, 'questions': questions, 'fixed_questions': fixed_questions,
+ 'state': state, 'random_sets': random_sets}
+ return my_render_to_response('yaksh/design_questionpaper.html', context,
+ context_instance=RequestContext(request))
+
+
@login_required
def show_all_questions(request):
"""Show a list of all the questions currently in the database."""
@@ -998,80 +1086,6 @@ def grade_user(request, quiz_id=None, user_id=None, attempt_number=None):
)
-@csrf_exempt
-def ajax_questionpaper(request, query):
- """
- During question paper creation, ajax call made to get question details.
- """
-
- user = request.user
- if query == 'marks':
- question_type = request.POST.get('question_type')
- questions = Question.objects.filter(type=question_type, user=user)
- marks = questions.values_list('points').distinct()
- return my_render_to_response('yaksh/ajax_marks.html', {'marks': marks})
- elif query == 'questions':
- question_type = request.POST['question_type']
- marks_selected = request.POST['marks']
- fixed_questions = request.POST.getlist('fixed_list[]')
- fixed_question_list = ",".join(fixed_questions).split(',')
- random_questions = request.POST.getlist('random_list[]')
- random_question_list = ",".join(random_questions).split(',')
- question_list = fixed_question_list + random_question_list
- questions = list(Question.objects.filter(type=question_type,
- points=marks_selected, user=user))
- questions = [question for question in questions \
- if not str(question.id) in question_list]
- return my_render_to_response('yaksh/ajax_questions.html',
- {'questions': questions})
-
-
-@login_required
-def design_questionpaper(request):
- user = request.user
- ci = RequestContext(request)
-
- if not is_moderator(user):
- raise Http404('You are not allowed to view this page!')
-
- if request.method == 'POST':
- fixed_questions = request.POST.getlist('fixed')
- random_questions = request.POST.getlist('random')
- random_number = request.POST.getlist('number')
- is_shuffle = request.POST.get('shuffle_questions', False)
- if is_shuffle == 'on':
- is_shuffle = True
-
- question_paper = QuestionPaper(shuffle_questions=is_shuffle)
- quiz = Quiz.objects.order_by("-id")[0]
- tot_marks = 0
- question_paper.quiz = quiz
- question_paper.total_marks = tot_marks
- question_paper.save()
- if fixed_questions:
- fixed_questions_ids = ",".join(fixed_questions)
- fixed_questions_ids_list = fixed_questions_ids.split(',')
- for question_id in fixed_questions_ids_list:
- question_paper.fixed_questions.add(question_id)
- if random_questions:
- for random_question, num in zip(random_questions, random_number):
- qid = random_question.split(',')[0]
- question = Question.objects.get(id=int(qid))
- marks = question.points
- question_set = QuestionSet(marks=marks, num_questions=num)
- question_set.save()
- for question_id in random_question.split(','):
- question_set.questions.add(question_id)
- question_paper.random_questions.add(question_set)
- question_paper.update_total_marks()
- question_paper.save()
- return my_redirect('/exam/manage/courses')
- else:
- form = RandomQuestionForm()
- context = {'form': form, 'questionpaper':True}
- return my_render_to_response('yaksh/design_questionpaper.html',
- context, context_instance=ci)
-
@login_required
def view_profile(request):
""" view moderators and users profile """
@@ -1150,7 +1164,6 @@ def search_teacher(request, course_id):
Q(id=course.creator.id))
context['success'] = True
context['teachers'] = teachers
-
return my_render_to_response('yaksh/addteacher.html', context,
context_instance=ci)
@@ -1179,7 +1192,6 @@ def add_teacher(request, course_id):
course.add_teachers(*teachers)
context['status'] = True
context['teachers_added'] = teachers
-
return my_render_to_response('yaksh/addteacher.html', context,
context_instance=ci)
@@ -1187,7 +1199,7 @@ def add_teacher(request, course_id):
@login_required
def remove_teachers(request, course_id):
""" remove user from a course """
-
+
user = request.user
course = get_object_or_404(Course, pk=course_id)
if not is_moderator(user) and (user != course.creator and user not in course.teachers.all()):