Commit c2cfd9f1 by Saqib

Merge pull request #674 from edx-solutions/msaqib52/YONK-292

Update course metrics grades leaders API to allow filtering of users by groups
parents f7919a68 1bda8cef
...@@ -1748,6 +1748,13 @@ class CoursesMetricsGradesLeadersList(SecureListAPIView): ...@@ -1748,6 +1748,13 @@ class CoursesMetricsGradesLeadersList(SecureListAPIView):
GET /api/courses/{course_id}/grades/leaders/ GET /api/courses/{course_id}/grades/leaders/
""" """
user_id = self.request.QUERY_PARAMS.get('user_id', None) user_id = self.request.QUERY_PARAMS.get('user_id', None)
group_ids = self.request.QUERY_PARAMS.get('groups', None)
if group_ids:
try:
group_ids = map(int, group_ids.split(','))
except ValueError:
return Response({}, status.HTTP_400_BAD_REQUEST)
count = self.request.QUERY_PARAMS.get('count', 3) count = self.request.QUERY_PARAMS.get('count', 3)
data = {} data = {}
course_avg = 0 course_avg = 0
...@@ -1756,7 +1763,12 @@ class CoursesMetricsGradesLeadersList(SecureListAPIView): ...@@ -1756,7 +1763,12 @@ class CoursesMetricsGradesLeadersList(SecureListAPIView):
course_key = get_course_key(course_id) course_key = get_course_key(course_id)
# Users having certain roles (such as an Observer) are excluded from aggregations # Users having certain roles (such as an Observer) are excluded from aggregations
exclude_users = get_aggregate_exclusion_user_ids(course_key) exclude_users = get_aggregate_exclusion_user_ids(course_key)
leaderboard_data = StudentGradebook.generate_leaderboard(course_key, user_id=user_id, count=count, exclude_users=exclude_users) leaderboard_data = StudentGradebook.generate_leaderboard(course_key,
user_id=user_id,
group_ids=group_ids,
count=count,
exclude_users=exclude_users)
serializer = CourseLeadersSerializer(leaderboard_data['queryset'], many=True) serializer = CourseLeadersSerializer(leaderboard_data['queryset'], many=True)
data['leaders'] = serializer.data # pylint: disable=E1101 data['leaders'] = serializer.data # pylint: disable=E1101
data['course_avg'] = leaderboard_data['course_avg'] data['course_avg'] = leaderboard_data['course_avg']
......
...@@ -82,9 +82,6 @@ class StudentGradebook(models.Model): ...@@ -82,9 +82,6 @@ class StudentGradebook(models.Model):
user__courseenrollment__course_id__exact=course_key, user__courseenrollment__course_id__exact=course_key,
user__in=enrolled_users_not_excluded) user__in=enrolled_users_not_excluded)
if group_ids:
queryset.filter(user__groups__in=group_ids)
gradebook_user_count = len(queryset) gradebook_user_count = len(queryset)
if gradebook_user_count: if gradebook_user_count:
...@@ -100,6 +97,9 @@ class StudentGradebook(models.Model): ...@@ -100,6 +97,9 @@ class StudentGradebook(models.Model):
data['course_min'] = queryset.aggregate(Min('grade'))['grade__min'] data['course_min'] = queryset.aggregate(Min('grade'))['grade__min']
data['course_count'] = queryset.aggregate(Count('grade'))['grade__count'] data['course_count'] = queryset.aggregate(Count('grade'))['grade__count']
if group_ids:
queryset = queryset.filter(user__groups__in=group_ids)
# Construct the leaderboard as a queryset # Construct the leaderboard as a queryset
data['queryset'] = queryset.values( data['queryset'] = queryset.values(
'user__id', 'user__id',
......
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