summaryrefslogtreecommitdiff
path: root/coip/apps/opensocial/people.py
blob: a52fb9d1086d166fe9a41ff1342c053f8c373f94 (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
'''
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
from tastypie.authorization import DjangoAuthorization

class GroupResource(OpenSocialResource):
    
    class Meta:
        queryset = Name.objects.all()
        serializer = OpenSocialSerializer()
        resource_name = 'groups'
        fields = ['short','description','id']
        #authentication = OAuthAuthentication()
        #authorization = DjangoAuthorization()
        
        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()
        #authentication = OAuthAuthentication()
        #authorization = DjangoAuthorization()
        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()
        #authentication = OAuthAuthentication()
        #authorization = DjangoAuthorization()
        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