Exemplo n.º 1
0
def adminpage(request):
    form = QuestionForm(request.POST)
    if form.is_valid():
        form.save()
        return redirect('quiz:adminpage')
    else:
        return render(request, 'AddQuestion.html', locals())
Exemplo n.º 2
0
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))
Exemplo n.º 3
0
def edit_question(question_id):
    question = Questions.query.get(question_id)
    answers = Answers.query.filter_by(question_id = question.id)
    wrong_answers = answers.filter_by(correct = 0).all()
    correct_answer = answers.filter_by(correct = 1).first()

    values = {
        'question': question.question_text,
        'wrong_answers': [a.answer_text for a in wrong_answers],
        'correct_answer': correct_answer.answer_text
    }

    form = QuestionForm(content = question.content_id)
    form.content.choices = [(r.id, r.title) for r in Content.query.all()]
    form.new_question = False

    if form.validate_on_submit():
        question.question_text = form.question.data
        question.content = Content.query.filter_by(id = form.content.data).first()
        wrong_answers[0].answer_text = form.first_answer.data
        wrong_answers[1].answer_text = form.second_answer.data
        wrong_answers[2].answer_text = form.third_answer.data
        correct_answer.answer_text = form.correct_answer.data
        db.session.commit()

        return redirect(url_for('quiz.questions'))

    return render_template('questions/edit.html', values=values, form=form)
Exemplo n.º 4
0
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))
Exemplo n.º 5
0
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))
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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))
Exemplo n.º 8
0
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')
Exemplo n.º 9
0
def add_question():
    form = QuestionForm(request.form)
    if request.method == 'POST':
        if form.validate():
            try:
                return _add_question_to_db_(request.form)
            except SQLAlchemyError:
                flash("We couldn't add your question due to a technical issue"
                      " on our side. Please try again later.")
        else:
            flash("Not all required fields were filled.")

    return _render_form_(form)
Exemplo n.º 10
0
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))
Exemplo n.º 11
0
def quiz():
    if current_user.is_authenticated:
        global limit, count

        form = QuestionForm()

        id = Questions.query.order_by(func.random()).first().id
        question = Questions.query.filter_by(id=id).first().question
        answer = Questions.query.filter_by(id=id).first().answer
        option1 = Questions.query.filter_by(id=id).first().option1
        option2 = Questions.query.filter_by(id=id).first().option2
        option3 = Questions.query.filter_by(id=id).first().option3

        choice = [('answer', answer), ('option1', option1),
                  ('option2', option2), ('option3', option3)]
        random.shuffle(choice)
        form.options.choices = choice

        if form.validate_on_submit():

            dat = form.options.data
            if dat == 'answer':
                flash(f'Correct!', 'success')
                count = count + 1
            else:
                flash(f'Incorrect!', 'danger')

            if limit >= 10:
                limit = 0

                score_user = current_user.username
                user = User.query.filter_by(username=score_user).first()
                user.score = count
                db.session.commit()
                return redirect(url_for('result'))

            return redirect(url_for('quiz'))
        limit = limit + 1

        return render_template('questions.html',
                               title='Quiz',
                               form=form,
                               question=question,
                               limit=str(limit))
    else:
        return redirect(url_for('login'))
Exemplo n.º 12
0
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
    })
Exemplo n.º 13
0
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})
Exemplo n.º 14
0
def add_question():
    form = QuestionForm()
    form.content.choices = [(r.id, r.title) for r in Content.query.all()]

    if form.validate_on_submit():
        question = Questions(question_text = form.question.data, content = Content.query.filter_by(id = form.content.data).first())
        answers = [
            Answers(answer_text = form.first_answer.data, correct = 0, question = question),
            Answers(answer_text = form.second_answer.data, correct = 0, question = question),
            Answers(answer_text = form.third_answer.data, correct = 0, question = question),
            Answers(answer_text = form.correct_answer.data, correct = 1, question = question)
        ]

        db.session.add(question)
        for answer in answers:
            db.session.add(answer)

        db.session.commit()
        return redirect(url_for('quiz.questions'))

    return render_template('questions/add.html', form=form)
Exemplo n.º 15
0
 def get_context_data(self, **kwargs):
     context = super(QuestionCreatePageView,
                     self).get_context_data(**kwargs)
     context['question_form'] = QuestionForm()
     if self.request.POST:
         context['answer_formset'] = AnswerFormSet(self.request.POST)
     else:
         context['answer_formset'] = AnswerFormSet(initial=[{
             'correct': True
         }])
         context['test'] = 'test'
     return context
Exemplo n.º 16
0
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))
Exemplo n.º 17
0
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())
Exemplo n.º 18
0
def quiz(request):
    global questions
    questions = Question.objects.all()
    FORM = []
    if request.method == "POST":
        choice = request.POST.get("title")
        if choice:
            k, v = eval(choice)
            request.session[str(k)] = v
        if DEBUG:
            print "request.session==================>", request.session.items()
            print "request.session[name]==================>",\
                request.session.get("name")
        page = request.session.get("page")
        if page <= request.session.get("num_pages"):
            url_ = "/quiz/quiz/?page={0}".format(page)
        else:
            # return HttpResponse("Reached the Final Page")
            url_ = "/quiz/result/"
        return redirect(url_)
    else:
        for q in questions:
            form = QuestionForm(q)
            FORM.append(form)
        paginator = Paginator(FORM, 1)
        print "request.GET==================>", request.GET
        page = request.GET.get("page")
        print "request.pageno==================>", paginator.num_pages
        request.session["num_pages"] = int(paginator.num_pages)
        try:
            if page:
                pages = int(page) + 1
                request.session["page"] = pages
            FORM = paginator.page(page)
        except PageNotAnInteger:
            FORM = paginator.page(1)
            request.session["page"] = 2
        except EmptyPage:
            FORM = paginator.page(
                paginator.num_pages)
        return render(request, 'quiz/questions.html', {'FORM': FORM})
Exemplo n.º 19
0
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)
Exemplo n.º 20
0
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
    })
Exemplo n.º 21
0
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
    })
Exemplo n.º 22
0
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
    })
Exemplo n.º 23
0
def _render_form_():
    form = QuestionForm()
    return render_template('add_question.html', form=form)
Exemplo n.º 24
0
 def setup_method(self, method):
     self.form = QuestionForm()
Exemplo n.º 25
0
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)