示例#1
0
文件: views.py 项目: MMoein/quizup
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))
示例#2
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
    })
示例#3
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})
示例#4
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')
示例#5
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())
示例#6
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)
示例#7
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)
示例#8
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
    })
示例#9
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
示例#10
0
文件: views.py 项目: jonstjohn/hone
 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
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
    })
示例#12
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)
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
    })
示例#14
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'))
示例#15
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})
示例#16
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)
示例#17
0
def _render_form_():
    form = QuestionForm()
    return render_template('add_question.html', form=form)
示例#18
0
 def setup_method(self, method):
     self.form = QuestionForm()