diff options
author | Leif Johansson <leifj@sunet.se> | 2011-09-21 11:14:03 +0200 |
---|---|---|
committer | Leif Johansson <leifj@sunet.se> | 2011-09-21 11:14:03 +0200 |
commit | 1d2a3f2403911e0b1ff99ffce808997a24661d15 (patch) | |
tree | 2640220191ce830cebdf3ac49b9ba1711a9bc795 | |
parent | e7e435a633cb88af042090c3890763860b3ea9a6 (diff) |
discovery - xrds and system service
-rw-r--r-- | coip/apps/opensocial/common.py | 53 | ||||
-rw-r--r-- | coip/apps/opensocial/people.py | 38 | ||||
-rw-r--r-- | coip/urls.py | 5 | ||||
-rw-r--r-- | templates/xrds.xml | 13 |
4 files changed, 71 insertions, 38 deletions
diff --git a/coip/apps/opensocial/common.py b/coip/apps/opensocial/common.py new file mode 100644 index 0000000..131cfeb --- /dev/null +++ b/coip/apps/opensocial/common.py @@ -0,0 +1,53 @@ +''' +Created on Sep 21, 2011 + +@author: leifj +''' +from tastypie.resources import ModelResource +from tastypie.bundle import Bundle +from coip.multiresponse import json_response +from django.core.serializers import json +from django.http import HttpResponseBadRequest + +_rekey = { + 'objects': 'entry' +} + +def system(request): + if request.method == 'POST' and request.META['CONTENT_TYPE'] == 'application/json': + rpc_request = json.simplejson.load(request) + if rpc_request['method'] == 'system.listMethods': + return json_response(['people.get','groups.get','system.listMethods']) + else: + return HttpResponseBadRequest() + +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)
\ No newline at end of file diff --git a/coip/apps/opensocial/people.py b/coip/apps/opensocial/people.py index 9f0a925..bf814e2 100644 --- a/coip/apps/opensocial/people.py +++ b/coip/apps/opensocial/people.py @@ -3,7 +3,6 @@ Created on Jun 19, 2011 @author: leifj ''' -from tastypie.resources import ModelResource from django.contrib.auth.models import User from coip.apps.opensocial.serializer import OpenSocialSerializer from django.conf.urls.defaults import url @@ -17,42 +16,7 @@ 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 - -_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) +from coip.apps.opensocial.common import OpenSocialResource class GroupResource(OpenSocialResource): diff --git a/coip/urls.py b/coip/urls.py index 29ad522..93deee7 100644 --- a/coip/urls.py +++ b/coip/urls.py @@ -7,11 +7,13 @@ from django.http import HttpResponseRedirect from coip.apps.auth.views import logout from coip.apps.opensocial import opensocial_v1 from coip.apps.api import v1_api +from coip.multiresponse import respond_to admin.autodiscover() def welcome(request): - return HttpResponseRedirect('/user/home') + return respond_to(request, {'text/html':HttpResponseRedirect('/user/home'), + 'application/xrds+xml': 'xrds.xml'}) urlpatterns = patterns('', (r'^admin-media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': ADMIN_MEDIA_ROOT}), @@ -70,5 +72,6 @@ urlpatterns = patterns('', (r'^rtree/(?P<id>[0-9]+).json$', 'coip.apps.name.views.rtree'), # APIs (r'^api/', include(v1_api.urls)), + (r'^opensocial/1.0/rpc', 'coip.apps.opensocial.common.system'), (r'^opensocial/', include(opensocial_v1.urls)) ) diff --git a/templates/xrds.xml b/templates/xrds.xml new file mode 100644 index 0000000..95c77a5 --- /dev/null +++ b/templates/xrds.xml @@ -0,0 +1,13 @@ +<XRDS xmlns="xri://$xrds"> + <XRD xmlns:simple="http://xrds-simple.net/core/1.0" xmlns="xri://$XRD*($v*2.0)" version="2.0"> + <Type>xri://$xrds*simple</Type> + <Service> + <Type>http://ns.opensocial.org/2008/opensocial/people</Type> + <URI>{{prefix_url}}/opensocial/1.0/people</URI> + </Service> + <Service> + <Type>http://ns.opensocial.org/2008/opensocial/groups</Type> + <URI>{{prefix_url}}/opensocial/1.0/groups</URI> + </Service> + </XRD> +</XRDS>
\ No newline at end of file |