diff options
Diffstat (limited to 'coip/apps/opensocial/common.py')
-rw-r--r-- | coip/apps/opensocial/common.py | 53 |
1 files changed, 53 insertions, 0 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 |