Commit 79405d9a by Chris Dodge Committed by Jonathan Piacenti

gradebook appears to bomb if there is no data to aggregate

parent 0bd39386
...@@ -77,42 +77,44 @@ class StudentGradebook(TimeStampedModel): ...@@ -77,42 +77,44 @@ class StudentGradebook(TimeStampedModel):
queryset = queryset.exclude(user__in=exclude_users) queryset = queryset.exclude(user__in=exclude_users)
gradebook_user_count = len(queryset) gradebook_user_count = len(queryset)
# Calculate the class average if gradebook_user_count:
course_avg = queryset.aggregate(Avg('grade'))['grade__avg'] # Calculate the class average
if course_avg is not None and gradebook_user_count < total_user_count: course_avg = queryset.aggregate(Avg('grade'))['grade__avg']
# Take into account any ungraded students (assumes zeros for grades...) if course_avg is not None and gradebook_user_count < total_user_count:
course_avg = course_avg / total_user_count * gradebook_user_count # Take into account any ungraded students (assumes zeros for grades...)
course_avg = course_avg / total_user_count * gradebook_user_count
# Fill up the response container
data['course_avg'] = float("{0:.3f}".format(course_avg)) # Fill up the response container
data['course_max'] = queryset.aggregate(Max('grade'))['grade__max'] data['course_avg'] = float("{0:.3f}".format(course_avg))
data['course_min'] = queryset.aggregate(Min('grade'))['grade__min'] data['course_max'] = queryset.aggregate(Max('grade'))['grade__max']
data['course_count'] = queryset.aggregate(Count('grade'))['grade__count'] data['course_min'] = queryset.aggregate(Min('grade'))['grade__min']
# Construct the leaderboard as a queryset data['course_count'] = queryset.aggregate(Count('grade'))['grade__count']
data['queryset'] = queryset.values(
'user__id', # Construct the leaderboard as a queryset
'user__username', data['queryset'] = queryset.values(
'user__profile__title', 'user__id',
'user__profile__avatar_url', 'user__username',
'grade', 'user__profile__title',
'modified')\ 'user__profile__avatar_url',
.order_by('-grade', 'modified')[:count] 'grade',
# If a user_id value was provided, we need to provide some additional user-specific data to the caller 'modified')\
if user_id: .order_by('-grade', 'modified')[:count]
user_grade = 0 # If a user_id value was provided, we need to provide some additional user-specific data to the caller
user_time_scored = timezone.now() if user_id:
try: user_grade = 0
user_queryset = StudentGradebook.objects.get(course_id__exact=course_key, user__id=user_id) user_time_scored = timezone.now()
except StudentGradebook.DoesNotExist: try:
user_queryset = None user_queryset = StudentGradebook.objects.get(course_id__exact=course_key, user__id=user_id)
if user_queryset: except StudentGradebook.DoesNotExist:
user_grade = user_queryset.grade user_queryset = None
user_time_scored = user_queryset.created if user_queryset:
users_above = queryset.filter(grade__gte=user_grade)\ user_grade = user_queryset.grade
.exclude(user__id=user_id)\ user_time_scored = user_queryset.created
.exclude(grade=user_grade, modified__gt=user_time_scored) users_above = queryset.filter(grade__gte=user_grade)\
data['user_position'] = len(users_above) + 1 .exclude(user__id=user_id)\
data['user_grade'] = user_grade .exclude(grade=user_grade, modified__gt=user_time_scored)
data['user_position'] = len(users_above) + 1
data['user_grade'] = user_grade
return data return data
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment