Commit 31adeb0c by Zia Fazal Committed by Jonathan Piacenti

fixed duplicates when user is enrolled in more than one course

parent 03e0bf7d
...@@ -1738,6 +1738,7 @@ class CoursesApiTests(ModuleStoreTestCase): ...@@ -1738,6 +1738,7 @@ class CoursesApiTests(ModuleStoreTestCase):
for user in users: for user in users:
CourseEnrollmentFactory.create(user=user, course_id=course.id) CourseEnrollmentFactory.create(user=user, course_id=course.id)
CourseEnrollmentFactory.create(user=user, course_id=self.course.id)
test_course_id = unicode(course.id) test_course_id = unicode(course.id)
completion_uri = '{}/{}/completions/'.format(self.base_courses_uri, test_course_id) completion_uri = '{}/{}/completions/'.format(self.base_courses_uri, test_course_id)
......
...@@ -1453,7 +1453,9 @@ class CoursesMetricsGradesList(SecureListAPIView): ...@@ -1453,7 +1453,9 @@ class CoursesMetricsGradesList(SecureListAPIView):
course_key = get_course_key(course_id) course_key = get_course_key(course_id)
exclude_users = _get_aggregate_exclusion_user_ids(course_key) exclude_users = _get_aggregate_exclusion_user_ids(course_key)
queryset = StudentGradebook.objects.filter(course_id__exact=course_key, queryset = StudentGradebook.objects.filter(course_id__exact=course_key,
user__courseenrollment__is_active=True)\ user__is_active=True,
user__courseenrollment__is_active=True,
user__courseenrollment__course_id__exact=course_key)\
.exclude(user__in=exclude_users) .exclude(user__in=exclude_users)
upper_bound = getattr(settings, 'API_LOOKUP_UPPER_BOUND', 200) upper_bound = getattr(settings, 'API_LOOKUP_UPPER_BOUND', 200)
...@@ -1592,21 +1594,25 @@ class CoursesTimeSeriesMetrics(SecureAPIView): ...@@ -1592,21 +1594,25 @@ class CoursesTimeSeriesMetrics(SecureAPIView):
exclude_users = _get_aggregate_exclusion_user_ids(course_key) exclude_users = _get_aggregate_exclusion_user_ids(course_key)
grade_complete_match_range = getattr(settings, 'GRADEBOOK_GRADE_COMPLETE_PROFORMA_MATCH_RANGE', 0.01) grade_complete_match_range = getattr(settings, 'GRADEBOOK_GRADE_COMPLETE_PROFORMA_MATCH_RANGE', 0.01)
grades_qs = StudentGradebook.objects.filter(course_id__exact=course_key, user__is_active=True, grades_qs = StudentGradebook.objects.filter(course_id__exact=course_key, user__is_active=True,
user__courseenrollment__is_active=True).\ user__courseenrollment__is_active=True,
user__courseenrollment__course_id__exact=course_key).\
exclude(user_id__in=exclude_users) exclude(user_id__in=exclude_users)
grades_complete_qs = grades_qs.filter(proforma_grade__lte=F('grade') + grade_complete_match_range, grades_complete_qs = grades_qs.filter(proforma_grade__lte=F('grade') + grade_complete_match_range,
proforma_grade__gt=0) proforma_grade__gt=0)
enrolled_qs = CourseEnrollment.objects.filter(course_id__exact=course_key, user__is_active=True, enrolled_qs = CourseEnrollment.objects.filter(course_id__exact=course_key, user__is_active=True,
is_active=True).exclude(user_id__in=exclude_users) is_active=True).exclude(user_id__in=exclude_users)
users_started_qs = StudentProgressHistory.objects.filter(course_id__exact=course_key, user__is_active=True, users_started_qs = StudentProgressHistory.objects.filter(course_id__exact=course_key, user__is_active=True,
user__courseenrollment__is_active=True)\ user__courseenrollment__is_active=True,
user__courseenrollment__course_id__exact=course_key)\
.exclude(user_id__in=exclude_users) .exclude(user_id__in=exclude_users)
modules_completed_qs = CourseModuleCompletion.get_actual_completions().filter(course_id__exact=course_key, modules_completed_qs = CourseModuleCompletion.get_actual_completions().filter(course_id__exact=course_key,
user__courseenrollment__is_active=True, user__courseenrollment__is_active=True,
user__courseenrollment__course_id__exact=course_key,
user__is_active=True)\ user__is_active=True)\
.exclude(user_id__in=exclude_users) .exclude(user_id__in=exclude_users)
active_users_qs = StudentModule.objects.filter(course_id__exact=course_key, student__is_active=True, active_users_qs = StudentModule.objects.filter(course_id__exact=course_key, student__is_active=True,
student__courseenrollment__is_active=True)\ student__courseenrollment__is_active=True,
student__courseenrollment__course_id__exact=course_key)\
.exclude(student_id__in=exclude_users) .exclude(student_id__in=exclude_users)
organization = request.QUERY_PARAMS.get('organization', None) organization = request.QUERY_PARAMS.get('organization', None)
......
...@@ -45,7 +45,8 @@ class OrganizationsViewSet(viewsets.ModelViewSet): ...@@ -45,7 +45,8 @@ class OrganizationsViewSet(viewsets.ModelViewSet):
courses = [] courses = []
for course_string in courses_filter: for course_string in courses_filter:
courses.append(get_course_key(course_string)) courses.append(get_course_key(course_string))
org_user_grades = org_user_grades.filter(course_id__in=courses) org_user_grades = org_user_grades.filter(course_id__in=courses,
user__courseenrollment__course_id__in=courses)
users_grade_average = org_user_grades.aggregate(Avg('grade')) users_grade_average = org_user_grades.aggregate(Avg('grade'))
if users_grade_average['grade__avg']: if users_grade_average['grade__avg']:
......
...@@ -70,6 +70,7 @@ class StudentGradebook(TimeStampedModel): ...@@ -70,6 +70,7 @@ class StudentGradebook(TimeStampedModel):
# Generate the base data set we're going to work with # Generate the base data set we're going to work with
queryset = StudentGradebook.objects.select_related('user')\ queryset = StudentGradebook.objects.select_related('user')\
.filter(course_id__exact=course_key, user__is_active=True, user__courseenrollment__is_active=True, .filter(course_id__exact=course_key, user__is_active=True, user__courseenrollment__is_active=True,
user__courseenrollment__course_id__exact=course_key,
user__in=enrolled_users_not_excluded) user__in=enrolled_users_not_excluded)
gradebook_user_count = len(queryset) gradebook_user_count = len(queryset)
......
...@@ -30,7 +30,8 @@ class StudentProgress(TimeStampedModel): ...@@ -30,7 +30,8 @@ class StudentProgress(TimeStampedModel):
Returns count of completions for a given course. Returns count of completions for a given course.
""" """
queryset = cls.objects.filter(course_id__exact=course_key, user__is_active=True, queryset = cls.objects.filter(course_id__exact=course_key, user__is_active=True,
user__courseenrollment__is_active=True)\ user__courseenrollment__is_active=True,
user__courseenrollment__course_id__exact=course_key)\
.exclude(user__id__in=exclude_users) .exclude(user__id__in=exclude_users)
if org_ids: if org_ids:
queryset = queryset.filter(user__organizations__in=org_ids) queryset = queryset.filter(user__organizations__in=org_ids)
...@@ -44,7 +45,8 @@ class StudentProgress(TimeStampedModel): ...@@ -44,7 +45,8 @@ class StudentProgress(TimeStampedModel):
Returns count of users who completed at least one module. Returns count of users who completed at least one module.
""" """
queryset = cls.objects.filter(course_id__exact=course_key, user__is_active=True, queryset = cls.objects.filter(course_id__exact=course_key, user__is_active=True,
user__courseenrollment__is_active=True)\ user__courseenrollment__is_active=True,
user__courseenrollment__course_id__exact=course_key)\
.exclude(user__id__in=exclude_users) .exclude(user__id__in=exclude_users)
if org_ids: if org_ids:
queryset = queryset.filter(user__organizations__in=org_ids) queryset = queryset.filter(user__organizations__in=org_ids)
...@@ -89,7 +91,8 @@ class StudentProgress(TimeStampedModel): ...@@ -89,7 +91,8 @@ class StudentProgress(TimeStampedModel):
""" """
queryset = cls.objects\ queryset = cls.objects\
.filter(course_id__exact=course_key, user__is_active=True, user__courseenrollment__is_active=True)\ .filter(course_id__exact=course_key, user__is_active=True, user__courseenrollment__is_active=True,
user__courseenrollment__course_id__exact=course_key)\
.exclude(user__id__in=exclude_users) .exclude(user__id__in=exclude_users)
if org_ids: if org_ids:
queryset = queryset.filter(user__organizations__in=org_ids) queryset = queryset.filter(user__organizations__in=org_ids)
......
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