Commit 350a9c02 by Matt Drayer Committed by Jonathan Piacenti

mattdrayer/api: Fixes to support Apros cohort page

parent 77654cae
...@@ -1817,7 +1817,6 @@ class CoursesApiTests(TestCase): ...@@ -1817,7 +1817,6 @@ class CoursesApiTests(TestCase):
response = self.do_post(completion_uri, completions_data) response = self.do_post(completion_uri, completions_data)
self.assertEqual(response.status_code, 201) self.assertEqual(response.status_code, 201)
# get course metrics # get course metrics
course_metrics_uri = '{}/{}/metrics/'.format(self.base_courses_uri, self.test_course_id) course_metrics_uri = '{}/{}/metrics/'.format(self.base_courses_uri, self.test_course_id)
response = self.do_get(course_metrics_uri) response = self.do_get(course_metrics_uri)
...@@ -1825,6 +1824,9 @@ class CoursesApiTests(TestCase): ...@@ -1825,6 +1824,9 @@ class CoursesApiTests(TestCase):
self.assertEqual(response.data['users_enrolled'], users_to_add + USER_COUNT) self.assertEqual(response.data['users_enrolled'], users_to_add + USER_COUNT)
self.assertEqual(response.data['users_started'], 1) self.assertEqual(response.data['users_started'], 1)
self.assertIsNotNone(response.data['grade_cutoffs']) self.assertIsNotNone(response.data['grade_cutoffs'])
# TODO: (mattdrayer) Uncomment after comment service has been updated
# self.assertEqual(response.data['num_threads'], 5)
# self.assertEqual(response.data['num_active_threads'], 3)
# get course metrics by organization # get course metrics by organization
course_metrics_uri = '{}/{}/metrics/?organization={}'.format(self.base_courses_uri, self.test_course_id, org_id) course_metrics_uri = '{}/{}/metrics/?organization={}'.format(self.base_courses_uri, self.test_course_id, org_id)
......
...@@ -1503,15 +1503,16 @@ class CoursesMetrics(SecureAPIView): ...@@ -1503,15 +1503,16 @@ class CoursesMetrics(SecureAPIView):
'users_started': users_started_qs.values('user').distinct().count(), 'users_started': users_started_qs.values('user').distinct().count(),
'grade_cutoffs': course_descriptor.grading_policy['GRADE_CUTOFFS'] 'grade_cutoffs': course_descriptor.grading_policy['GRADE_CUTOFFS']
} }
thread_stats = {} # TODO: (mattdrayer) Uncomment after comment service has been updated
try: # thread_stats = {}
thread_stats = get_course_thread_stats(slash_course_id) # try:
except CommentClientRequestError, e: # thread_stats = get_course_thread_stats(slash_course_id)
data = { # except CommentClientRequestError, e:
"err_msg": str(e) # data = {
} # "err_msg": str(e)
return Response(data, status=status.HTTP_500_INTERNAL_SERVER_ERROR) # }
data.update(thread_stats) # return Response(data, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# data.update(thread_stats)
return Response(data, status=status.HTTP_200_OK) return Response(data, status=status.HTTP_200_OK)
......
...@@ -69,51 +69,52 @@ class StudentGradebook(TimeStampedModel): ...@@ -69,51 +69,52 @@ class StudentGradebook(TimeStampedModel):
queryset = StudentGradebook.objects.select_related('user')\ queryset = StudentGradebook.objects.select_related('user')\
.filter(course_id__exact=course_key, user__is_active=True) .filter(course_id__exact=course_key, user__is_active=True)
gradebook_user_count = len(queryset) gradebook_user_count = len(queryset)
if gradebook_user_count:
# Remove any users who should not be considered for the statistics
if exclude_users: # Remove any users who should not be considered for the statistics
total_user_count = total_user_count - len(exclude_users) if exclude_users:
queryset = queryset.exclude(user__in=exclude_users) total_user_count = total_user_count - len(exclude_users)
gradebook_user_count = len(queryset) queryset = queryset.exclude(user__in=exclude_users)
gradebook_user_count = len(queryset)
# Calculate the class average
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'] = course_avg # Fill up the response container
data['course_max'] = queryset.aggregate(Max('grade'))['grade__max'] data['course_avg'] = 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']
data['course_count'] = queryset.aggregate(Count('grade'))['grade__count']
# Construct the leaderboard as a queryset
data['queryset'] = queryset.values( # Construct the leaderboard as a queryset
'user__id', data['queryset'] = queryset.values(
'user__username', 'user__id',
'user__profile__title', 'user__username',
'user__profile__avatar_url', 'user__profile__title',
'grade', 'user__profile__avatar_url',
'created')\ 'grade',
.order_by('-grade', 'created')[:count] 'created')\
.order_by('-grade', 'created')[:count]
# If a user_id value was provided, we need to provide some additional user-specific data to the caller
if user_id: # If a user_id value was provided, we need to provide some additional user-specific data to the caller
user_grade = 0 if user_id:
user_time_scored = timezone.now() user_grade = 0
try: user_time_scored = timezone.now()
user_queryset = StudentGradebook.objects.get(course_id__exact=course_key, user__id=user_id) try:
except StudentGradebook.DoesNotExist: user_queryset = StudentGradebook.objects.get(course_id__exact=course_key, user__id=user_id)
user_queryset = None except StudentGradebook.DoesNotExist:
if user_queryset: user_queryset = None
user_grade = user_queryset.grade if user_queryset:
user_time_scored = user_queryset.created user_grade = user_queryset.grade
users_above = queryset.filter(grade__gte=user_grade)\ user_time_scored = user_queryset.created
.exclude(user__id=user_id)\ users_above = queryset.filter(grade__gte=user_grade)\
.exclude(grade=user_grade, created__lt=user_time_scored) .exclude(user__id=user_id)\
data['user_position'] = len(users_above) + 1 .exclude(grade=user_grade, created__lt=user_time_scored)
data['user_grade'] = user_grade 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