Commit 29a82ecc by Zia Fazal Committed by Jonathan Piacenti

implemented paging on groups list

parent 33e5803e
......@@ -111,7 +111,8 @@ class GroupsApiTests(ModuleStoreTestCase):
def test_group_list_get_with_profile(self):
group_type = 'series'
profile_data = {'display_name': 'My first series'}
display_name = 'My first series'
profile_data = {'display_name': display_name}
data = {
'name': self.test_group_name,
'type': group_type,
......@@ -130,13 +131,14 @@ class GroupsApiTests(ModuleStoreTestCase):
test_uri = '{}?type={}'.format(self.base_groups_uri, group_type)
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 1)
self.assertEqual(response.data[0]['id'], group_id)
self.assertEqual(response.data[0]['type'], 'series')
self.assertEqual(response.data[0]['name'], self.test_group_name)
response_profile_data = response.data[0]['data']
self.assertEqual(response_profile_data['display_name'], 'My first series')
self.assertEqual(response.data['count'], 1)
self.assertEqual(response.data['num_pages'], 1)
self.assertEqual(len(response.data['results']), 1)
self.assertEqual(response.data['results'][0]['id'], group_id)
self.assertEqual(response.data['results'][0]['type'], group_type)
self.assertEqual(response.data['results'][0]['name'], self.test_group_name)
response_profile_data = response.data['results'][0]['data']
self.assertEqual(response_profile_data['display_name'], display_name)
# query the group detail
test_uri = '{}/{}'.format(self.base_groups_uri, str(group_id))
......@@ -146,15 +148,17 @@ class GroupsApiTests(ModuleStoreTestCase):
confirm_uri = self.test_server_prefix + test_uri
self.assertEqual(response.data['uri'], confirm_uri)
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']
self.assertEqual(response_profile_data['display_name'], 'My first series')
self.assertEqual(response_profile_data['display_name'], display_name)
# 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 = {
'name': self.test_group_name,
'type': 'seriesX',
'type': updated_group_type,
'data': profile_data
}
response = self.do_post(test_uri, data)
......@@ -164,17 +168,17 @@ class GroupsApiTests(ModuleStoreTestCase):
test_uri = self.base_groups_uri + '?type=series'
response = self.do_get(test_uri)
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)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 1)
self.assertEqual(response.data[0]['id'], group_id)
self.assertEqual(response.data[0]['type'], 'seriesX')
self.assertEqual(response.data[0]['name'], self.test_group_name)
response_profile_data = response.data[0]['data']
self.assertEqual(response_profile_data['display_name'], 'My updated series')
self.assertEqual(len(response.data['results']), 1)
self.assertEqual(response.data['results'][0]['id'], group_id)
self.assertEqual(response.data['results'][0]['type'], updated_group_type)
self.assertEqual(response.data['results'][0]['name'], self.test_group_name)
response_profile_data = response.data['results'][0]['data']
self.assertEqual(response_profile_data['display_name'], updated_display_name)
def test_group_list_post_invalid_name(self):
data = {'name': '', 'type': 'test'}
......@@ -197,12 +201,12 @@ class GroupsApiTests(ModuleStoreTestCase):
test_uri = '{}?type=test'.format(self.base_groups_uri)
response = self.do_get(test_uri)
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.save()
response = self.do_get(test_uri)
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):
data = {'name': self.test_group_name, 'type': 'test'}
......
......@@ -14,13 +14,13 @@ from api_manager.models import GroupRelationship, CourseGroupRelationship, Group
from api_manager.permissions import SecureAPIView, SecureListAPIView
from api_manager.utils import str2bool, generate_base_uri
from api_manager.organizations import serializers
from projects.serializers import BasicWorkgroupSerializer
from projects.serializers import BasicWorkgroupSerializer, GroupSerializer
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
- URI: ```/api/groups/```
......@@ -55,6 +55,7 @@ class GroupsList(SecureAPIView):
** 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.
"""
serializer_class = GroupSerializer
def post(self, request):
"""
......@@ -91,30 +92,23 @@ class GroupsList(SecureAPIView):
response_status = status.HTTP_201_CREATED
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)
if group_type is None:
return Response({}, status=status.HTTP_400_BAD_REQUEST)
profiles = GroupProfile.objects.filter(group_type=request.GET['type']).select_related('group')
for profile in profiles:
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)
else:
return self.list(request, *args, **kwargs)
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):
"""
......
""" Django REST Framework Serializers """
import json
from django.contrib.auth.models import Group, User
from django.core.exceptions import ObjectDoesNotExist
......@@ -21,6 +22,8 @@ class UserSerializer(serializers.HyperlinkedModelSerializer):
class GroupSerializer(serializers.HyperlinkedModelSerializer):
""" Serializer for model interactions """
name = serializers.SerializerMethodField('get_group_name')
type = serializers.SerializerMethodField('get_group_type')
data = serializers.SerializerMethodField('get_group_data')
def get_group_name(self, group):
"""
......@@ -29,15 +32,38 @@ class GroupSerializer(serializers.HyperlinkedModelSerializer):
"""
try:
group_profile = group.groupprofile
if group_profile:
if group_profile and group_profile.name:
return group_profile.name
else:
return group.name
except ObjectDoesNotExist:
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:
""" Meta class for defining additional serializer characteristics """
model = Group
fields = ('id', 'url', 'name')
fields = ('id', 'url', 'name', 'type', 'data')
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