diff --git a/docs/group.rst b/docs/group.rst index 1a149f0..319ab20 100644 --- a/docs/group.rst +++ b/docs/group.rst @@ -1,6 +1,8 @@ Group ===== +GET /group/ +----------- .. http:get:: /group/ Return information about all groups. @@ -13,6 +15,8 @@ Group :statuscode 200: OK! +GET /group/(int)/ +----------------- .. http:get:: /group/(int:group_id)/ Return information about a specific group. @@ -24,6 +28,8 @@ Group :statuscode 200: OK! :statuscode 404: Group (`group_id`) was not found. +POST /group/ +------------ .. http:post:: /group/ Create new group. @@ -41,6 +47,8 @@ Group :statuscode 403: You don't have necessary permissions. :statuscode 500: Group with this `posix_name` alredy exists or malformed body. +PATCH /group/(int)/ +------------------- .. http:patch:: /group/(int:group_id)/ Change name of a group. @@ -57,3 +65,11 @@ Group :statuscode 202: Changed! :statuscode 403: You don't have enough permissions to change this group. :statuscode 500: Group (`group_id`) does not exist or malformed body. + +DELETE /group/(int)/ +-------------------- +.. http:delete:: /group/(int:group_id)/ + + Delete a group. + + :statuscode 204: Deleted! diff --git a/docs/member.rst b/docs/member.rst index cca824b..94e0f9f 100644 --- a/docs/member.rst +++ b/docs/member.rst @@ -1,6 +1,8 @@ Member ====== +GET /member/ +------------ .. http:get:: /member/ Returns info about all members. @@ -16,6 +18,51 @@ Member :query limit: limit number. default is 20 :statuscode 200: Everything is gonna be alright. +GET /member/(int)/ +------------------ +.. http:get:: /member/(int:member_id)/ + + Returns info about member (`member_id`). + + **Example request**: + + .. sourcecode:: http + + GET /member/1337/?format=json HTTP/1.1 + Content-Type: application/json + + :statuscode 200: OK! + :statuscode 403: No permissions, mate. + :statuscode 404: There's no user with given id. + +GET /member/(int)/group/ +------------------------ +.. http:get:: /member/(int:member_id)/group/ + + Gets all groups member (`member_id`) is a member of. + + .. sourcecode:: http + + GET /member/1337/group/?format=json HTTP/1.1 + + :statuscode 200: OK! + :statuscode 403: You don't have enough permissions. + +GET /member/(int)/group/(int)/ +------------------------------ +.. http:get:: /member/(int:member_id)/group/(int:group_id)/ + + Checks if member (`member_id`) is a member of group (`group_id`). + + .. sourcecode:: http + + GET /member/1337/group/42/?format=json HTTP/1.1 + + :statuscode 200: OK! + :statuscode 403: No go, brother :( + +POST /member/ +------------- .. http:post:: /member/ Creates a new member with data given in body (json) @@ -35,20 +82,17 @@ Member :statuscode 201: User created. :statuscode 500: Invalid body or username already exists. -.. http:get:: /member/(int:member_id)/ +POST /member/(int)/group/(int)/ +------------------------------- +.. http:post:: /member/(int:member_id)/group/(int:group_id)/ - Returns info about member (`member_id`). + Adds member (`member_id`) to group (`group_id`). - **Example request**: - - .. sourcecode:: http - - GET /member/1337/?format=json HTTP/1.1 - Content-Type: application/json - - :statuscode 200: OK! - :statuscode 404: There's no user with given id. + :statuscode 201: User added! + :statuscode 403: Yeah...no. +PATCH /member/(int)/ +-------------------- .. http:patch:: /member/(int:member_id)/ Updates fields of a member (`member_id`). Can't update username. @@ -65,9 +109,11 @@ Member } :statuscode 202: User changed. - :statuscode 403: Returned if request contains `"username"` field. + :statuscode 403: Returned if request contains `"username"` field or you're missing necessary permissions. :statuscode 500: Invalid body. +DELETE /member/(int)/ +--------------------- .. http:delete:: /member/(int:member_id)/ Deactivates a member. @@ -76,4 +122,15 @@ Member DELETE /member/1337/?format=json HTTP/1.1 - :statusc:de 403: + :statuscode 204: User deactivated. + :statuscode 403: You don't have enough permissions to deactivate users. + +DELETE /member/(int)/group/(int)/ +--------------------------------- + +.. http:delete:: /member/(int:member_id)/group/(group_id)/ + + Removes a member from a group. + + :statuscode 204: User removed from group. + :statuscode 403: I can't let you do that, Dave. diff --git a/dusken/api/groupsbymember.py b/dusken/api/groupsbymember.py index 701d2de..d93bd99 100644 --- a/dusken/api/groupsbymember.py +++ b/dusken/api/groupsbymember.py @@ -1,9 +1,14 @@ +from django.shortcuts import get_object_or_404 from tastypie import fields from tastypie.authorization import Authorization from tastypie.bundle import Bundle +from tastypie.exceptions import ImmediateHttpResponse +from tastypie.http import HttpNotFound, HttpAccepted, HttpCreated, HttpResponse, HttpBadRequest from tastypie.resources import Resource from dusken.models import Member, Group +import logging + class GroupsByMemberObject(object): def __init__(self): self.member_id = 0 @@ -14,24 +19,19 @@ class GroupsByMemberResource(Resource): groups = fields.ListField(attribute='groups') class Meta: - resource_name = 'groupsbymember' object_class = GroupsByMemberObject - list_allowed_methods = [ 'post' ] - detail_allowed_methods = [ 'get', 'delete' ] - authorization = Authorization() # TODO: look up - filtering = { - 'member_id' : [ 'exact' ] - } + list_allowed_methods = [] + detail_allowed_methods = [ 'get', 'delete', 'post' ] + authorization = Authorization() # TODO: Obvious def detail_uri_kwargs(self, bundle_or_obj): kwargs = { 'resource_name': self._meta.resource_name, } - if isinstance(bundle_or_obj, Bundle): - kwargs['pk'] = bundle_or_obj.obj.member_id + kwargs['pk'] = bundle_or_obj.obj.group_id else: - kwargs['pk'] = bundle_or_obj.member_id + kwargs['pk'] = bundle_or_obj.group_id if self._meta.api_name is not None: kwargs['api_name'] = self._meta.api_name @@ -39,41 +39,82 @@ class GroupsByMemberResource(Resource): return kwargs def get_object_list(self, request): + logging.info("Someone tried to get_object_list, but I can't do that, man, I can't do that!") pass # We can't return lists. def obj_get_list(self, request=None, **kwargs): - pass # We can't return lists. + member_id = int(kwargs['pk']) + member = get_object_or_404(Member, pk=member_id) + + obj = GroupsByMemberObject() + obj.member_id = member_id + + #print "\n\n\n" +str(member.groups.all()) +"\n\n\n" + for group in member.groups.all(): + obj.groups.append(group) + + return obj def obj_get(self, request=None, **kwargs): member_id = int(kwargs['pk']) member = Member.objects.get(id=member_id) - if member is None: + member = None + if len(keys) > 1: + member_id = int(keys[1]) + member = Member.objects.get(id=member_id) + + if member is None: + return None + + if member.groups.filter(name=group.name).count() == 0: + raise ImmediateHttpResponse(HttpNotFound()) + + if group is None: return None - obj = GroupsByMemberObject() - obj.member_id = member.id - for group in member.groups.all(): - obj.groups.append(group.id) + obj = MembersByGroupObject() + obj.group_id = group.id + + if member is None: + for member in group.user_set.all(): + obj.members.append(member.id) + else: + obj.members.append(member.id) return obj - def obj_create(self, request=None, **kwargs): - group = Group.objects.get(id=group_id) - member = Member.objects.get(id=user_id) - group.user_set.add(member) + def post_detail(self, request=None, **kwargs): + """ + Creates a new relationship be. + """ + + keys = kwargs['pk'].split('/') + if len(keys) < 2: + raise ImmediateHttpResponse(HttpBadRequest()) + + member_id = keys[0] + group_id = keys[1] + + + logging.error("Calling create function with parameters {0}".format(str(kwargs))) + return HttpCreated() def obj_update(self, bundle, request=None, **kwargs): - pass # We can't update. + logging.info("Someone tried to obj_update, but I can't do that, man, I can't do that!") + return # We can't update. def obj_delete_list(self, request=None, **kwargs): - pass # We can't delete lists. + logging.info("Someone tried to obj_delete_list, but I can't do that, man, I can't do that!") + return # We can't delete lists. def obj_delete(self, request=None, **kwargs): + print str(kwargs +"\n\n\n\n") group = Group.objects.get(id=group_id) member = Member.objects.get(id=user_id) group.user_set.remove(member) def rollback(self, bundles): - pass + logging.info("Someone tried to rollback, but I can't do that, man, I can't do that!") + return diff --git a/dusken/api/member.py b/dusken/api/member.py index 16d3bd5..c535441 100644 --- a/dusken/api/member.py +++ b/dusken/api/member.py @@ -1,10 +1,14 @@ from django.contrib.auth.models import User +from django.conf.urls import url +from django.shortcuts import get_object_or_404 from tastypie import fields from tastypie.authorization import Authorization from tastypie.exceptions import ImmediateHttpResponse -from tastypie.http import HttpForbidden, HttpNoContent +from tastypie.http import HttpForbidden, HttpNoContent, HttpResponse from tastypie.resources import ModelResource, ALL from dusken.models import * +from dusken.api.membersbygroup import MembersByGroupResource +from dusken.api.groupsbymember import GroupsByMemberResource class MemberResource(ModelResource): @@ -28,6 +32,19 @@ class MemberResource(ModelResource): 'phone_number' : [ 'exact' ], } + def prepend_urls(self): + return [ + url(r"^(?P%s)/(?P\d+)/groups/$" % (self._meta.resource_name), self.wrap_view("get_groups"), name="api_get_groups"), + ] + + def get_groups(self, request, **kwargs): + pk = kwargs['pk'] + member = get_object_or_404(Member, pk=pk) + + #response = HttpResponse(self._meta.serializer.serialize(member, self.determine_format(request))) + resource = GroupsByMemberResource() + return resource.get_list(request, pk=pk) + def apply_filters(self, request, applicable_filters): # Extra filters are used for filtering by attributes in User class. Find out if there # are any, and if so, apply them.