Skip to content

Commit

Permalink
Skip submissions if any have been graded in next submitter view
Browse files Browse the repository at this point in the history
  • Loading branch information
EerikSaksi committed Jun 13, 2023
1 parent 7f21d5a commit 3faa9c6
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 17 deletions.
11 changes: 3 additions & 8 deletions exercise/staff_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,8 @@ def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
# submissions for this exercise
submissions = Submission.objects.filter(exercise=self.exercise)

submitters_with_grading = submissions.exclude(grader=None).values_list('submitters__id', flat=True)

# filter only the latest submissions
submissions = (submissions.annotate(latest=Max('submission_time'))
.filter(submission_time=F('latest'))
Expand All @@ -341,14 +343,7 @@ def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
if previous_user_id:
previous_submission_time = submissions.filter(submitters__id=previous_user_id).first().submission_time

# filter users who's have submissions that have been assessed
submissions = (submissions.annotate(
count_assessed=Count(
'id',
filter=(Q(grader__isnull=False)),
),
)
.filter(count_assessed=0))
submissions = submissions.exclude(submitters__id__in=submitters_with_grading)

# if we had a previous time then try find the next submitter after this time
if previous_submission_time:
Expand Down
33 changes: 24 additions & 9 deletions exercise/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -1351,12 +1351,15 @@ def test_enrollment_questionaire_opening_time(self):
)

def test_next_unassessed_submitter_view(self):
# parses the user ID from the URL response of NextUnassessedSubmitterView
# parses the user ID from the URL response of NextUnassessedSubmitterView for convenience. If the URL format is
# different (e.g. redirect when all have been graded) return just the url
def get_url_user_id(args=''):
response = self.client.get(
f"{exercise.get_absolute_url()}submitters/next-unassessed/{args}")

return int(response.url.split('/submissions/')[1].split('/inspect/')[0])
try:
return int(response.url.split('/submissions/')[1].split('/inspect/')[0])
except:
return response.url

self.client.login(username="staff", password="staffPassword")

Expand All @@ -1374,23 +1377,23 @@ def get_url_user_id(args=''):
exercise=exercise,
)
user_submission.submitters.add(self.user.userprofile)
user_submission.submission_time = self.tomorrow
user_submission.submission_time = self.yesterday
user_submission.save()

user2_submission = Submission.objects.create(
exercise=exercise,
)
user2_submission.submitters.add(self.user2.userprofile)
user2_submission.submission_time = self.two_days_from_now
user2_submission.submission_time = self.today
user2_submission.save()

# user submission day before user2
self.assertEqual(user_submission.id, get_url_user_id())
self.assertEqual(user2_submission.id,
get_url_user_id(f"?prev={self.user.id}"))

user_submission.submission_time = self.three_days_from_now
user_submission.save()
user2_submission.submission_time = self.yesterday - timedelta(days=1)
user2_submission.save()

# now user2 submission is earlier
self.assertEqual(user2_submission.id, get_url_user_id())
Expand All @@ -1413,7 +1416,7 @@ def get_url_user_id(args=''):
exercise=exercise,
)
user_earlier_submission.submitters.add(self.user.userprofile)
user_earlier_submission.submission_time = self.today
user_earlier_submission.submission_time = self.yesterday - timedelta(days=2)
user_earlier_submission.save()

self.assertEqual(user_submission.id, get_url_user_id())
Expand All @@ -1428,7 +1431,19 @@ def get_url_user_id(args=''):
# an even earlier submission in another exercise doesn't matter
self.assertEqual(user_submission.id, get_url_user_id())

# we should now expect user2's submission to be shown because one of user1's submissions has been graded
# we should now expect user2's submission to be shown because user1's latest submission has been graded
user_earlier_submission.grader = self.teacher.userprofile
user_earlier_submission.save()
self.assertEqual(user2_submission.id, get_url_user_id())

# grading in an older submission (not latest) should also mean user1 is skipped
user_earlier_submission.grader = None
user_earlier_submission.save()
user_submission.grader = self.teacher.userprofile
user_submission.save()
self.assertEqual(user2_submission.id, get_url_user_id())

# everything has been graded (we should get the submissions list)
user2_submission.grader = self.teacher.userprofile
user2_submission.save()
self.assertEqual(exercise.get_submission_list_url(), get_url_user_id())

0 comments on commit 3faa9c6

Please sign in to comment.