Skip to content

Commit

Permalink
orgs extras CRUD
Browse files Browse the repository at this point in the history
  • Loading branch information
snyaggarwal committed Sep 10, 2020
1 parent 57b1532 commit 2022011
Show file tree
Hide file tree
Showing 4 changed files with 167 additions and 1 deletion.
1 change: 1 addition & 0 deletions core/fixtures/base_entities.yaml
Expand Up @@ -18,6 +18,7 @@
first_name: OCL
last_name: Admin
company: OCL
website: 'openconceptlab.org'
is_staff: true
is_superuser: true
organizations:
Expand Down
100 changes: 100 additions & 0 deletions core/integration_tests/tests_orgs.py
Expand Up @@ -321,3 +321,103 @@ def test_delete_204(self):

self.assertEqual(response.status_code, 204)
self.assertEqual(self.user.organizations.count(), 0)


class OrganizationExtrasViewTest(OCLAPITestCase):
def test_get_200(self):
org = OrganizationFactory(extras=dict())
user = UserProfileFactory(organizations=[org])
token = user.get_token()

response = self.client.get(
org.uri + 'extras/',
HTTP_AUTHORIZATION='Token ' + token,
format='json'
)

self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, dict())

org = OrganizationFactory(extras=dict(foo='bar'))

response = self.client.get(
org.uri + 'extras/',
HTTP_AUTHORIZATION='Token ' + token,
format='json'
)

self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, dict(foo='bar'))


class OrganizationExtraRetrieveUpdateDestroyViewTest(OCLAPITestCase):
def setUp(self):
super().setUp()
self.extras = dict(foo='bar', tao='ching')
self.organization = OrganizationFactory(extras=self.extras)
self.user = UserProfileFactory(organizations=[self.organization])
self.token = self.user.get_token()

def test_get_200(self):
response = self.client.get(
self.organization.uri + 'extras/foo/',
HTTP_AUTHORIZATION='Token ' + self.token,
format='json'
)

self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, dict(foo='bar'))

def test_get_404(self):
response = self.client.get(
self.organization.uri + 'extras/bar/',
HTTP_AUTHORIZATION='Token ' + self.token,
format='json'
)

self.assertEqual(response.status_code, 404)

def test_put_200(self):
response = self.client.put(
self.organization.uri + 'extras/foo/',
dict(foo='foobar'),
HTTP_AUTHORIZATION='Token ' + self.token,
format='json'
)

self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, dict(foo='foobar'))
self.organization.refresh_from_db()
self.assertEqual(self.organization.extras, dict(foo='foobar', tao='ching'))

def test_put_400(self):
response = self.client.put(
self.organization.uri + 'extras/foo/',
dict(tao='te-ching'),
HTTP_AUTHORIZATION='Token ' + self.token,
format='json'
)

self.assertEqual(response.status_code, 400)
self.assertEqual(response.data, ['Must specify foo param in body.'])

def test_delete(self):
response = self.client.delete(
self.organization.uri + 'extras/foo/',
HTTP_AUTHORIZATION='Token ' + self.token,
format='json'
)

self.assertEqual(response.status_code, 204)
self.organization.refresh_from_db()
self.assertEqual(self.organization.extras, dict(tao='ching'))

response = self.client.delete(
self.organization.uri + 'extras/foo/',
HTTP_AUTHORIZATION='Token ' + self.token,
format='json'
)

self.assertEqual(response.status_code, 404)
self.organization.refresh_from_db()
self.assertEqual(self.organization.extras, dict(tao='ching'))
10 changes: 10 additions & 0 deletions core/orgs/urls.py
Expand Up @@ -11,11 +11,21 @@
views.OrganizationDetailView.as_view(),
name='organization-detail'
),
re_path(
r'^(?P<org>' + NAMESPACE_PATTERN + ')/extras/$',
views.OrganizationExtrasView.as_view(),
name='organization-extras'
),
re_path(
r'^(?P<org>' + NAMESPACE_PATTERN + ')/members/$',
UserListView.as_view(),
name='organization-members'
),
re_path(
r"^(?P<org>{pattern})/extras/(?P<extra>{pattern})/$".format(pattern=NAMESPACE_PATTERN),
views.OrganizationExtraRetrieveUpdateDestroyView.as_view(),
name='organization-extra'
),
re_path(
r'^(?P<org>' + NAMESPACE_PATTERN + ')/members/(?P<user>' + NAMESPACE_PATTERN + ')/$',
views.OrganizationMemberView.as_view(),
Expand Down
57 changes: 56 additions & 1 deletion core/orgs/views.py
@@ -1,7 +1,10 @@
from django.http import Http404
from pydash import get
from rest_framework import mixins, status, generics
from rest_framework.generics import RetrieveAPIView, DestroyAPIView
from rest_framework.generics import RetrieveAPIView, DestroyAPIView, RetrieveUpdateDestroyAPIView
from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnly
from rest_framework.response import Response
from rest_framework.views import APIView

from core.collections.views import CollectionListView
from core.common.mixins import ListWithHeadersMixin
Expand Down Expand Up @@ -185,3 +188,55 @@ class OrganizationCollectionListView(CollectionListView): # pragma: no cover
def get_queryset(self):
user = UserProfile.objects.get(username=self.kwargs.get('user', None))
return self.queryset.filter(organization__in=user.organizations.all())


class OrganizationExtrasBaseView(APIView):
def get_object(self):
instance = Organization.objects.filter(is_active=True, mnemonic=self.kwargs['org']).first()

if not instance:
raise Http404()
return instance


class OrganizationExtrasView(OrganizationExtrasBaseView):
serializer_class = OrganizationDetailSerializer

def get(self, request, org): # pylint: disable=unused-argument
return Response(get(self.get_object(), 'extras', {}))


class OrganizationExtraRetrieveUpdateDestroyView(OrganizationExtrasBaseView, RetrieveUpdateDestroyAPIView):
serializer_class = OrganizationDetailSerializer

def retrieve(self, request, *args, **kwargs):
key = kwargs.get('extra')
instance = self.get_object()
extras = get(instance, 'extras', {})
if key in extras:
return Response({key: extras[key]})

return Response(dict(detail='Not found.'), status=status.HTTP_404_NOT_FOUND)

def update(self, request, **kwargs):
key = kwargs.get('extra')
value = request.data.get(key)
if not value:
return Response(['Must specify %s param in body.' % key], status=status.HTTP_400_BAD_REQUEST)

instance = self.get_object()
instance.extras = get(instance, 'extras', {})
instance.extras[key] = value
instance.save()
return Response({key: value})

def delete(self, request, *args, **kwargs):
key = kwargs.get('extra')
instance = self.get_object()
instance.extras = get(instance, 'extras', {})
if key in instance.extras:
del instance.extras[key]
instance.save()
return Response(status=status.HTTP_204_NO_CONTENT)

return Response(dict(detail='Not found.'), status=status.HTTP_404_NOT_FOUND)

0 comments on commit 2022011

Please sign in to comment.