Commit 0078eeb7 by Zia Fazal Committed by Jonathan Piacenti

added workgroup users delete support

parent 6e68789c
...@@ -898,7 +898,7 @@ class UsersWorkgroupsList(SecureListAPIView): ...@@ -898,7 +898,7 @@ class UsersWorkgroupsList(SecureListAPIView):
- URI: ```/api/users/{user_id}/workgroups/``` - URI: ```/api/users/{user_id}/workgroups/```
- GET: Provides paginated list of workgroups for a user - GET: Provides paginated list of workgroups for a user
To filter the user's workgroup set by course To filter the user's workgroup set by course
GET ```/api/users/{user_id}/workgroups/?course={course_id}``` GET ```/api/users/{user_id}/workgroups/?course_id={course_id}```
""" """
serializer_class = BasicWorkgroupSerializer serializer_class = BasicWorkgroupSerializer
......
...@@ -29,6 +29,11 @@ class SecureClient(Client): ...@@ -29,6 +29,11 @@ class SecureClient(Client):
kwargs.update({'SERVER_PORT': 443, 'wsgi.url_scheme': 'https'}) kwargs.update({'SERVER_PORT': 443, 'wsgi.url_scheme': 'https'})
super(SecureClient, self).__init__(*args, **kwargs) super(SecureClient, self).__init__(*args, **kwargs)
def delete_with_data(self, *args, **kwargs):
""" Construct a DELETE request that includes data."""
kwargs.update({'REQUEST_METHOD': 'DELETE'})
return super(SecureClient, self).put(*args, **kwargs)
@override_settings(EDX_API_KEY=TEST_API_KEY) @override_settings(EDX_API_KEY=TEST_API_KEY)
class WorkgroupsApiTests(ModuleStoreTestCase): class WorkgroupsApiTests(ModuleStoreTestCase):
...@@ -123,6 +128,16 @@ class WorkgroupsApiTests(ModuleStoreTestCase): ...@@ -123,6 +128,16 @@ class WorkgroupsApiTests(ModuleStoreTestCase):
response = self.client.delete(uri, headers=headers) response = self.client.delete(uri, headers=headers)
return response return response
def do_delete_with_data(self, uri, data):
"""Submit an HTTP DELETE request with payload """
headers = {
'Content-Type': 'application/json',
'X-Edx-Api-Key': str(TEST_API_KEY),
}
response = self.client.delete_with_data(uri, data, headers=headers)
return response
def test_workgroups_list_post(self): def test_workgroups_list_post(self):
data = { data = {
'name': self.test_workgroup_name, 'name': self.test_workgroup_name,
...@@ -233,6 +248,37 @@ class WorkgroupsApiTests(ModuleStoreTestCase): ...@@ -233,6 +248,37 @@ class WorkgroupsApiTests(ModuleStoreTestCase):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['users'][0]['id'], self.test_user.id) self.assertEqual(response.data['users'][0]['id'], self.test_user.id)
def test_workgroups_users_delete(self):
data = {
'name': self.test_workgroup_name,
'project': self.test_project.id
}
response = self.do_post(self.test_workgroups_uri, data)
self.assertEqual(response.status_code, 201)
test_workgroup_uri = response.data['url']
test_uri = '{}{}/'.format(self.test_workgroups_uri, str(response.data['id']))
users_uri = '{}users/'.format(test_uri)
data = {"id": self.test_user.id}
response = self.do_post(users_uri, data)
self.assertEqual(response.status_code, 201)
# test if workgroup has exactly one user
response = self.do_get(test_workgroup_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['users']), 1)
# test to delete a user from workgroup
data = {"id": self.test_user.id}
response = self.do_delete_with_data(users_uri, data)
self.assertEqual(response.status_code, 204)
response = self.do_get(test_workgroup_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['users']), 0)
# test to delete an invalide user from workgroup
data = {"id": '345345344'}
response = self.do_delete_with_data(users_uri, data)
self.assertEqual(response.status_code, 400)
def test_workgroups_users_get(self): def test_workgroups_users_get(self):
data = { data = {
'name': self.test_workgroup_name, 'name': self.test_workgroup_name,
......
...@@ -73,7 +73,7 @@ class WorkgroupsViewSet(viewsets.ModelViewSet): ...@@ -73,7 +73,7 @@ class WorkgroupsViewSet(viewsets.ModelViewSet):
print workgroup.groups.all() print workgroup.groups.all()
return Response({}, status=status.HTTP_201_CREATED) return Response({}, status=status.HTTP_201_CREATED)
@action(methods=['get', 'post']) @action(methods=['get', 'post', 'delete'])
def users(self, request, pk): def users(self, request, pk):
""" """
Add a User to a Workgroup Add a User to a Workgroup
...@@ -86,7 +86,7 @@ class WorkgroupsViewSet(viewsets.ModelViewSet): ...@@ -86,7 +86,7 @@ class WorkgroupsViewSet(viewsets.ModelViewSet):
serializer = UserSerializer(user) serializer = UserSerializer(user)
response_data.append(serializer.data) response_data.append(serializer.data)
return Response(response_data, status=status.HTTP_200_OK) return Response(response_data, status=status.HTTP_200_OK)
else: elif request.method == 'POST':
user_id = request.DATA.get('id') user_id = request.DATA.get('id')
try: try:
user = User.objects.get(id=user_id) user = User.objects.get(id=user_id)
...@@ -97,6 +97,16 @@ class WorkgroupsViewSet(viewsets.ModelViewSet): ...@@ -97,6 +97,16 @@ class WorkgroupsViewSet(viewsets.ModelViewSet):
workgroup.users.add(user) workgroup.users.add(user)
workgroup.save() workgroup.save()
return Response({}, status=status.HTTP_201_CREATED) return Response({}, status=status.HTTP_201_CREATED)
else:
user_id = request.DATA.get('id')
try:
user = User.objects.get(id=user_id)
except ObjectDoesNotExist:
message = 'User {} does not exist'.format(user_id)
return Response({"detail": message}, status.HTTP_400_BAD_REQUEST)
workgroup = self.get_object()
workgroup.users.remove(user)
return Response({}, status=status.HTTP_204_NO_CONTENT)
@link() @link()
def peer_reviews(self, request, pk): def peer_reviews(self, request, pk):
......
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