summaryrefslogtreecommitdiff
path: root/coip/apps/opensocial/people.py
blob: 6572e0675279e23c5277dab583ec4bb4f3c940ad (plain)
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
'''
Created on Jun 19, 2011

@author: leifj
'''
from tastypie.resources import ModelResource
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 tastypie.bundle import Bundle
from coip.apps.user.models import Identifier

_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','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 = Identifier.objects.filter(type=Identifier.FEDERATION)
        fields = ['value']
        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:
            id = self.cached_obj_get(request=request, value=kwargs['username'])
            logging.debug(pformat(id))
        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['value']
        bundle.data['displayName'] = bundle.data['display_name']
        del bundle.data['resource_uri']
        del bundle.data['value']
        return bundle