Commit 29a82ecc by Zia Fazal Committed by Jonathan Piacenti

implemented paging on groups list

parent 33e5803e
...@@ -111,7 +111,8 @@ class GroupsApiTests(ModuleStoreTestCase): ...@@ -111,7 +111,8 @@ class GroupsApiTests(ModuleStoreTestCase):
def test_group_list_get_with_profile(self): def test_group_list_get_with_profile(self):
group_type = 'series' group_type = 'series'
profile_data = {'display_name': 'My first series'} display_name = 'My first series'
profile_data = {'display_name': display_name}
data = { data = {
'name': self.test_group_name, 'name': self.test_group_name,
'type': group_type, 'type': group_type,
...@@ -130,13 +131,14 @@ class GroupsApiTests(ModuleStoreTestCase): ...@@ -130,13 +131,14 @@ class GroupsApiTests(ModuleStoreTestCase):
test_uri = '{}?type={}'.format(self.base_groups_uri, group_type) test_uri = '{}?type={}'.format(self.base_groups_uri, group_type)
response = self.do_get(test_uri) response = self.do_get(test_uri)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['count'], 1)
self.assertEqual(len(response.data), 1) self.assertEqual(response.data['num_pages'], 1)
self.assertEqual(response.data[0]['id'], group_id) self.assertEqual(len(response.data['results']), 1)
self.assertEqual(response.data[0]['type'], 'series') self.assertEqual(response.data['results'][0]['id'], group_id)
self.assertEqual(response.data[0]['name'], self.test_group_name) self.assertEqual(response.data['results'][0]['type'], group_type)
response_profile_data = response.data[0]['data'] self.assertEqual(response.data['results'][0]['name'], self.test_group_name)
self.assertEqual(response_profile_data['display_name'], 'My first series') response_profile_data = response.data['results'][0]['data']
self.assertEqual(response_profile_data['display_name'], display_name)
# query the group detail # query the group detail
test_uri = '{}/{}'.format(self.base_groups_uri, str(group_id)) test_uri = '{}/{}'.format(self.base_groups_uri, str(group_id))
...@@ -146,15 +148,17 @@ class GroupsApiTests(ModuleStoreTestCase): ...@@ -146,15 +148,17 @@ class GroupsApiTests(ModuleStoreTestCase):
confirm_uri = self.test_server_prefix + test_uri confirm_uri = self.test_server_prefix + test_uri
self.assertEqual(response.data['uri'], confirm_uri) self.assertEqual(response.data['uri'], confirm_uri)
self.assertEqual(response.data['name'], self.test_group_name) self.assertEqual(response.data['name'], self.test_group_name)
self.assertEqual(response.data['type'], 'series') self.assertEqual(response.data['type'], group_type)
response_profile_data = response.data['data'] response_profile_data = response.data['data']
self.assertEqual(response_profile_data['display_name'], 'My first series') self.assertEqual(response_profile_data['display_name'], display_name)
# update the profile # update the profile
profile_data = {'display_name': 'My updated series'} updated_group_type = 'seriesX'
updated_display_name = 'My updated series'
profile_data = {'display_name': updated_display_name}
data = { data = {
'name': self.test_group_name, 'name': self.test_group_name,
'type': 'seriesX', 'type': updated_group_type,
'data': profile_data 'data': profile_data
} }
response = self.do_post(test_uri, data) response = self.do_post(test_uri, data)
...@@ -164,17 +168,17 @@ class GroupsApiTests(ModuleStoreTestCase): ...@@ -164,17 +168,17 @@ class GroupsApiTests(ModuleStoreTestCase):
test_uri = self.base_groups_uri + '?type=series' test_uri = self.base_groups_uri + '?type=series'
response = self.do_get(test_uri) response = self.do_get(test_uri)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 0) self.assertEqual(len(response.data['results']), 0)
test_uri = self.base_groups_uri + '?type=seriesX' test_uri = '{}?type={}'.format(self.base_groups_uri, updated_group_type)
response = self.do_get(test_uri) response = self.do_get(test_uri)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 1) self.assertEqual(len(response.data['results']), 1)
self.assertEqual(response.data[0]['id'], group_id) self.assertEqual(response.data['results'][0]['id'], group_id)
self.assertEqual(response.data[0]['type'], 'seriesX') self.assertEqual(response.data['results'][0]['type'], updated_group_type)
self.assertEqual(response.data[0]['name'], self.test_group_name) self.assertEqual(response.data['results'][0]['name'], self.test_group_name)
response_profile_data = response.data[0]['data'] response_profile_data = response.data['results'][0]['data']
self.assertEqual(response_profile_data['display_name'], 'My updated series') self.assertEqual(response_profile_data['display_name'], updated_display_name)
def test_group_list_post_invalid_name(self): def test_group_list_post_invalid_name(self):
data = {'name': '', 'type': 'test'} data = {'name': '', 'type': 'test'}
...@@ -197,12 +201,12 @@ class GroupsApiTests(ModuleStoreTestCase): ...@@ -197,12 +201,12 @@ class GroupsApiTests(ModuleStoreTestCase):
test_uri = '{}?type=test'.format(self.base_groups_uri) test_uri = '{}?type=test'.format(self.base_groups_uri)
response = self.do_get(test_uri) response = self.do_get(test_uri)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(response.data[0]['name'], '{:04d}: {}'.format(group_id, self.test_group_name)) self.assertEqual(response.data['results'][0]['name'], '{:04d}: {}'.format(group_id, self.test_group_name))
profile.name = None profile.name = None
profile.save() profile.save()
response = self.do_get(test_uri) response = self.do_get(test_uri)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(response.data[0]['name'], '{:04d}: {}'.format(group_id, self.test_group_name)) self.assertEqual(response.data['results'][0]['name'], '{:04d}: {}'.format(group_id, self.test_group_name))
def test_group_detail_get(self): def test_group_detail_get(self):
data = {'name': self.test_group_name, 'type': 'test'} data = {'name': self.test_group_name, 'type': 'test'}
......
...@@ -14,13 +14,13 @@ from api_manager.models import GroupRelationship, CourseGroupRelationship, Group ...@@ -14,13 +14,13 @@ from api_manager.models import GroupRelationship, CourseGroupRelationship, Group
from api_manager.permissions import SecureAPIView, SecureListAPIView from api_manager.permissions import SecureAPIView, SecureListAPIView
from api_manager.utils import str2bool, generate_base_uri from api_manager.utils import str2bool, generate_base_uri
from api_manager.organizations import serializers from api_manager.organizations import serializers
from projects.serializers import BasicWorkgroupSerializer from projects.serializers import BasicWorkgroupSerializer, GroupSerializer
RELATIONSHIP_TYPES = {'hierarchical': 'h', 'graph': 'g'} RELATIONSHIP_TYPES = {'hierarchical': 'h', 'graph': 'g'}
class GroupsList(SecureAPIView): class GroupsList(SecureListAPIView):
""" """
### The GroupsList view allows clients to retrieve/append a list of Group entities ### The GroupsList view allows clients to retrieve/append a list of Group entities
- URI: ```/api/groups/``` - URI: ```/api/groups/```
...@@ -55,6 +55,7 @@ class GroupsList(SecureAPIView): ...@@ -55,6 +55,7 @@ class GroupsList(SecureAPIView):
** organization: display_name, contact_name, phone, email ** organization: display_name, contact_name, phone, email
* Ultimately, both 'type' and 'data' are determined by the client/caller. Open edX has no type or data specifications at the present time. * Ultimately, both 'type' and 'data' are determined by the client/caller. Open edX has no type or data specifications at the present time.
""" """
serializer_class = GroupSerializer
def post(self, request): def post(self, request):
""" """
...@@ -91,30 +92,23 @@ class GroupsList(SecureAPIView): ...@@ -91,30 +92,23 @@ class GroupsList(SecureAPIView):
response_status = status.HTTP_201_CREATED response_status = status.HTTP_201_CREATED
return Response(response_data, status=response_status) return Response(response_data, status=response_status)
def get(self, request): def get(self, request, *args, **kwargs):
""" """
GET /api/groups if checks if get request has `type` filter
""" """
response_data = []
group_type = request.QUERY_PARAMS.get('type', None) group_type = request.QUERY_PARAMS.get('type', None)
if group_type is None: if group_type is None:
return Response({}, status=status.HTTP_400_BAD_REQUEST) return Response({}, status=status.HTTP_400_BAD_REQUEST)
profiles = GroupProfile.objects.filter(group_type=request.GET['type']).select_related('group') else:
for profile in profiles: return self.list(request, *args, **kwargs)
item_data = {}
item_data['id'] = profile.group_id
if profile.name and len(profile.name):
group_name = profile.name
else:
group_name = profile.group.name
item_data['name'] = group_name
item_data['type'] = profile.group_type
if profile.data:
item_data['data'] = json.loads(profile.data)
item_data['uri'] = '{}/{}'.format(generate_base_uri(request, True), profile.group_id)
response_data.append(item_data)
return Response(response_data, status=status.HTTP_200_OK)
def get_queryset(self):
"""
returns queryset filter by group type
"""
group_type = self.request.QUERY_PARAMS.get('type', None)
groups = Group.objects.filter(groupprofile__group_type=group_type).select_related('group')
return groups
class GroupsDetail(SecureAPIView): class GroupsDetail(SecureAPIView):
""" """
......
""" Django REST Framework Serializers """ """ Django REST Framework Serializers """
import json
from django.contrib.auth.models import Group, User from django.contrib.auth.models import Group, User
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
...@@ -21,6 +22,8 @@ class UserSerializer(serializers.HyperlinkedModelSerializer): ...@@ -21,6 +22,8 @@ class UserSerializer(serializers.HyperlinkedModelSerializer):
class GroupSerializer(serializers.HyperlinkedModelSerializer): class GroupSerializer(serializers.HyperlinkedModelSerializer):
""" Serializer for model interactions """ """ Serializer for model interactions """
name = serializers.SerializerMethodField('get_group_name') name = serializers.SerializerMethodField('get_group_name')
type = serializers.SerializerMethodField('get_group_type')
data = serializers.SerializerMethodField('get_group_data')
def get_group_name(self, group): def get_group_name(self, group):
""" """
...@@ -29,15 +32,38 @@ class GroupSerializer(serializers.HyperlinkedModelSerializer): ...@@ -29,15 +32,38 @@ class GroupSerializer(serializers.HyperlinkedModelSerializer):
""" """
try: try:
group_profile = group.groupprofile group_profile = group.groupprofile
if group_profile: if group_profile and group_profile.name:
return group_profile.name return group_profile.name
else:
return group.name
except ObjectDoesNotExist: except ObjectDoesNotExist:
return group.name return group.name
def get_group_type(self, group):
"""
Loads data from group profile
"""
try:
group_profile = group.groupprofile
return group_profile.group_type
except ObjectDoesNotExist:
return None
def get_group_data(self, group):
"""
Loads data from group profile
"""
try:
group_profile = group.groupprofile
if group_profile.data:
return json.loads(group_profile.data)
except ObjectDoesNotExist:
return None
class Meta: class Meta:
""" Meta class for defining additional serializer characteristics """ """ Meta class for defining additional serializer characteristics """
model = Group model = Group
fields = ('id', 'url', 'name') fields = ('id', 'url', 'name', 'type', 'data')
class GradeSerializer(serializers.Serializer): class GradeSerializer(serializers.Serializer):
......
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