Example #1
0
def do_quizchallenge( request, world, stage, challenge ):
    here = get_stage(world, stage)
    if not here.challenge:
        if here.tutorial: return redirect( "lesson", world = world, stage =stage )
        else: raise Http404()
    quizID = request.POST.get("quizID")
    challenge, answer_map = request.session.get(quizID)
    
    if challenge is None or answer_map is None: pass # raise shenanigans.
    
    # First we extract all of the responses from the form.
    responses = []
    q = 0
    while "q%d"%q in request.POST:
        responses.append( request.POST.getlist("q%d"%q) )
        q += 1
    
    # For each of the questions, we create a QuizAnswer and store it in the
    # answers list. Assuming we get all the way through without any shenanigans,
    # we'll save all of those models, then create a single QuizChallengeResponse
    # to hold them.
    answers = []
    score = 0
    total = 0
    for q in range(len(responses)):
        if q not in answer_map: pass # raise shenanigans.
        total += 1
        QA = QuizAnswer()
        raw_response_list = responses[q]
        QA.question, choice_map = answer_map[q]
        response_list = []
        for r in raw_response_list:
            if r in answer_map: response_list.append( answer_map[r] )
        if 'A' in response_list: QA.selectedA = True
        if 'B' in response_list: QA.selectedB = True
        if 'C' in response_list: QA.selectedC = True
        if 'D' in response_list: QA.selectedD = True
        if 'E' in response_list: QA.selectedE = True
        
        ans = True
        if QA.question.multiple_ok:
            if QA.selectedA != QA.question.correctA: ans = False
            if QA.selectedB != QA.question.correctB: ans = False
            if QA.selectedC != QA.question.correctC: ans = False
            if QA.selectedD != QA.question.correctD: ans = False
            if QA.selectedE != QA.question.correctE: ans = False
        else:
            ans = False
            if QA.selectedA == QA.question.correctA: ans = True
            if QA.selectedB == QA.question.correctB: ans = True
            if QA.selectedC == QA.question.correctC: ans = True
            if QA.selectedD == QA.question.correctD: ans = True
            if QA.selectedE == QA.question.correctE: ans = True
        if ans: score += 1
        QA.correct = ans
        
        answers.append(QA)
    
    # We made it through safely! Now we save the response in the DB.
    for QA in answers: QA.save()
    QCR = QuizChallengeResponse()
    QCR.quiz = challenge
    QCR.student = request.user.student
    QCR.score = score
    QCR.correct = (score == total)
    QCR.save()  # Can't do many-to-many until we save it once.
    for QA in answers: QCR.answers.add(QA)
    QCR.save()
    
    # If QCR was correct, add the stage to the Student's completion record.
    
    return HttpResponse( str(responses) )