Skip to content

Commit c8dd62d

Browse files
get more detailed report
1 parent 2230615 commit c8dd62d

File tree

4 files changed

+73
-14
lines changed

4 files changed

+73
-14
lines changed

classroom/business/all/student_report.py

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,22 @@ def make(self):
1616

1717
if submission:
1818
report['submitted'] = True
19-
questions = exercise.questions.all()
19+
questions = exercise.questions.all().prefetch_related('answers')
2020
answers = submission.answers.all()
2121

22-
report['passage_1'] = self.calculate_score(questions, answers, 1)
23-
report['passage_2'] = self.calculate_score(questions, answers, 2)
24-
report['passage_3'] = self.calculate_score(questions, answers, 3)
25-
report['total'] = report['passage_1'] + report['passage_2'] + report['passage_3']
22+
passage_1_report = self.passage_report(questions, answers, 1)
23+
passage_2_report = self.passage_report(questions, answers, 2)
24+
passage_3_report = self.passage_report(questions, answers, 3)
25+
26+
report['passage_1_total'], report['passage_1_detail'] = passage_1_report
27+
report['passage_2_total'], report['passage_2_detail'] = passage_2_report
28+
report['passage_3_total'], report['passage_3_detail'] = passage_3_report
29+
30+
report['total'] = (
31+
report['passage_1_total'] +
32+
report['passage_2_total'] +
33+
report['passage_3_total']
34+
)
2635
report['band_score'] = self.calculate_band(report['total'])
2736

2837
reports.append(report)
@@ -33,35 +42,58 @@ def make(self):
3342
def new_report(exercise):
3443
return {
3544
'exercise': exercise.identifier,
36-
'passage_1': 0,
37-
'passage_2': 0,
38-
'passage_3': 0,
45+
'passage_1_total': 0,
46+
'passage_2_total': 0,
47+
'passage_3_total': 0,
48+
'passage_1_detail': [],
49+
'passage_2_detail': [],
50+
'passage_3_detail': [],
3951
'total': 0,
4052
'band_score': 1,
4153
'submitted': False,
4254
}
4355

56+
@staticmethod
57+
def new_detail():
58+
return {
59+
'question_number': None,
60+
'submitted_answer': '',
61+
'possible_answers': [],
62+
'is_correct': False,
63+
}
64+
4465
def get_exercises(self):
4566
return self.classroom.reading_exercises.all().prefetch_related('questions')
4667

4768
def get_submission(self, exercise):
4869
return exercise.submissions.filter(submitter=self.student).prefetch_related('answers').first()
4970

50-
def calculate_score(self, questions, answers, passage):
71+
def passage_report(self, questions, answers, passage):
5172
questions = filter(
5273
lambda question: getattr(question, f'is_passage_{passage}')(),
5374
questions
5475
)
5576

5677
score = 0
78+
details = []
5779
for question in questions:
80+
detail = self.new_detail()
5881
answer = self.get_answer(answers, question)
82+
83+
detail['question_number'] = question.number
84+
detail['possible_answers'] = question.get_answers_content()
85+
5986
if answer:
6087
is_correct = question.check_answer(answer.content)
6188
if is_correct:
6289
score += 1
6390

64-
return score
91+
detail['submitted_answer'] = answer.content
92+
detail['is_correct'] = is_correct
93+
94+
details.append(detail)
95+
96+
return score, details
6597

6698
@staticmethod
6799
def calculate_band(score):
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Generated by Django 3.2.7 on 2021-10-07 16:50
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('classroom', '0013_alter_readingsubmission_unique_together'),
10+
]
11+
12+
operations = [
13+
migrations.AlterModelOptions(
14+
name='readingquestion',
15+
options={'ordering': ['exercise', 'number']},
16+
),
17+
]

classroom/models/reading_question.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class ReadingQuestion(Question):
1010
passage = models.PositiveSmallIntegerField(default=1)
1111

1212
class Meta:
13-
ordering = ['exercise']
13+
ordering = ['exercise', 'number']
1414

1515
def __str__(self):
1616
return f'{self.exercise.identifier} | {self.get_question_type_display()}'

classroom/serializers/classroom.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,22 @@ class RemoveReadingExerciseSerializer(serializers.Serializer):
5252
pk = serializers.IntegerField()
5353

5454

55+
class _PassageDetailSerializer(serializers.Serializer):
56+
question_number = serializers.IntegerField()
57+
submitted_answer = serializers.CharField()
58+
possible_answers = serializers.ListField(child=serializers.CharField())
59+
is_correct = serializers.BooleanField()
60+
61+
5562
class StudentReadingReportSerializer(serializers.Serializer):
5663
student = serializers.IntegerField(write_only=True)
5764
exercise = serializers.CharField(read_only=True)
58-
passage_1 = serializers.IntegerField(read_only=True)
59-
passage_2 = serializers.IntegerField(read_only=True)
60-
passage_3 = serializers.IntegerField(read_only=True)
65+
passage_1_total = serializers.IntegerField(read_only=True)
66+
passage_2_total = serializers.IntegerField(read_only=True)
67+
passage_3_total = serializers.IntegerField(read_only=True)
6168
total = serializers.IntegerField(read_only=True)
6269
band_score = serializers.FloatField(read_only=True)
6370
submitted = serializers.BooleanField(read_only=True)
71+
passage_1_detail = _PassageDetailSerializer(read_only=True, many=True)
72+
passage_2_detail = _PassageDetailSerializer(read_only=True, many=True)
73+
passage_3_detail = _PassageDetailSerializer(read_only=True, many=True)

0 commit comments

Comments
 (0)