summaryrefslogtreecommitdiff
path: root/coip/apps/opensocial/people.py
diff options
context:
space:
mode:
Diffstat (limited to 'coip/apps/opensocial/people.py')
-rw-r--r--coip/apps/opensocial/people.py107
1 files changed, 97 insertions, 10 deletions
diff --git a/coip/apps/opensocial/people.py b/coip/apps/opensocial/people.py
index 128b2c7..4572829 100644
--- a/coip/apps/opensocial/people.py
+++ b/coip/apps/opensocial/people.py
@@ -9,30 +9,115 @@ from django.contrib.auth.models import User
from coip.apps.opensocial.serializer import OpenSocialSerializer
from django.conf.urls.defaults import url
from coip.apps.membership.models import Membership
-from tastypie.fields import ToManyField, ToOneField
+from tastypie.fields import ToOneField
from tastypie.utils.urls import trailing_slash
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from tastypie.http import HttpGone, HttpMultipleChoices
+from coip.apps.name.models import Name
+from tastypie.constants import ALL_WITH_RELATIONS
+from django.shortcuts import get_object_or_404
import logging
-from tastypie.serializers import Serializer
from pprint import pformat
+from tastypie.bundle import Bundle
-class MembershipResource(ModelResource):
+_rekey = {
+ 'objects': 'entry'
+}
+
+class OpenSocialResource(ModelResource):
+
+ def _restructure(self,request,data,depth):
+ if isinstance(data, (list,tuple)):
+ for v in data:
+ self._restructure(request,v,depth+1)
+ elif isinstance(data,dict):
+ for (key,value) in data.iteritems():
+ nkey = key
+ if _rekey.has_key(key):
+ nkey = _rekey[key]
+
+ data[nkey] = self._restructure(request,data.pop(key),depth+1)
+
+ if data.has_key('meta') and depth == 1:
+ meta = data.pop('meta')
+ if request.GET.has_key('count'):
+ data['totalResults'] = meta['total_count']
+ data['itemsPerPage'] = meta['limit']
+ data['startIndex'] = meta['offset']
+ elif isinstance(data,Bundle):
+ pass
+
+ return data
+
+ def alter_list_data_to_serialize(self,request,data):
+ return self._restructure(request,{'response':data},0)
+
+ def alter_detail_data_to_serialize(self,request,data):
+ return self._restructure(request,{'response': data},0)
+
+class GroupResource(OpenSocialResource):
+
+ class Meta:
+ queryset = Name.objects.all()
+ serializer = OpenSocialSerializer()
+ resource_name = 'groups'
+ fields = ['short','description','id']
+
+ def override_urls(self):
+ return [
+ url(r"^(?P<resource_name>%s)/(?P<username>[\@\w\d_.-:]+)/(?P<group_name_id>[\d]+)%s?" % (self._meta.resource_name,trailing_slash()),
+ self.wrap_view('list_memberships'), name="api_list_memberships"),
+ url(r"^(?P<resource_name>%s)/(?P<username>[\@\w\d_.-:]+)%s" % (self._meta.resource_name,trailing_slash()),
+ self.wrap_view('list_memberships'), name="api_list_memberships"),
+ url(r"^(?P<resource_name>%s)%s" % (self._meta.resource_name,trailing_slash()),
+ self.wrap_view('list_memberships'), name="api_list_memberships"),
+ ]
+
+ def list_memberships(self, request, **kwargs):
+ logging.debug(pformat(kwargs))
+ try:
+ user = self.cached_obj_get(request=request, username=kwargs['username'])
+ logging.debug(pformat(user))
+ except ObjectDoesNotExist:
+ return HttpGone()
+ except MultipleObjectsReturned:
+ return HttpMultipleChoices("More than one resource is found at this URI.")
+
+ group_resource = GroupResource()
+ if kwargs.has_key('name_id'):
+ name_id = kwargs.pop('name_id')
+ return group_resource.get_list(request=request, pk=name_id)
+ else:
+
+ return
+
+
+ def dispatch(self, request_type, request, **kwargs):
+ if kwargs.has_key('username') and kwargs['username'] == '@me':
+ kwargs['username'] = request.user.username
+ return super(GroupResource, self).dispatch(request_type, request, **kwargs)
+
+class MembershipResource(OpenSocialResource):
user = ToOneField("coip.apps.opensocial.people.PersonResource",'user',full=True)
+ name = ToOneField("coip.apps.opensocial.people.GroupResource",'name',full=False)
class Meta:
queryset = Membership.objects.all()
serializer = OpenSocialSerializer()
resource_name = 'membership'
- fields = ['user']
+ fields = ['user','name']
+ filtering = {
+ 'name': ALL_WITH_RELATIONS
+ }
def dehydrate(self,bundle):
bundle = super(MembershipResource,self).dehydrate(bundle)
del bundle.data['resource_uri']
+ logging.debug(pformat(bundle))
return bundle
-class PersonResource(ModelResource):
+class PersonResource(OpenSocialResource):
#memberships = ToManyField(MembershipResource,'memberships',full=True)
@@ -44,7 +129,7 @@ class PersonResource(ModelResource):
def override_urls(self):
return [
- url(r"^(?P<resource_name>%s)/(?P<username>[\@\w\d_.-:]+)/(?P<pk>[\d]+)%s?" % (self._meta.resource_name,trailing_slash()),
+ url(r"^(?P<resource_name>%s)/(?P<username>[\@\w\d_.-:]+)/(?P<name_id>[\d]+)%s?" % (self._meta.resource_name,trailing_slash()),
self.wrap_view('list_memberships'), name="api_list_memberships"),
url(r"^(?P<resource_name>%s)/(?P<username>[\@\w\d_.-:]+)(?:/\@self)?%s" % (self._meta.resource_name,trailing_slash()),
self.wrap_view('dispatch_detail'), name="api_dispatch_detail"),
@@ -53,15 +138,17 @@ class PersonResource(ModelResource):
def list_memberships(self, request, **kwargs):
logging.debug(pformat(kwargs))
try:
- obj = self.cached_obj_get(request=request, username=kwargs['username'])
- logging.debug(pformat(obj))
+ user = self.cached_obj_get(request=request, username=kwargs['username'])
+ logging.debug(pformat(user))
except ObjectDoesNotExist:
return HttpGone()
except MultipleObjectsReturned:
return HttpMultipleChoices("More than one resource is found at this URI.")
- membership_resource = MembershipResource()
- return membership_resource.get_list(request, group__owner_id=obj.pk)
+ people_resource = PersonResource()
+ name_id = kwargs.pop('name_id')
+ name = get_object_or_404(Name,id=name_id)
+ return people_resource.get_list(request=request, memberships__name=name)
def dispatch(self, request_type, request, **kwargs):
if kwargs.has_key('username') and kwargs['username'] == '@me':