Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Added org info API #127

Merged
merged 11 commits into from
Jun 22, 2020
11 changes: 11 additions & 0 deletions org/responses.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,17 @@
}
]

get_org_200 = {
"id": 1,
"route_slug": "slug",
"can_join_without_invite": True,
"name": "test",
"tagline": "test",
"about": "test",
"profile_pic": "null",
"cover_pic": "null"
}

update_profile_pic_400 = {
"profile_pic": [
"Upload a valid image. The file you uploaded was either not an image or a corrupted image.",
Expand Down
9 changes: 4 additions & 5 deletions org/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
OrgView.as_view(),
name='org_view'
),
path(
'<int:org_id>/',
OrgDetailsView.as_view(),
),
path(
'<int:org_id>/volunteer/',
AddVolunteer,
Expand All @@ -18,11 +22,6 @@
GroupView.as_view(),
name='group_view',
),
path(
'<int:org_id>/',
EditOrg,
name='edit_org'
),
path(
'<int:org_id>/profile_pic/',
UpdateProfilePic,
Expand Down
141 changes: 62 additions & 79 deletions org/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,68 @@ def post(self, request):
data = serializer.errors
return Response(data, status.HTTP_400_BAD_REQUEST)

class OrgDetailsView(APIView):
permission_classes = [IsAuthenticated]

@swagger_auto_schema(
operation_id="edit_org",
request_body=EditOrgSerializer,
responses={
'200': set_example(responses.update_org_200),
'400': set_example(responses.org_not_present_400),
'401': set_example(responses.user_unauthorized_401),
'403': set_example(responses.admin_access_403),
}
)
def put(self, request, org_id):
user = request.user
try:
org = Org.objects.get(pk=org_id)
except Org.DoesNotExist:
return Response(responses.org_not_present_400, status.HTTP_400_BAD_REQUEST)

try:
member = Member.objects.get(user=user, org=org)
except Member.DoesNotExist:
return Response(responses.admin_access_403, status.HTTP_403_FORBIDDEN)

if member.group.perm_obj.permissions[Permissions.IS_ADMIN]:
serializer = EditOrgSerializer(org, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(responses.update_org_200, status.HTTP_200_OK)
return Response(serializer.errors, status.HTTP_400_BAD_REQUEST)
else:
return Response(responses.admin_access_403, status.HTTP_403_FORBIDDEN)

@swagger_auto_schema(
operation_id="get_org",
responses={
'200': set_example(responses.get_org_200),
'400': set_example(responses.org_not_present_400),
'401': set_example(responses.user_unauthorized_401),
}
)
def get(self, request, org_id):
user = request.user
try:
org = Org.objects.get(pk=org_id)
except Org.DoesNotExist:
return Response(responses.org_not_present_400, status.HTTP_400_BAD_REQUEST)

response_body = {
"id": org.id,
"route_slug": org.route_slug,
"can_join_without_invite": org.can_join_without_invite,
"name": org.name,
"tagline": org.tagline,
"about": org.about,
"profile_pic": request.build_absolute_uri(org.profile_pic.url) if org.profile_pic else None,
"cover_pic": request.build_absolute_uri(org.cover_pic.url) if org.cover_pic else None
}
return Response(response_body, status.HTTP_200_OK)


class GroupView(APIView):
permission_classes = [IsAuthenticated]

Expand Down Expand Up @@ -197,85 +259,6 @@ def AddVolunteer(request, org_id):
return Response({"detail": "Organization not present"}, status.HTTP_400_BAD_REQUEST)


@swagger_auto_schema(
operation_id="edit_org",
operation_description="When an authenticated user hits this API it gets added to the volunteer group",
method='PUT',
request_body=EditOrgSerializer,
responses={
'200': set_example(responses.update_org_200),
'400': set_example(responses.org_not_present_400),
'401': set_example(responses.user_unauthorized_401),
'403': set_example(responses.admin_access_403),
}
)
@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def EditOrg(request, org_id):
user = request.user
try:
org = Org.objects.get(pk=org_id)
except Org.DoesNotExist:
return Response(responses.org_not_present_400, status.HTTP_400_BAD_REQUEST)

try:
member = Member.objects.get(user=user, org=org)
except Member.DoesNotExist:
return Response(responses.admin_access_403, status.HTTP_403_FORBIDDEN)

isadmin = member.group.perm_obj.permissions_to_integer()
# Checking if the isadmin is odd or even, if odd then the IS_ADMIN permission is enabled for the user
if isadmin % 2 == 1:
if request.method == "PUT":
serializer = EditOrgSerializer(org, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(responses.update_org_200, status.HTTP_200_OK)
return Response(serializer.errors, status.HTTP_400_BAD_REQUEST)
else:
return Response(responses.admin_access_403, status.HTTP_403_FORBIDDEN)


@swagger_auto_schema(
operation_id="get_groups_list",
method='GET',
responses={
'200': set_example(responses.get_group),
'401': set_example(responses.user_unauthorized_401),
'404': set_example({"detail": "This organisation doesn't exist."}),
'400': set_example({"detail": "You are not a member of this organisation"}),
'403': set_example({"detail": "You are not authorised to view this."}),
}
)
@api_view(['get'])
@permission_classes([IsAuthenticated])
def GetGroup(request, org_id):
try:
org = Org.objects.get(pk=org_id)
print(org)
except Org.DoesNotExist:
return Response({"detail": "This organisation doesn't exist."}, status.HTTP_404_NOT_FOUND)

try:
member = Member.objects.get(
user=request.user,
org=org
)
except Member.DoesNotExist:
return Response({"detail": "You are not a member of this organisation"}, status.HTTP_400_BAD_REQUEST)

if member.group.perm_obj.permissions[Permissions.IS_STAFF]:
group = Group.objects.all()
response_object = []
for x in group:
memberLen = len(Member.objects.filter(group=x.id))
response_object.append(
{"id": x.id, "name": x.name, "memberCount": memberLen})

return Response(response_object, status.HTTP_200_OK)
else:
return Response({"detail": "You are not authorised to view this."}, status.HTTP_403_FORBIDDEN)


class GroupDetailsView(APIView):
'''
Expand Down
43 changes: 43 additions & 0 deletions tests/org/tests_org_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from org.models import *
from tests.AuthAPITestCase import AuthAPITestCase
from rest_framework.test import APITestCase, APIClient
from rest_framework import status
from users.models import User
from org.serializers import CreateOrgSerializer
from org.custom_model_field import PermissionField as Permissions
import uuid


class GetOrgAPITestCase(AuthAPITestCase):
def setUp(self):
# Inheriting the base class funtionality
super(GetOrgAPITestCase, self).setUp()

data_org = {
"name": 'test',
"tagline": 'test',
}
serializer = CreateOrgSerializer(data=data_org)
if serializer.is_valid():
self.org, self.admin_group = serializer.save()

def test_fail_without_auth(self):
get_org_api = "/api/org/1/"
un_auth_client = APIClient()
response = un_auth_client.get(get_org_api)
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)

def test_fail_with_unknown_org(self):
get_org_api = "/api/org/123123/"
auth_client = self.create_auth_client()
response = auth_client.get(get_org_api)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

def test_pass_with_auth_user(self):
get_org_api = "/api/org/1/"
auth_client = self.create_auth_client()
response = auth_client.get(get_org_api)
self.assertEqual(response.status_code, status.HTTP_200_OK)

def tearDown(self):
super(GetOrgAPITestCase, self).tearDown()