summaryrefslogtreecommitdiff
path: root/coip/apps/opensocial/people.py
blob: 128b2c707071252aca61e12deaaea67feec7aecf (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
'''
Created on Jun 19, 2011

@author: leifj
'''
from tastypie.resources import ModelResource
from coip.apps.userprofile.models import UserProfile, last_used_profile
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.utils.urls import trailing_slash
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from tastypie.http import HttpGone, HttpMultipleChoices
import logging
from tastypie.serializers import Serializer
from pprint import pformat

class MembershipResource(ModelResource):
    
    user = ToOneField("coip.apps.opensocial.people.PersonResource",'user',full=True)
    
    class Meta:
        queryset = Membership.objects.all()
        serializer = OpenSocialSerializer()
        resource_name = 'membership'
        fields = ['user']

    def dehydrate(self,bundle):
        bundle = super(MembershipResource,self).dehydrate(bundle)
        del bundle.data['resource_uri']
        return bundle

class PersonResource(ModelResource):
    
    #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<pk>[\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:
            obj = self.cached_obj_get(request=request, username=kwargs['username'])
            logging.debug(pformat(obj))
        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)
    
    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'] = last_used_profile(bundle.obj).display_name
        del bundle.data['resource_uri']
        del bundle.data['username']
        return bundle