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):
response = self.do_post(users_uri, data)
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):
data = {
'name': self.test_organization_name,
......
......@@ -2,7 +2,7 @@
""" ORGANIZATIONS API VIEWS """
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.db.models import Avg, F
......@@ -13,6 +13,7 @@ from rest_framework.response import Response
from api_manager.courseware_access import get_course_key
from api_manager.models import Organization
from api_manager.users.serializers import UserSerializer
from api_manager.groups.serializers import GroupSerializer
from api_manager.utils import str2bool
from gradebook.models import StudentGradebook
from student.models import CourseEnrollment
......@@ -86,3 +87,28 @@ class OrganizationsViewSet(viewsets.ModelViewSet):
organization.users.add(user)
organization.save()
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 """
import json
from django.contrib.auth.models import Group, User
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth.models import User
from rest_framework import serializers
from api_manager.groups.serializers import GroupSerializer
from .models import Project, Workgroup, WorkgroupSubmission
from .models import WorkgroupReview, WorkgroupSubmissionReview, WorkgroupPeerReview
......@@ -19,53 +18,6 @@ class UserSerializer(serializers.HyperlinkedModelSerializer):
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):
""" Serializer for model interactions """
grade = serializers.Field()
......
......@@ -17,6 +17,7 @@ from django.test.utils import override_settings
from api_manager.models import GroupProfile
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from projects.models import Project, Workgroup
from student.tests.factories import CourseEnrollmentFactory
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
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)
......@@ -110,6 +111,8 @@ class WorkgroupsApiTests(ModuleStoreTestCase):
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()
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