Commit 03e0bf7d by Zia Fazal Committed by Jonathan Piacenti

ziafazal/api-org-groups-relationship: added group

association with organisation
parent fab6e489
import json
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth.models import Group
from rest_framework import serializers
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):
"""
Group name is actually stored on the profile record, in order to
allow for duplicate name values in the system.
"""
try:
group_profile = group.groupprofile
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', 'type', 'data')
...@@ -254,6 +254,45 @@ class OrganizationsApiTests(ModuleStoreTestCase): ...@@ -254,6 +254,45 @@ class OrganizationsApiTests(ModuleStoreTestCase):
response = self.do_post(users_uri, data) response = self.do_post(users_uri, data)
self.assertEqual(response.status_code, 400) self.assertEqual(response.status_code, 400)
def test_organizations_groups_get_post(self):
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)
org_id = response.data['id']
# create groups
max_groups, groups = 4, []
for i in xrange(1, max_groups + 1):
data = {
'name': '{} {}'.format('Test Group', i),
'type': 'contactgroup',
'data': {'display_name': 'organization contacts group'}
}
response = self.do_post(self.base_groups_uri, data)
self.assertEqual(response.status_code, 201)
groups.append(response.data['id'])
test_uri = '{}{}/'.format(self.base_organizations_uri, org_id)
groups_uri = '{}groups/'.format(test_uri)
for group in groups:
data = {"id": group}
response = self.do_post(groups_uri, data)
self.assertEqual(response.status_code, 201)
response = self.do_get(groups_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), max_groups)
# post an invalid group
data = {"id": '45533333'}
response = self.do_post(groups_uri, data)
self.assertEqual(response.status_code, 400)
def test_organizations_users_get(self): def test_organizations_users_get(self):
data = { data = {
'name': self.test_organization_name, 'name': self.test_organization_name,
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
""" ORGANIZATIONS API VIEWS """ """ ORGANIZATIONS API VIEWS """
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User, Group
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.db.models import Avg, F from django.db.models import Avg, F
...@@ -13,6 +13,7 @@ from rest_framework.response import Response ...@@ -13,6 +13,7 @@ from rest_framework.response import Response
from api_manager.courseware_access import get_course_key from api_manager.courseware_access import get_course_key
from api_manager.models import Organization from api_manager.models import Organization
from api_manager.users.serializers import UserSerializer from api_manager.users.serializers import UserSerializer
from api_manager.groups.serializers import GroupSerializer
from api_manager.utils import str2bool from api_manager.utils import str2bool
from gradebook.models import StudentGradebook from gradebook.models import StudentGradebook
from student.models import CourseEnrollment from student.models import CourseEnrollment
...@@ -86,3 +87,28 @@ class OrganizationsViewSet(viewsets.ModelViewSet): ...@@ -86,3 +87,28 @@ class OrganizationsViewSet(viewsets.ModelViewSet):
organization.users.add(user) organization.users.add(user)
organization.save() organization.save()
return Response({}, status=status.HTTP_201_CREATED) return Response({}, status=status.HTTP_201_CREATED)
@action(methods=['get', 'post'])
def groups(self, request, pk):
"""
Add a Group to a organization or retrieve list of groups in organization
"""
if request.method == 'GET':
groups = Group.objects.filter(organizations=pk)
response_data = []
if groups:
for group in groups:
serializer = GroupSerializer(group)
response_data.append(serializer.data) # pylint: disable=E1101
return Response(response_data, status=status.HTTP_200_OK)
else:
group_id = request.DATA.get('id')
try:
group = Group.objects.get(id=group_id)
except ObjectDoesNotExist:
message = 'Group {} does not exist'.format(group_id)
return Response({"detail": message}, status.HTTP_400_BAD_REQUEST)
organization = self.get_object()
organization.groups.add(group)
organization.save()
return Response({}, status=status.HTTP_201_CREATED)
""" Django REST Framework Serializers """ """ Django REST Framework Serializers """
import json from django.contrib.auth.models import User
from django.contrib.auth.models import Group, User
from django.core.exceptions import ObjectDoesNotExist
from rest_framework import serializers from rest_framework import serializers
from api_manager.groups.serializers import GroupSerializer
from .models import Project, Workgroup, WorkgroupSubmission from .models import Project, Workgroup, WorkgroupSubmission
from .models import WorkgroupReview, WorkgroupSubmissionReview, WorkgroupPeerReview from .models import WorkgroupReview, WorkgroupSubmissionReview, WorkgroupPeerReview
...@@ -19,53 +18,6 @@ class UserSerializer(serializers.HyperlinkedModelSerializer): ...@@ -19,53 +18,6 @@ class UserSerializer(serializers.HyperlinkedModelSerializer):
fields = ('id', 'url', 'username', 'email') fields = ('id', 'url', 'username', 'email')
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):
"""
Group name is actually stored on the profile record, in order to
allow for duplicate name values in the system.
"""
try:
group_profile = group.groupprofile
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', 'type', 'data')
class GradeSerializer(serializers.Serializer): class GradeSerializer(serializers.Serializer):
""" Serializer for model interactions """ """ Serializer for model interactions """
grade = serializers.Field() grade = serializers.Field()
......
...@@ -17,6 +17,7 @@ from django.test.utils import override_settings ...@@ -17,6 +17,7 @@ from django.test.utils import override_settings
from api_manager.models import GroupProfile from api_manager.models import GroupProfile
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from projects.models import Project, Workgroup from projects.models import Project, Workgroup
from student.tests.factories import CourseEnrollmentFactory
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
from openedx.core.djangoapps.course_groups.cohorts import (get_cohort_by_name, remove_user_from_cohort, from openedx.core.djangoapps.course_groups.cohorts import (get_cohort_by_name, remove_user_from_cohort,
delete_empty_cohort, is_user_in_cohort, get_course_cohort_names) delete_empty_cohort, is_user_in_cohort, get_course_cohort_names)
...@@ -110,6 +111,8 @@ class WorkgroupsApiTests(ModuleStoreTestCase): ...@@ -110,6 +111,8 @@ class WorkgroupsApiTests(ModuleStoreTestCase):
username=self.test_user_username2 username=self.test_user_username2
) )
CourseEnrollmentFactory.create(user=self.test_user, course_id=self.test_course.id)
CourseEnrollmentFactory.create(user=self.test_user2, course_id=self.test_course.id)
self.client = SecureClient() self.client = SecureClient()
cache.clear() cache.clear()
......
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