Commit 4c8ae2b8 by Zia Fazal Committed by Jonathan Piacenti

fixed issues when organizations have multiple courses

remove unicode thing

removed unicode file

putting unicode file back
parent f006d03c
......@@ -457,18 +457,18 @@ class OrganizationsApiTests(ModuleStoreTestCase):
course1 = CourseFactory.create(display_name="COURSE1", org="CRS1", run="RUN1")
course2 = CourseFactory.create(display_name="COURSE2", org="CRS2", run="RUN2")
course3 = CourseFactory.create(display_name="COURSE3", org="CRS3", run="RUN3")
if i < 3:
# first six users are enrolled in course1, course2 and course3
if i < 7:
CourseEnrollmentFactory.create(user=user, course_id=course1.id)
StudentGradebook.objects.create(user=user, grade=0.75, proforma_grade=0.85, course_id=course1.id)
elif i < 5:
CourseEnrollmentFactory.create(user=user, course_id=course2.id)
StudentGradebook.objects.create(user=user, grade=0.82, proforma_grade=0.82, course_id=course2.id)
elif i < 7:
CourseEnrollmentFactory.create(user=user, course_id=course3.id)
StudentGradebook.objects.create(user=user, grade=0.72, proforma_grade=0.78, course_id=course3.id)
elif i < 9:
CourseEnrollmentFactory.create(user=user, course_id=course1.id)
StudentGradebook.objects.create(user=user, grade=0.94, proforma_grade=0.67, course_id=course1.id)
StudentGradebook.objects.create(user=user, grade=0.54, proforma_grade=0.67, course_id=course1.id)
elif i < 11:
CourseEnrollmentFactory.create(user=user, course_id=course2.id)
StudentGradebook.objects.create(user=user, grade=0.90, proforma_grade=0.91, course_id=course2.id)
......@@ -493,30 +493,30 @@ class OrganizationsApiTests(ModuleStoreTestCase):
metrics_uri = '{}metrics/'.format(test_uri)
response = self.do_get(metrics_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['users_grade_complete_count'], 6)
self.assertEqual(response.data['users_grade_average'], 0.751)
self.assertEqual(response.data['users_grade_complete_count'], 8)
self.assertEqual(response.data['users_grade_average'], 0.504)
courses = {'courses': unicode(course1.id)}
filtered_metrics_uri = '{}?{}'.format(metrics_uri, urlencode(courses))
response = self.do_get(filtered_metrics_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['users_grade_complete_count'], 2)
self.assertEqual(response.data['users_grade_average'], 0.845)
self.assertEqual(response.data['users_grade_complete_count'], 0)
self.assertEqual(response.data['users_grade_average'], 0.698)
courses = {'courses': unicode(course2.id)}
filtered_metrics_uri = '{}?{}'.format(metrics_uri, urlencode(courses))
response = self.do_get(filtered_metrics_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['users_grade_complete_count'], 4)
self.assertEqual(response.data['users_grade_average'], 0.688)
self.assertEqual(response.data['users_grade_complete_count'], 8)
self.assertEqual(response.data['users_grade_average'], 0.747)
courses = {'courses': '{},{}'.format(course1.id, course2.id)}
filtered_metrics_uri = '{}?{}'.format(metrics_uri, urlencode(courses))
response = self.do_get(filtered_metrics_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['users_grade_complete_count'], 6)
self.assertEqual(response.data['users_grade_average'], 0.758)
self.assertEqual(response.data['users_grade_complete_count'], 8)
self.assertEqual(response.data['users_grade_average'], 0.559)
courses = {'courses': '{}'.format(self.course.id)}
filtered_metrics_uri = '{}?{}'.format(metrics_uri, urlencode(courses))
......
......@@ -36,23 +36,24 @@ class OrganizationsViewSet(viewsets.ModelViewSet):
response_data = {}
grade_avg = 0
grade_complete_match_range = getattr(settings, 'GRADEBOOK_GRADE_COMPLETE_PROFORMA_MATCH_RANGE', 0.01)
org_user_grades = StudentGradebook.objects.filter(user__organizations=pk, user__is_active=True,
user__courseenrollment__is_active=True)
org_user_grades = StudentGradebook.objects.filter(user__organizations=pk, user__is_active=True)
courses_filter = request.QUERY_PARAMS.get('courses', None)
courses = []
exclude_users = set()
if courses_filter:
upper_bound = getattr(settings, 'API_LOOKUP_UPPER_BOUND', 100)
courses_filter = courses_filter.split(",")[:upper_bound]
for course_string in courses_filter:
courses.append(get_course_key(course_string))
org_user_grades = org_user_grades.filter(course_id__in=courses,
user__courseenrollment__course_id__in=courses)
users_grade_sum = org_user_grades.aggregate(Sum('grade'))
if users_grade_sum['grade__sum']:
exclude_users = set()
# fill exclude users
for course_key in courses:
exclude_users.union(get_aggregate_exclusion_user_ids(course_key))
org_user_grades = org_user_grades.filter(course_id__in=courses).exclude(user_id__in=exclude_users)
users_grade_sum = org_user_grades.aggregate(Sum('grade'))
if users_grade_sum['grade__sum']:
users_enrolled_qs = CourseEnrollment.objects.filter(user__is_active=True, is_active=True,
user__organizations=pk)\
.exclude(user_id__in=exclude_users)
......@@ -61,12 +62,20 @@ class OrganizationsViewSet(viewsets.ModelViewSet):
users_enrolled = users_enrolled_qs.aggregate(Count('user', distinct=True))
total_users = users_enrolled['user__count']
if total_users:
grade_avg = float('{0:.3f}'.format(float(users_grade_sum['grade__sum']) / total_users))
# in order to compute avg across organization we need course of courses org has
total_courses_in_org = len(courses)
if not courses:
org_courses = users_enrolled_qs.aggregate(Count('course_id', distinct=True))
total_courses_in_org = org_courses['course_id__count']
grade_avg = float('{0:.3f}'.format(
float(users_grade_sum['grade__sum']) / total_users / total_courses_in_org
))
response_data['users_grade_average'] = grade_avg
users_grade_complete_count = org_user_grades\
.filter(proforma_grade__lte=F('grade') + grade_complete_match_range, proforma_grade__gt=0).count()
response_data['users_grade_complete_count'] = users_grade_complete_count
.filter(proforma_grade__lte=F('grade') + grade_complete_match_range, proforma_grade__gt=0)\
.aggregate(Count('user', distinct=True))
response_data['users_grade_complete_count'] = users_grade_complete_count['user__count'] or 0
return Response(response_data, status=status.HTTP_200_OK)
......
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