def questionEdit(request, quiz_pk, question_pk): quiz = get_object_or_404(Quiz, pk=quiz_pk, owner=request.user) question = get_object_or_404(Question, pk=question_pk, quiz=quiz) AnswerFormSet = inlineformset_factory(Question, Answer, formset=BaseAnswerInlineFormset, fields=("content", "is_correct"), min_num=4, validate_min=True, max_num=4, validate_max=True) if request.method == "POST": form = QuestionForm(request.POST, instance=question) formset = AnswerFormSet(request.POST, instance=question) if form.is_valid() and formset.is_valid(): form.save() formset.save() return redirect('quizEdit', quiz.pk) else: form = QuestionForm(instance=question) formset = AnswerFormSet(instance=question) return render(request, 'Question/questionEdit.html', { 'quiz': quiz, 'question': question, 'form': form, 'formset': formset })
def adminpage(request): form = QuestionForm(request.POST) if form.is_valid(): form.save() return redirect('quiz:adminpage') else: return render(request, 'AddQuestion.html', locals())
def question_view(request, quiz_id, question_id): """ opens the selected question in the preview mode. """ """ update the quiz, given its id. """ quiz = Quiz.objects.get(id=quiz_id) #two unnecessary sql queries. question = Question.objects.get(id=question_id) questions = quiz.question_set.all() if request.method == "POST": question_form = QuestionForm(request.POST, request.FILES, instance=question) question_form.is_update = True if question_form.is_valid(): question_form.save() return HttpResponseRedirect(reverse("quiz.views.question_view", args=[quiz_id, question_id])) else: #GET request. question_form = QuestionForm(instance=question) return render_to_response("quiz/create_question.html", { "question_form" : question_form, ##this is a redundant field, passed here; must be removed. "selected_question": question, "questions" : questions, "quizobj" : quiz, }, context_instance=RequestContext(request)) #generic case return render_to_response("quiz/create_question.html", { "question_form" : question_form, ##this is a redundant field, passed here; must be removed. "selected_question" : question, "questions" : questions, "quizobj" : quiz, }, context_instance=RequestContext(request))
def question_new(request, quiz_id): """ returns a template to create a new quiz. """ quiz = Quiz.objects.get(id=quiz_id) questions = quiz.question_set.all() if request.method == "POST": question_form = QuestionForm(request.POST, request.FILES) if question_form.is_valid(): new_question = question_form.save(commit=False) new_question.qQuiz = quiz new_question.save() return HttpResponseRedirect(reverse("quiz.views.question_new", args=[quiz_id])) #GET Request else: question_form = QuestionForm() return render_to_response('quiz/create_question.html', { "question_form" : question_form, "questions" : questions, "quizobj" : quiz, }, context_instance=RequestContext(request)) return render_to_response('quiz/create_question.html', { "question_form" : question_form, "questions" : questions, "quizobj" : quiz, }, context_instance=RequestContext(request))
def add_question(request): if not request.user.is_authenticated(): return redirect(reverse('login')) errors = [] if request.method == 'POST': question_form = QuestionForm(data=request.POST) if question_form.is_valid(): question_form.save() new_question_form = QuestionForm() return render_to_response('quiz/add_question.html', {'question_form': new_question_form, 'messages': u'سوال جدید اضافه شد'}, context_instance=RequestContext(request)) else: return render_to_response('quiz/add_question.html', {'question_form': question_form, 'error_message': question_form.errors}, context_instance=RequestContext(request)) elif request.method == 'GET': question_form = QuestionForm() return render_to_response('quiz/add_question.html', {'question_form': question_form, 'error_message': errors}, context_instance=RequestContext(request))
def add_question(request): if not request.user.is_authenticated(): return redirect(reverse('login')) errors = [] if request.method == 'POST': question_form = QuestionForm(data=request.POST) if question_form.is_valid(): question_form.save() new_question_form = QuestionForm() return render_to_response('quiz/add_question.html', { 'question_form': new_question_form, 'messages': u'سوال جدید اضافه شد' }, context_instance=RequestContext(request)) else: return render_to_response('quiz/add_question.html', { 'question_form': question_form, 'error_message': question_form.errors }, context_instance=RequestContext(request)) elif request.method == 'GET': question_form = QuestionForm() return render_to_response('quiz/add_question.html', { 'question_form': question_form, 'error_message': errors }, context_instance=RequestContext(request))
def questionform_view(request): form = QuestionForm() if request.method == "POST": form = QuestionForm(request.POST) if form.is_valid(): form.save() return redirect('quiz:list') return render(request, 'quiz/question.html', {'form': form})
def question_create(request, quiz_id, question_id=None): """ returns a template to create a new quiz. """ quiz = get_object_or_404(Quiz, id=quiz_id, owner=request.user) iscomplete = True if request.method == "POST": question_form = QuestionForm(request.POST) answer_formset = AnswerFormSet(request.POST) if question_form.is_valid() and answer_formset.is_valid(): """ @todo : this must be moved to the quiz-manager """ new_question = question_form.save(commit=False) new_question.number = (quiz.quiz_questions.aggregate(Max('number'))['number__max'] or 0) +1 new_question.owner = request.user new_question.quiz = quiz new_question.save() for answer_form in answer_formset.forms: new_answer = answer_form.save(commit=False) new_answer.owner = request.user new_answer.question = new_question new_answer.save() ##status updation is ugly, must be fixed. iscomplete = iscomplete and not (new_answer.option == '') ##status updation is ugly, must be fixed. iscomplete = iscomplete and not (new_question.text == '') if iscomplete: new_question.status = "complete" new_question.save() if len(quiz.quiz_questions.filter(status="incomplete")) == 0: quiz.status = "complete" else: quiz.status = "incomplete" quiz.save() request.user.message_set.create(message="the question was created successfully. yeppie! add another") return HttpResponseRedirect(reverse("quiz.views.question_create", args=[quiz_id])) #GET Request else: question_form = QuestionForm() answer_formset = AnswerFormSet(queryset=Answer.objects.none()) return render_to_response('quiz/question_form.html', { "question_form" : question_form, "answer_formset" : answer_formset, "questions" : quiz.quiz_questions.all().order_by('number'), "quizobj" : quiz, "selected_button" : "create", "current_question" : (quiz.quiz_questions.aggregate(Max('number'))['number__max'] or 0) +1, "pagetitle" : "Create Question", }, context_instance=RequestContext(request))
def test_valid_questionForm(): data = { "content": "question", "difficulty": 1, "theme1": "t1", "theme2": "t2", "theme3": "t3", "order": 1, } form = QuestionForm(data) assert form.is_valid() is True
def question_update(request, quiz_id, question_id): """ opens the selected question in the preview mode. """ quiz = get_object_or_404(Quiz, id=quiz_id, owner=request.user) question = get_object_or_404(Question, quiz=quiz, number=question_id) answers = Answer.objects.filter(question=question) iscomplete = True if request.method == "POST": question_form = QuestionForm(request.POST, instance=question) answer_formset = AnswerFormSet(request.POST) if question_form.is_valid() and answer_formset.is_valid(): answers.delete() new_question = question_form.save() for answer_form in answer_formset.forms: answer_form = answer_form.save(commit=False) answer_form.owner = request.user answer_form.question = question answer_form.save() ##status updation is ugly, must be fixed. iscomplete = iscomplete and not (answer_form.option == '') ##status updation is ugly, must be fixed. iscomplete = iscomplete and not (new_question.text == '') if iscomplete: new_question.status = "complete" else: new_question.status = "incomplete" new_question.save() if len(quiz.quiz_questions.filter(status="incomplete")) == 0: quiz.status = "complete" else: quiz.status = "incomplete" quiz.save() request.user.message_set.create(message="the question was updated successfully :D ") return HttpResponseRedirect(reverse("quiz.views.question_view", args=[quiz_id, question_id])) #GET Request else: question_form = QuestionForm(instance=question) answer_formset = AnswerFormSet(queryset=Answer.objects.filter(question=question)) return render_to_response("quiz/question_form.html", { "quizobj" : quiz, "questions" : quiz.quiz_questions.all().order_by('number'), "question_form" : question_form, "answer_formset" : answer_formset, "selected_question": question, "pagetitle" : "Update Question", }, context_instance=RequestContext(request))
def exam(request, quiz_name_slug): if request.method == 'GET': try: question_id = request.session.get('current_deck', []).pop() request.session['current_question'] = question_id question = Questions.objects.get(id=question_id) form = QuestionForm(question=question) pics = { answer.id: answer.answer_pic for answer in question.get_answers() } context_dict = { 'question': question, 'form': form, 'pics': pics, 'quiz_name_slug': quiz_name_slug, 'answered': request.session.get('answered', 0), 'deck_length': request.session.get('deck_length', 0) } return render(request, 'quiz/question.html', context_dict) except IndexError: # questions in deck are finished print('deck is empty') return redirect(f'/quiz/{quiz_name_slug}/result') elif request.method == 'POST': question_id = request.session.get('current_question', 0) question = Questions.objects.get(id=question_id) form = QuestionForm(request.POST, question=question) answered = request.session.get('answered', 0) deck = request.session.get('current_deck', []) if form.is_valid(): user_answers = set(form.cleaned_data['answers']) correct_answers = set( str(answer.id) for answer in question.get_right_answer()) user_answer_is_correct = user_answers == correct_answers question.user_answered(request.user, user_answer_is_correct) if not user_answer_is_correct: request.session['user_answers'][question_id] = list( user_answers) # in learning mode show right answer after each question, exam mode shows answers only in the end if request.session.get('exam', False) or user_answer_is_correct: request.session['answered'] = answered + 1 return redirect(f'/quiz/{quiz_name_slug}/exam') else: deck.append(question_id) shuffle(deck) request.session['current_deck'] = deck return redirect(f'/quiz/{quiz_name_slug}/result') else: deck.append(question_id) shuffle(deck) request.session['current_deck'] = deck return redirect(f'/quiz/{quiz_name_slug}/exam')
def add_question(request, quiz_id): quiz = get_object_or_404(Quiz, pk=quiz_id) context = {'quiz': quiz} if request.method == 'POST': form = QuestionForm(request.POST) if form.is_valid(): question = form.save() if form.cleaned_data['add_another']: return redirect('quiz:add_question', quiz.id) else: return redirect('quiz:quiz', quiz_id) else: form = QuestionForm(initial={'quiz': quiz}) context['form'] = form return render(request, 'quiz/add_question.html', context)
def questionAdd(request, pk): quiz = get_object_or_404(Quiz, pk=pk, owner=request.user) if request.method == "POST": form = QuestionForm(request.POST) if form.is_valid(): question = form.save(commit=False) question.quiz = quiz quiz.total_marks = quiz.total_marks + question.marks quiz.save() question.save() return redirect('questionEdit', quiz.pk, question.pk) else: form = QuestionForm() return render(request, 'Question/questionAdd.html', { 'quiz': quiz, 'form': form })
def question_change(request, quiz_pk, question_pk): # Simlar to the `question_add` view, this view is also managing # the permissions at object-level. By querying both `quiz` and # `question` we are making sure only the owner of the quiz can # change its details and also only questions that belongs to this # specific quiz can be changed via this url (in cases where the # user might have forged/player with the url params. quiz = get_object_or_404(Quiz, pk=quiz_pk, owner=request.user) question = get_object_or_404(Question, pk=question_pk, quiz=quiz) AnswerFormSet = inlineformset_factory( Question, # parent model Answer, # base model formset=BaseAnswerInlineFormSet, fields=('text', 'is_correct'), min_num=2, validate_min=True, max_num=10, validate_max=True) if request.method == 'POST': form = QuestionForm(request.POST, instance=question) formset = AnswerFormSet(request.POST, instance=question) if form.is_valid() and formset.is_valid(): with transaction.atomic(): form.save() formset.save() messages.success(request, 'Question and answers saved with success!') return redirect('instructor:quiz_change', quiz.pk) else: form = QuestionForm(instance=question) formset = AnswerFormSet(instance=question) return render(request, 'question_change_form.html', { 'quiz': quiz, 'question': question, 'form': form, 'formset': formset })
def question_add(request, pk): # By filtering the quiz by the url keyword argument `pk` and # by the owner, which is the logged in user, we are protecting # this view at the object-level. Meaning only the owner of # quiz will be able to add questions to it. quiz = get_object_or_404(Quiz, pk=pk, owner=request.user) if request.method == 'POST': form = QuestionForm(request.POST) if form.is_valid(): question = form.save(commit=False) question.quiz = quiz question.save() messages.success( request, 'You may now add answers/options to the question.') return redirect('instructor:question_change', quiz.pk, question.pk) else: form = QuestionForm() return render(request, 'question_add_form.html', { 'quiz': quiz, 'form': form })
def question(request, slug=None): if slug is None: question = request.current_quiz.start() request.session['ticket'] = [request.path] else: question = get_object_or_404(request.current_quiz.question_set, slug=slug) ticket = request.session.get('ticket', []) valid = request.path in ticket if valid: cur_index = ticket.index(request.path) if cur_index: previous_url = ticket[cur_index - 1] elif ticket: valid_url = ticket[-1] if request.method == 'POST' and valid: form = QuestionForm(question, request.POST) if form.is_valid(): answer = form.cleaned_data['answer'] where_to = answer.where_to() del ticket[cur_index + 1:] try: del ticket[ticket.index(where_to) + 1:] except ValueError: ticket.append(where_to) request.session['ticket'] = ticket return redirect(where_to) else: form = QuestionForm(question) return render(request, "quiz/question_detail.html", locals())
def show_new_question(request): context = RequestContext(request) if not QuizProfile.objects.all().filter(user=request.user): quiz_profile = QuizProfile(user=request.user, total_score = 0.0, fb_share_key = ''.join(random.choice(string.letters) for i in xrange(300))) quiz_profile.save() else: quiz_profile = get_object_or_404(QuizProfile, user=request.user) if request.method == 'POST': # If the form has been submitted... form = QuestionForm(request.POST) if form.is_valid(): submitted_option = form.cleaned_data['correct_option'] submitted_question = get_object_or_404(Question, pk= int(request.POST['question'])) attempted_question = get_object_or_404(AttemptedQuestion, player = quiz_profile, question = submitted_question,) if attempted_question.answered: return HttpResponseRedirect("/quiz/") time_taken = float(request.POST['time_taken']) marks = 0.0 if submitted_question.correct_option == int(submitted_option): success = True if time_taken <= submitted_question.max_time and time_taken >= submitted_question.min_time: marks = submitted_question.max_marks*submitted_question.min_time/time_taken elif time_taken < submitted_question.min_time: marks = submitted_question.max_marks else: success = False marks = round(marks,2) alert = False attempted_question.time_taken = time_taken attempted_question.server_time_taken = calc_time(attempted_question.time, datetime.datetime.now()) if attempted_question.server_time_taken - attempted_question.time_taken > 10: marks = 0.0 alert = True attempted_question.marks_obtained = marks attempted_question.answered = True attempted_question.save() quiz_profile.update() return render_to_response( "quiz/submit_done.html", {"opt":submitted_option, "success":success,"question": submitted_question, "marks":marks, "time":time_taken, "alert":alert, }, context_instance = context) else: form = QuestionForm() questions = Question.objects.all() attempted_questions = AttemptedQuestion.objects.all().filter(player__user = request.user) limit_exceeded = False aqs_today = AttemptedQuestion.objects.filter(player__user= request.user, time__day=datetime.datetime.now().day) aqs = [] daily_limit = 30 if len(questions) == len(attempted_questions) or len(questions) == 0 or aqs_today.count() >= daily_limit : if aqs_today.count() >= daily_limit: limit_exceeded = True return render_to_response( "quiz/no_active_question.html",{"limit_exceeded":limit_exceeded, "daily_limit":daily_limit}, context_instance = context) for a in attempted_questions: try: aqs.append(a.question) except: continue while True: q = questions[random.randint(0, len(questions)-1)] if q in aqs: continue else: break attempted_question = AttemptedQuestion(question = q, player = quiz_profile) attempted_question.save() quiz_profile.update() return render_to_response( "quiz/show_new_question.html", {"question":q, "form":form }, context_instance = context)