Skip to content

Commit 7b142d5

Browse files
Expose most frequent homework answer action
1 parent 5bf4d5e commit 7b142d5

2 files changed

Lines changed: 92 additions & 4 deletions

File tree

cadmin/templates/cadmin/course_admin.html

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,16 @@ <h3 class="font-semibold app-heading">Homework scoring</h3>
5353
<a href="{% url 'cadmin_homework_submissions' course.slug hw.slug %}" class="font-medium app-link hover:underline">{{ hw.title }}</a>
5454
<p class="mt-1 text-xs app-muted">{{ hw.submissions_count }} submissions · due <span class="local-date" data-timestamp="{{ hw.due_date|date:'U' }}">{{ hw.due_date|date:"j F Y, H:i" }}</span></p>
5555
</div>
56-
<form method="post" action="{% url 'cadmin_homework_score' course.slug hw.slug %}" onsubmit="return confirm('Score all submissions for {{ hw.title }}?');">
57-
{% csrf_token %}
58-
<button type="submit" class="primer-button cadmin-primary">Score submissions</button>
59-
</form>
56+
<div class="flex flex-wrap gap-2 sm:justify-end">
57+
<form method="post" action="{% url 'cadmin_homework_set_correct_answers' course.slug hw.slug %}" onsubmit="return confirm('Set missing correct answers for {{ hw.title }} to the most frequent submitted answers?');">
58+
{% csrf_token %}
59+
<button type="submit" class="primer-button primer-button-secondary">Select most frequent answer</button>
60+
</form>
61+
<form method="post" action="{% url 'cadmin_homework_score' course.slug hw.slug %}" onsubmit="return confirm('Score all submissions for {{ hw.title }}?');">
62+
{% csrf_token %}
63+
<button type="submit" class="primer-button cadmin-primary">Score submissions</button>
64+
</form>
65+
</div>
6066
</div>
6167
</div>
6268
{% endfor %}

cadmin/tests/test_views.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
Enrollment,
1515
Homework,
1616
HomeworkState,
17+
Question,
18+
QuestionTypes,
19+
Submission,
20+
Answer,
1721
ReviewCriteria,
1822
ReviewCriteriaTypes,
1923
ProjectEvaluationScore,
@@ -636,6 +640,84 @@ def test_homework_score_shows_message(self):
636640
messages = list(response.context['messages'])
637641
self.assertEqual(len(messages), 1)
638642

643+
def test_course_admin_shows_most_frequent_answer_action(self):
644+
enrollment = Enrollment.objects.create(
645+
student=self.user,
646+
course=self.course,
647+
)
648+
Submission.objects.create(
649+
homework=self.homework,
650+
student=self.user,
651+
enrollment=enrollment,
652+
)
653+
self.client.login(username="admin@test.com", password="admin123")
654+
655+
response = self.client.get(
656+
reverse("cadmin_course", kwargs={"course_slug": self.course.slug})
657+
)
658+
659+
self.assertEqual(response.status_code, 200)
660+
self.assertContains(response, "Select most frequent answer")
661+
self.assertContains(
662+
response,
663+
reverse(
664+
"cadmin_homework_set_correct_answers",
665+
kwargs={
666+
"course_slug": self.course.slug,
667+
"homework_slug": self.homework.slug,
668+
},
669+
),
670+
)
671+
672+
def test_homework_set_correct_answers_uses_most_frequent_answer(self):
673+
question = Question.objects.create(
674+
homework=self.homework,
675+
text="Pick one",
676+
question_type=QuestionTypes.MULTIPLE_CHOICE.value,
677+
possible_answers="A\nB\nC",
678+
correct_answer="",
679+
)
680+
681+
for index, answer_text in enumerate(["2", "2", "1"], start=1):
682+
user = User.objects.create_user(
683+
username=f"student{index}@test.com",
684+
email=f"student{index}@test.com",
685+
password="12345",
686+
)
687+
enrollment = Enrollment.objects.create(
688+
student=user,
689+
course=self.course,
690+
)
691+
submission = Submission.objects.create(
692+
homework=self.homework,
693+
student=user,
694+
enrollment=enrollment,
695+
)
696+
Answer.objects.create(
697+
submission=submission,
698+
question=question,
699+
answer_text=answer_text,
700+
)
701+
702+
self.client.login(username="admin@test.com", password="admin123")
703+
url = reverse(
704+
"cadmin_homework_set_correct_answers",
705+
kwargs={
706+
"course_slug": self.course.slug,
707+
"homework_slug": self.homework.slug,
708+
},
709+
)
710+
response = self.client.post(url, follow=True)
711+
712+
self.assertRedirects(
713+
response,
714+
reverse("cadmin_course", kwargs={"course_slug": self.course.slug})
715+
)
716+
question.refresh_from_db()
717+
self.assertEqual(question.correct_answer, "2")
718+
messages = list(response.context["messages"])
719+
self.assertEqual(len(messages), 1)
720+
639721
def test_project_score_shows_message(self):
640722
"""Test that scoring project shows a message on the course admin page"""
641723
self.client.login(username="admin@test.com", password="admin123")

0 commit comments

Comments
 (0)