From 94e54b9eeed54d28b374fa6e4a2b23e49acafd5b Mon Sep 17 00:00:00 2001 From: Tom Walker Date: Tue, 11 Feb 2014 16:45:07 +0000 Subject: [PATCH] cleaned up --- multichoice/models.py | 2 +- quiz/admin.py | 6 +- quiz/models.py | 15 +++-- quiz/templatetags/quiz_tags.py | 16 ++++- quiz/urls.py | 15 +++-- quiz/views.py | 113 +++++++++++++++++++-------------- 6 files changed, 104 insertions(+), 63 deletions(-) diff --git a/multichoice/models.py b/multichoice/models.py index 56efd9f..fbef01e 100644 --- a/multichoice/models.py +++ b/multichoice/models.py @@ -49,4 +49,4 @@ class Answer(models.Model): ) def __unicode__(self): - return self.content \ No newline at end of file + return self.content diff --git a/quiz/admin.py b/quiz/admin.py index 2ad345e..de383b6 100644 --- a/quiz/admin.py +++ b/quiz/admin.py @@ -1,8 +1,8 @@ from django import forms from django.contrib import admin from django.contrib.admin.widgets import FilteredSelectMultiple -from quiz.models import Quiz, Category, Progress -from multichoice.models import Question, Answer +from django_quiz.quiz.models import Quiz, Category, Progress +from django_quiz.multichoice.models import Question, Answer class QuestionInline(admin.TabularInline): model = Question.quiz.through @@ -77,4 +77,4 @@ class ProgressAdmin(admin.ModelAdmin): admin.site.register(Quiz, QuizAdmin) admin.site.register(Category, CategoryAdmin) admin.site.register(Question, QuestionAdmin) -admin.site.register(Progress, ProgressAdmin) \ No newline at end of file +admin.site.register(Progress, ProgressAdmin) diff --git a/quiz/models.py b/quiz/models.py index d981b9d..b674449 100644 --- a/quiz/models.py +++ b/quiz/models.py @@ -174,7 +174,10 @@ class Progress(models.Model): if match: score = int(match.group(1)) possible = int(match.group(2)) - percent = int(round((float(score) / float(possible)) * 100)) + try: + percent = int(round((float(score) / float(possible)) * 100)) + except: + percent = 0 score_list = [score, possible, percent] output[cat.category] = score_list @@ -272,12 +275,10 @@ class Progress(models.Model): """ finds the previous exams marked as 'exam papers' - returns a queryset of the exams + returns a queryset of complete exams """ - - exams = Sitting.objects.filter(user=self.user).filter(complete=True) # list of exam objects from user that are complete - return exams - + # list of exam objects from user that are complete + return Sitting.objects.filter(user=self.user).filter(complete=True) class SittingManager(models.Manager): @@ -414,4 +415,4 @@ class Sitting(models.Model): """ question_list = self.incorrect_questions # string of question IDs as CSV ie 32,19,22,3,75 split_questions = question_list.split(',') # list of strings ie [32,19,22,3,75] - return split_questions \ No newline at end of file + return split_questions diff --git a/quiz/templatetags/quiz_tags.py b/quiz/templatetags/quiz_tags.py index cc6d2c1..314311c 100644 --- a/quiz/templatetags/quiz_tags.py +++ b/quiz/templatetags/quiz_tags.py @@ -34,10 +34,22 @@ def correct_answer_for_all_with_users_incorrect(context, question, incorrect_lis processes the correct answer based on a given question object if the answer is incorrect, informs the user """ - answers = Answer.objects.filter(question__id=question.id) # if question was answered wrongly, tell the user + answers = Answer.objects.filter(question__id=question.id) question_id = str(question.id) if question_id in incorrect_list: user_was_incorrect = True else: user_was_incorrect = False - return {'answers': answers, 'user_was_incorrect': user_was_incorrect, } \ No newline at end of file + return {'answers': answers, 'user_was_incorrect': user_was_incorrect, } + +@register.inclusion_tag('user_previous_exam.html', takes_context=True) +def user_previous_exam(context, exam): + """ + Provides details of finished exams + """ + title = exam.quiz.title + final_score = exam.current_score + possible_score = exam.quiz.question_set.count() + percent = int(round((float(final_score) / float(possible_score)) * 100)) + return {'title': title, 'score': final_score, + 'possible': possible_score, 'percent': percent, } diff --git a/quiz/urls.py b/quiz/urls.py index d120d84..e2aaddc 100644 --- a/quiz/urls.py +++ b/quiz/urls.py @@ -8,10 +8,17 @@ urlpatterns = patterns('', # passes variable 'quiz_name' to quiz_take view - url(r'^(?P[\w-]+)/$', 'quiz.views.quiz_take'), # quiz/ - url(r'^(?P[\w-]+)$', 'quiz.views.quiz_take'), # quiz - url(r'^(?P[\w-]+)/take/$', 'quiz.views.quiz_take') # quiz/take/ - url(r'^(?P[\w-]+)take$', 'quiz.views.quiz_take') # quiz/take + url(r'^(?P[\w-]+)/$', + 'quiz.views.quiz_take'), # quiz/ + + url(r'^(?P[\w-]+)$', + 'quiz.views.quiz_take'), # quiz + + url(r'^(?P[\w-]+)/take/$', + 'quiz.views.quiz_take'), # quiz/take/ + + url(r'^(?P[\w-]+)take$', + 'quiz.views.quiz_take') # quiz/take diff --git a/quiz/views.py b/quiz/views.py index d45c780..e7d70f9 100644 --- a/quiz/views.py +++ b/quiz/views.py @@ -47,7 +47,8 @@ def quiz_take(request, quiz_name): 2. Decides whether this is the start of a new quiz. """ - quiz = Quiz.objects.get(url=quiz_name.lower()) # url refers to the SEO friendly url specified in model.quiz + quiz = Quiz.objects.get(url=quiz_name.lower()) + # url refers to the SEO friendly url specified in model.quiz if request.user.is_authenticated() == True: # logged in user try: @@ -76,8 +77,9 @@ def quiz_take(request, quiz_name): else: # anon user quiz_id = str(quiz.id) q_list = quiz_id + "_q_list" - - if q_list in request.session: # check if anon user has a recent session for this quiz + + # check if anon user has a recent session for this quiz + if q_list in request.session: return load_anon_next_question(request, quiz) # load up previous session else: return new_anon_quiz_session(request, quiz) # new session for anon user @@ -93,7 +95,8 @@ def new_anon_quiz_session(request, quiz): questions = quiz.question_set.all() question_list = [] for question in questions: - question_list.append(question.id) # question_list is a list of question IDs, which are integers + # question_list is a list of question IDs, which are integers + question_list.append(question.id) if quiz.random_order == True: random.shuffle(question_list) @@ -111,6 +114,7 @@ def new_anon_quiz_session(request, quiz): return load_anon_next_question(request, quiz) + def user_new_quiz_session(request, quiz): """ initialise the Sitting class @@ -121,9 +125,8 @@ def user_new_quiz_session(request, quiz): request.session['page_count'] = int(0) # session page count for adverts return user_load_next_question(request, sitting, quiz) - - + def load_anon_next_question(request, quiz): """ load up the next question, including the outcome of the previous question @@ -135,13 +138,14 @@ def load_anon_next_question(request, quiz): if 'guess' in request.GET and request.GET['guess']: # if there has been a previous question - previous = question_check_anon(request, quiz) # returns a dictionary with previous question details - + # returns a dictionary with previous question details + previous = question_check_anon(request, quiz) + question_list = question_list[1:] # move onto next question request.session[q_list] = question_list counter = request.session['page_count'] - request.session['page_count'] = counter + 1 # add 1 to the page counter + request.session['page_count'] = counter + 1 # add 1 to the page counter if not request.session[q_list]: # no questions left! @@ -149,15 +153,21 @@ def load_anon_next_question(request, quiz): show_advert = False - try: - if request.session['page_count'] > 0 and request.session['page_count'] % 10 == 0: - # advert page every 10 questions - counter = request.session['page_count'] - request.session['page_count'] = counter + 1 # add 1 to the page counter - show_advert = True + """ + This is a counter that allows you to add something into the template every + X amount of pages. In my original site, I used this to show a full page + advert every 10 pages. + """ + + # try: + # if request.session['page_count'] > 0 and request.session['page_count'] % 10 == 0: + # # advert page every 10 questions + # counter = request.session['page_count'] + # request.session['page_count'] = counter + 1 # add 1 to the page counter + # show_advert = True - except KeyError: - request.session['page_count'] = int(0) # since one hasnt been started, make it now + # except KeyError: + # request.session['page_count'] = int(0) # since one hasnt been started, make it now next_question_id = question_list[0] question = Question.objects.get(id=next_question_id) @@ -169,7 +179,7 @@ def load_anon_next_question(request, quiz): 'show_advert': show_advert, }, context_instance=RequestContext(request)) - + def user_load_next_question(request, sitting, quiz): """ @@ -179,33 +189,34 @@ def user_load_next_question(request, sitting, quiz): if 'guess' in request.GET and request.GET['guess']: # if there has been a previous question - previous = question_check_user(request, quiz, sitting) # returns a dictionary with previous question details + # returns a dictionary with previous question details + previous = question_check_user(request, quiz, sitting) sitting.remove_first_question() # remove the first question counter = request.session['page_count'] request.session['page_count'] = counter + 1 # add 1 to the page counter - + question_ID = sitting.get_next_question() - + if question_ID == False: # no questions left return final_result_user(request, sitting, previous) show_advert = False - try: - if request.session['page_count'] > 0 and request.session['page_count'] % 10 == 0: - # advert page every 10 questions - counter = request.session['page_count'] - request.session['page_count'] = counter + 1 # add 1 to the page counter - show_advert = True - - except KeyError: - request.session['page_count'] = int(0) # since one hasnt been started, make it now + # try: + # if request.session['page_count'] > 0 and request.session['page_count'] % 10 == 0: + # # advert page every 10 questions + # counter = request.session['page_count'] + # request.session['page_count'] = counter + 1 # add 1 to the page counter + # show_advert = True + # except KeyError: + # request.session['page_count'] = int(0) # since one hasnt been started, make it now + next_question = Question.objects.get(id=question_ID) - + return render_to_response('question.html', {'quiz': quiz, 'question': next_question, @@ -214,7 +225,7 @@ def user_load_next_question(request, sitting, quiz): }, context_instance=RequestContext(request) ) - + def final_result_anon(request, quiz, previous): """ @@ -233,7 +244,7 @@ def final_result_anon(request, quiz, previous): session_score, session_possible = anon_session_score(request) - if quiz.answers_at_end != True: # if answer was shown after each question + if quiz.answers_at_end == False: # if answer was shown after each question return render_to_response('result.html', { 'score': score, @@ -259,6 +270,7 @@ def final_result_anon(request, quiz, previous): context_instance=RequestContext(request) ) + def final_result_user(request, sitting, previous): """ The result page for a logged in user @@ -274,7 +286,7 @@ def final_result_user(request, sitting, previous): if quiz.exam_paper == False: # if we do not plan to store the outcome sitting.delete() # delete the sitting to free up DB space - if quiz.answers_at_end != True: # answer was shown after each question + if quiz.answers_at_end == False: # answer was shown after each question return render_to_response('result.html', { 'quiz': quiz, @@ -302,7 +314,8 @@ def final_result_user(request, sitting, previous): def question_check_anon(request, quiz): """ - check if a question is correct, adds to score if needed and return the previous questions details + check if a question is correct, adds to score if needed + and return the previous questions details """ quiz_id = str(quiz.id) guess = request.GET['guess'] @@ -322,22 +335,26 @@ def question_check_anon(request, quiz): anon_session_score(request, 0, 1) if quiz.answers_at_end != True: # display answer after each question - return {'previous_answer': answer, 'previous_outcome': outcome, 'previous_question': question, } + return {'previous_answer': answer, + 'previous_outcome': outcome, 'previous_question': question, } + else: # display all answers at end return {} + def question_check_user(request, quiz, sitting): """ - check if a question is correct, adds to score if needed and return the previous questions details + check if a question is correct, adds to score if needed + and return the previous questions details """ quiz_id = str(quiz.id) guess = request.GET['guess'] # id of the guessed answer answer = Answer.objects.get(id=guess) - question = answer.question # the question object (only 1 question related to an answer) + question = answer.question # question object (only question related to an answer) if answer.correct == True: outcome = "correct" - sitting.add_to_score(1) # add 1 to sitting score. to do: allow variable point values + sitting.add_to_score(1) # add 1 to sitting score. user_progress_score_update(request, question.category, 1, 1) else: outcome = "incorrect" @@ -345,9 +362,11 @@ def question_check_user(request, quiz, sitting): user_progress_score_update(request, question.category, 0, 1) if quiz.answers_at_end != True: # display answer after each question - return {'previous_answer': answer, 'previous_outcome': outcome, 'previous_question': question, } + return {'previous_answer': answer, + 'previous_outcome': outcome, 'previous_question': question, } else: # display all answers at end - return {} + return {} + def user_progress_score_update(request, category, score, possible): """ @@ -361,7 +380,7 @@ def user_progress_score_update(request, category, score, possible): progress = Progress.objects.new_progress(request.user) progress.update_score(category, score, possible) - + def anon_session_score(request, add=0, possible=0): """ @@ -411,19 +430,21 @@ def progress(request): except Progress.DoesNotExist: - # viewing progress for first time. Most likely just signed up as redirect to progress after signup - # no current progress object, make one + # viewing progress for first time. + # Most likely just signed up as redirect to progress after signup + # no current progress object, make one progress = Progress.objects.new_progress(request.user) return render_to_response('progress.html', {'new_user': True,}, context_instance=RequestContext(request) ) - cat_scores = progress.list_all_cat_scores() # dict {category name: list of three integers [score, possible, percent]} + cat_scores = progress.list_all_cat_scores() + # dict {category name: list of three integers [score, possible, percent]} exams = progress.show_exams() # queryset of the exams a user has sat return render_to_response('progress.html', {'cat_scores': cat_scores, 'exams': exams}, context_instance=RequestContext(request) - ) \ No newline at end of file + ) -- 2.39.5