1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
'''
Created on Jun 19, 2011
@author: leifj
'''
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 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 pprint import pformat
from coip.apps.opensocial.common import OpenSocialResource
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<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','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(OpenSocialResource):
#memberships = ToManyField(MembershipResource,'memberships',full=True)
class Meta:
queryset = User.objects.all()
fields = ['username']
resource_name = 'people'
serializer = OpenSocialSerializer()
def override_urls(self):
return [
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"),
]
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.")
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':
kwargs['username'] = request.user.username
return super(PersonResource, self).dispatch(request_type, request, **kwargs)
def dehydrate(self,bundle):
bundle = super(PersonResource,self).dehydrate(bundle)
bundle.data['id'] = bundle.data['username']
bundle.data['displayName'] = bundle.obj.get_profile().display_name
del bundle.data['resource_uri']
del bundle.data['username']
return bundle
|