Commit 3125c9c7 by Zia Fazal Committed by Jonathan Piacenti

added course_complete status

return grades instead of complete status

added complete_status too
parent 215fde0b
...@@ -16,8 +16,8 @@ from django.test.utils import override_settings ...@@ -16,8 +16,8 @@ from django.test.utils import override_settings
from gradebook.models import StudentGradebook from gradebook.models import StudentGradebook
from student.models import UserProfile from student.models import UserProfile
from student.tests.factories import CourseEnrollmentFactory
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from student.tests.factories import CourseEnrollmentFactory, UserFactory
from xmodule.modulestore.tests.factories import CourseFactory from xmodule.modulestore.tests.factories import CourseFactory
TEST_API_KEY = str(uuid.uuid4()) TEST_API_KEY = str(uuid.uuid4())
...@@ -343,6 +343,44 @@ class OrganizationsApiTests(ModuleStoreTestCase): ...@@ -343,6 +343,44 @@ class OrganizationsApiTests(ModuleStoreTestCase):
self.assertEqual(response.data[0]['id'], self.test_user.id) self.assertEqual(response.data[0]['id'], self.test_user.id)
self.assertEqual(response.data[0]['course_count'], 2) self.assertEqual(response.data[0]['course_count'], 2)
def test_organizations_users_get_with_grades(self):
# Create 4 users
user_course = 4
users_completed = 2
users = [UserFactory.create(username="testuser" + str(__), profile='test') for __ in xrange(user_course)]
for i, user in enumerate(users):
CourseEnrollmentFactory.create(user=user, course_id=self.course.id)
grades = (0.75, 0.85)
# mark 3 users as who completed course and 1 who did not
if i < users_completed:
grades = (0.90, 0.91)
StudentGradebook.objects.create(user=user, course_id=self.course.id, grade=grades[0],
proforma_grade=grades[1])
data = {
'name': self.test_organization_name,
'display_name': self.test_organization_display_name,
'contact_name': self.test_organization_contact_name,
'contact_email': self.test_organization_contact_email,
'contact_phone': self.test_organization_contact_phone
}
response = self.do_post(self.base_organizations_uri, data)
self.assertEqual(response.status_code, 201)
test_uri = '{}{}/'.format(self.base_organizations_uri, str(response.data['id']))
users_uri = '{}users/'.format(test_uri)
for user in users:
data = {"id": user.id}
response = self.do_post(users_uri, data)
self.assertEqual(response.status_code, 201)
response = self.do_get('{}?{}&course_id={}'.format(users_uri, 'include_grades=True', self.course.id))
self.assertEqual(response.status_code, 200)
complete_count = len([user for user in response.data if user['complete_status']])
self.assertEqual(complete_count, users_completed)
grade_sum = sum([user['grade'] for user in response.data])
proforma_grade_sum = sum([user['proforma_grade'] for user in response.data])
self.assertEqual(grade_sum, 0.75 + 0.75 + 0.9 + 0.9)
self.assertEqual(proforma_grade_sum, 0.85 + 0.85 + 0.91 + 0.91)
def test_organizations_metrics_get(self): def test_organizations_metrics_get(self):
users = [] users = []
for i in xrange(1, 6): for i in xrange(1, 6):
......
...@@ -73,11 +73,30 @@ class OrganizationsViewSet(viewsets.ModelViewSet): ...@@ -73,11 +73,30 @@ class OrganizationsViewSet(viewsets.ModelViewSet):
@action(methods=['get', 'post']) @action(methods=['get', 'post'])
def users(self, request, pk): def users(self, request, pk):
""" """
Add a User to an Organization - URI: ```/api/organizations/{org_id}/users/```
- GET: Returns users in an organization
* course_id parameter should filter user by course
* include_course_counts parameter should be `true` to get user's enrollment count
* include_grades parameter should be `true` to get user's grades
* for the course given in the course_id parameter
- POST: Adds a User to an Organization
""" """
if request.method == 'GET': if request.method == 'GET':
include_course_counts = request.QUERY_PARAMS.get('include_course_counts', None) include_course_counts = request.QUERY_PARAMS.get('include_course_counts', None)
include_grades = request.QUERY_PARAMS.get('include_grades', None)
course_id = request.QUERY_PARAMS.get('course_id', None)
grade_complete_match_range = getattr(settings, 'GRADEBOOK_GRADE_COMPLETE_PROFORMA_MATCH_RANGE', 0.01)
course_key = None
if course_id:
course_key = get_course_key(course_id)
users = User.objects.filter(organizations=pk) users = User.objects.filter(organizations=pk)
if course_key:
users = users.filter(courseenrollment__course_id__exact=course_key,
courseenrollment__is_active=True)
if str2bool(include_grades):
users = users.select_related('studentgradebook')
response_data = [] response_data = []
if users: if users:
for user in users: for user in users:
...@@ -86,6 +105,15 @@ class OrganizationsViewSet(viewsets.ModelViewSet): ...@@ -86,6 +105,15 @@ class OrganizationsViewSet(viewsets.ModelViewSet):
if str2bool(include_course_counts): if str2bool(include_course_counts):
enrollments = CourseEnrollment.enrollments_for_user(user).count() enrollments = CourseEnrollment.enrollments_for_user(user).count()
user_data['course_count'] = enrollments user_data['course_count'] = enrollments
if str2bool(include_grades) and course_key:
user_grades = {'grade': 0, 'proforma_grade': 0}
gradebook = user.studentgradebook_set.filter(course_id=course_key)
if gradebook:
user_grades['grade'] = gradebook[0].grade
user_grades['proforma_grade'] = gradebook[0].proforma_grade
user_grades['complete_status'] = True if 0 < gradebook[0].proforma_grade <= \
gradebook[0].grade + grade_complete_match_range else False
user_data.update(user_grades)
response_data.append(user_data) response_data.append(user_data)
return Response(response_data, status=status.HTTP_200_OK) return Response(response_data, status=status.HTTP_200_OK)
else: else:
......
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