Skip to content

Commit 4eaa73c

Browse files
committed
added reputation
1 parent 76671c0 commit 4eaa73c

File tree

7 files changed

+58
-16
lines changed

7 files changed

+58
-16
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Generated by Django 2.2.3 on 2019-10-08 07:04
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('classroom', '0002_create_initial_subjects'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='student',
15+
name='score',
16+
field=models.IntegerField(default=0),
17+
),
18+
migrations.AddField(
19+
model_name='takenquiz',
20+
name='percentage',
21+
field=models.FloatField(default=0),
22+
preserve_default=False,
23+
),
24+
migrations.AlterField(
25+
model_name='takenquiz',
26+
name='score',
27+
field=models.IntegerField(),
28+
),
29+
]

django_school/classroom/models.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ class Student(models.Model):
5252
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
5353
quizzes = models.ManyToManyField(Quiz, through='TakenQuiz')
5454
interests = models.ManyToManyField(Subject, related_name='interested_students')
55+
56+
# User reputation score.
57+
score = models.IntegerField(default=0)
5558

5659
def get_unanswered_questions(self, quiz):
5760
answered_questions = self.quiz_answers \
@@ -67,7 +70,8 @@ def __str__(self):
6770
class TakenQuiz(models.Model):
6871
student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name='taken_quizzes')
6972
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE, related_name='taken_quizzes')
70-
score = models.FloatField()
73+
score = models.IntegerField()
74+
percentage = models.FloatField()
7175
date = models.DateTimeField(auto_now_add=True)
7276

7377

django_school/classroom/templates/classroom/students/quiz_result.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66

77
<h2>{{quiz.name}}</h2>
88
{{ quiz.subject.get_html_badge }}
9+
10+
<div class="progress">
11+
<div class="progress-bar progress-bar-striped bg-success" role="progressbar" style="width: {{percentage}}%" aria-valuenow="{{percentage}}" aria-valuemin="0" aria-valuemax="100">{{percentage}}%</div>
12+
</div>
13+
<hr>
914
{% for question in questions %}
1015
<div class="card">
1116
<div class="card-body">

django_school/classroom/templates/classroom/students/taken_quiz_list.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@
88
<tr>
99
<th>Quiz</th>
1010
<th>Subject</th>
11-
<th>Score</th>
11+
<th>%</th>
1212
</tr>
1313
</thead>
1414
<tbody>
1515
{% for taken_quiz in taken_quizzes %}
1616
<tr>
1717
<td><a href="{% url 'students:student_quiz_results' taken_quiz.quiz.id %}">{{ taken_quiz.quiz.name }}</a></td>
1818
<td>{{ taken_quiz.quiz.subject.get_html_badge }}</td>
19-
<td>{{ taken_quiz.score }}</td>
19+
<td>{{ taken_quiz.percentage }}</td>
2020
</tr>
2121
{% empty %}
2222
<tr>

django_school/classroom/templates/classroom/teachers/quiz_results.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@ <h2 class="mb-3">{{ quiz.name }} Results</h2>
2222
<tr>
2323
<th>Student</th>
2424
<th>Date</th>
25-
<th>Score</th>
25+
<th>Percentage</th>
2626
</tr>
2727
</thead>
2828
<tbody>
2929
{% for taken_quiz in taken_quizzes %}
3030
<tr>
3131
<td>{{ taken_quiz.student.user.username }}</td>
3232
<td>{{ taken_quiz.date|naturaltime }}</td>
33-
<td>{{ taken_quiz.score }}</td>
33+
<td>{{ taken_quiz.percentage }}</td>
3434
</tr>
3535
{% endfor %}
3636
</tbody>

django_school/classroom/views/students.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from django.contrib.auth import login
33
from django.contrib.auth.decorators import login_required
44
from django.db import transaction
5-
from django.db.models import Count
5+
from django.db.models import Count, Sum
66
from django.shortcuts import get_object_or_404, redirect, render
77
from django.urls import reverse_lazy
88
from django.utils.decorators import method_decorator
@@ -68,15 +68,17 @@ class QuizResultsView(View):
6868

6969
def get(self, request, *args, **kwargs):
7070
quiz = Quiz.objects.get(id = kwargs['pk'])
71-
if not TakenQuiz.objects.filter(student = request.user.student, quiz = quiz):
71+
taken_quiz = TakenQuiz.objects.filter(student = request.user.student, quiz = quiz)
72+
if not taken_quiz:
7273
"""
7374
Don't show the result if the user didn't attempted the quiz
7475
"""
7576
return render(request, '404.html')
7677
questions = Question.objects.filter(quiz =quiz)
7778

7879
# questions = self.form_class(initial=self.initial)
79-
return render(request, self.template_name, {'questions':questions, 'quiz':quiz})
80+
return render(request, self.template_name, {'questions':questions,
81+
'quiz':quiz, 'percentage': taken_quiz[0].percentage})
8082

8183

8284
@method_decorator([login_required, student_required], name='dispatch')
@@ -118,12 +120,14 @@ def take_quiz(request, pk):
118120
return redirect('students:take_quiz', pk)
119121
else:
120122
correct_answers = student.quiz_answers.filter(answer__question__quiz=quiz, answer__is_correct=True).count()
121-
score = round((correct_answers / total_questions) * 100.0, 2)
122-
TakenQuiz.objects.create(student=student, quiz=quiz, score=score)
123-
if score < 50.0:
124-
messages.warning(request, 'Better luck next time! Your score for the quiz %s was %s.' % (quiz.name, score))
123+
percentage = round((correct_answers / total_questions) * 100.0, 2)
124+
TakenQuiz.objects.create(student=student, quiz=quiz, score=correct_answers, percentage= percentage)
125+
student.score = TakenQuiz.objects.filter(student=student).aggregate(Sum('score'))['score__sum']
126+
student.save()
127+
if percentage < 50.0:
128+
messages.warning(request, 'Better luck next time! Your score for the quiz %s was %s.' % (quiz.name, percentage))
125129
else:
126-
messages.success(request, 'Congratulations! You completed the quiz %s with success! You scored %s points.' % (quiz.name, score))
130+
messages.success(request, 'Congratulations! You completed the quiz %s with success! You scored %s points.' % (quiz.name, percentage))
127131
return redirect('students:quiz_list')
128132
else:
129133
form = TakeQuizForm(question=question)

django_school/templates/base.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ <h1 class="logo">
3737
</div>
3838
<div class="col-6 text-right">
3939
{% if user.is_authenticated %}
40-
<p class="pt-3">Logged in as <strong>{{ user.username }}</strong>. <a href="{% url 'logout' %}">Log out</a>.</p>
40+
<p class="pt-3"><strong>{{ user.username }}{% if user.is_student %} - {{user.student.score}}{% endif %}</strong> | <a href="{% url 'logout' %}">Log out</a>.</p>
4141
{% else %}
4242
<a href="{% url 'login' %}" class="btn btn-light" role="button">Log in</a>
4343
<a href="{% url 'signup' %}" class="btn btn-primary" role="button">Sign up</a>
@@ -49,9 +49,9 @@ <h1 class="logo">
4949
{% for message in messages %}
5050
<div class="alert {{ message.tags }} alert-dismissible fade show" role="alert">
5151
{{ message }}
52-
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
52+
<!-- <button type="button" class="close" data-dismiss="alert" aria-label="Close">
5353
<span aria-hidden="true">&times;</span>
54-
</button>
54+
</button> -->
5555
</div>
5656
{% endfor %}
5757
{% block content %}

0 commit comments

Comments
 (0)