Commit f384d6e3 by Zia Fazal Committed by Jonathan Piacenti

filter by groups

parent 232af6ed
......@@ -921,6 +921,55 @@ class CoursesApiTests(TestCase):
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['enrollments']), 3)
def test_courses_users_list_get_filter_by_groups(self):
# create 2 groups
group_ids = []
for i in xrange(1, 3):
data = {'name': '{} {}'.format(self.test_group_name, i), 'type': 'test'}
response = self.do_post(self.base_groups_uri, data)
self.assertEqual(response.status_code, 201)
group_ids.append(response.data['id'])
# create 5 users
users = []
for i in xrange(0, 5):
data = {
'email': 'test{}@example.com'.format(i),
'username': 'test_user{}'.format(i),
'password': 'test_pass',
'first_name': 'John{}'.format(i),
'last_name': 'Doe{}'.format(i)
}
response = self.do_post('/api/users', data)
self.assertEqual(response.status_code, 201)
users.append(response.data['id'])
if i < 2:
data = {'user_id': response.data['id']}
response = self.do_post('{}{}/users'.format(self.base_groups_uri, group_ids[i]), data)
self.assertEqual(response.status_code, 201)
# enroll all users in course
test_uri = self.base_courses_uri + '/' + self.test_course_id + '/users'
for user in users:
data = {'user_id': user}
response = self.do_post(test_uri, data)
self.assertEqual(response.status_code, 201)
# retrieve all users enrolled in the course and member of group 1
response = self.do_get('{}?groups={}'.format(test_uri, group_ids[0]))
self.assertEqual(response.status_code, 200)
self.assertGreaterEqual(len(response.data['enrollments']), 1)
# retrieve all users enrolled in the course and member of group 1 and group 2
response = self.do_get('{}?groups={},{}'.format(test_uri, group_ids[0], group_ids[1]))
self.assertEqual(response.status_code, 200)
self.assertGreaterEqual(len(response.data['enrollments']), 2)
# retrieve all users enrolled in the course and not member of group 1
response = self.do_get('{}?exclude_groups={}'.format(test_uri, group_ids[0]))
self.assertEqual(response.status_code, 200)
self.assertGreaterEqual(len(response.data['enrollments']), 4)
def test_courses_users_detail_get(self):
test_uri = self.base_courses_uri + '/' + self.test_course_id + '/users'
test_user_uri = '/api/users'
......
......@@ -921,11 +921,17 @@ class CoursesUsersList(SecureAPIView):
* username: The username of the user.
* GET supports filtering of user by organization(s) like this
* GET supports filtering of user by organization(s), groups
* To get users enrolled in a course and are also member of organization
/api/courses/{course_id}/users?organizations={organization_id}
```/api/courses/{course_id}/users?organizations={organization_id}```
* organizations filter can be a single id or multiple ids separated by comma
/api/courses/{course_id}/users?organizations={organization_id1},{organization_id2}
```/api/courses/{course_id}/users?organizations={organization_id1},{organization_id2}```
* To get users enrolled in a course and also member of specific groups
```/api/courses/{course_id}/users?groups={group_id1},{group_id2}```
* GET supports exclude filtering of user by groups
* To get users enrolled in a course and also not member of specific groups
```/api/courses/{course_id}/users?exclude_groups={group_id1},{group_id2}```
**Post Values**
......@@ -972,6 +978,8 @@ class CoursesUsersList(SecureAPIView):
GET /api/courses/{course_id}
"""
orgs = request.QUERY_PARAMS.get('organizations')
groups = request.QUERY_PARAMS.get('groups', None)
exclude_groups = request.QUERY_PARAMS.get('exclude_groups', None)
response_data = OrderedDict()
base_uri = generate_base_uri(request)
response_data['uri'] = base_uri
......@@ -980,11 +988,17 @@ class CoursesUsersList(SecureAPIView):
return Response({}, status=status.HTTP_404_NOT_FOUND)
# Get a list of all enrolled students
users = CourseEnrollment.users_enrolled_in(course_key)
upper_bound = getattr(settings, 'API_LOOKUP_UPPER_BOUND', 100)
if orgs:
if ',' in orgs:
upper_bound = getattr(settings, 'API_LOOKUP_UPPER_BOUND', 100)
orgs = orgs.split(",")[:upper_bound]
orgs = orgs.split(",")[:upper_bound]
users = users.filter(organizations__in=orgs)
if groups:
groups = groups.split(",")[:upper_bound]
users = users.filter(groups__in=groups)
if exclude_groups:
exclude_groups = exclude_groups.split(",")[:upper_bound]
users = users.exclude(groups__in=exclude_groups)
response_data['enrollments'] = []
for user in users:
user_data = OrderedDict()
......
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