diff options
Diffstat (limited to 'coip/apps/opensocial/views.py')
-rw-r--r-- | coip/apps/opensocial/views.py | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/coip/apps/opensocial/views.py b/coip/apps/opensocial/views.py new file mode 100644 index 0000000..ff04505 --- /dev/null +++ b/coip/apps/opensocial/views.py @@ -0,0 +1,77 @@ +''' +Created on Nov 8, 2011 + +@author: leifj +''' +import re +from django.contrib.auth.models import User +from coip.multiresponse import json_response +from coip.apps.activitystreams.views import object_to_json +from django_oauth2_lite.decorators import oauth2_required +from django.http import HttpResponseNotFound, HttpResponseBadRequest +from coip.apps.name.models import Name +import json +from django.utils import simplejson + +def _resolve_user(request,uid): + if uid == '@me': + return request.user + + if re.match('^[0-9]+$',uid): + try: + return User.objects.get(id=uid) + except User.DoesNotExist: + return None + + try: + return User.objects.get(username=uid) + except User.DoesNotExist: + return None + +def _resolve_group(request,user,gid): + if gid == '@self': + return user.get_profile().home + + if re.match('^[0-9]+$',gid): + try: + return Name.objects.get(id=gid) + except User.DoesNotExist: + return None + try: + return Name.objects.get(username=gid) + except User.DoesNotExist: + return None + + +def _opensocial_response(lst): + return { + "startIndex": 0, + "totalResults": len(lst), + "entry": [ + object_to_json(o) for o in lst + ] + } + +def rpc(request): + if request.method == 'POST' and request.META['CONTENT_TYPE'] == 'application/json': + rpc_request = simplejson.load(request) + if rpc_request['method'] == 'system.listMethods': + return json_response(['people.get','groups.get','system.listMethods']) + else: + return HttpResponseBadRequest() + +@oauth2_required(scope='opensocial') +def person(request,uid,gid='@self'): + user = _resolve_user(request,uid) + + if not user: + return HttpResponseNotFound() + + name = _resolve_group(request,user,gid) + + if not name: + return HttpResponseNotFound() + + ##TODO - implement listing people based on group memberships + return json_response(_opensocial_response([user])) + |