summaryrefslogtreecommitdiff
path: root/coip/apps/scim/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'coip/apps/scim/views.py')
-rw-r--r--coip/apps/scim/views.py144
1 files changed, 144 insertions, 0 deletions
diff --git a/coip/apps/scim/views.py b/coip/apps/scim/views.py
new file mode 100644
index 0000000..b299262
--- /dev/null
+++ b/coip/apps/scim/views.py
@@ -0,0 +1,144 @@
+'''
+Created on Apr 10, 2012
+
+@author: leifj
+'''
+from django.http import HttpResponseNotFound, HttpResponseBadRequest,\
+ HttpResponse
+from coip.apps.resource.models import object_for_uuid
+
+from django.utils import simplejson
+from coip.apps.name.models import Name, lookup
+from uuid import UUID
+from coip.apps.scim import types
+import logging
+
+def get_handler_for_prefix(prefix):
+ if not prefix in types._registry.keys():
+ return None
+ return types._registry[prefix]
+
+def scim_response(d,status=200):
+ content = None
+ if d != None:
+ content = simplejson.dumps(d)
+ r = HttpResponse(content=content,status=status,content_type='application/json')
+ if not d.has_key('meta'):
+ d['meta'] = {}
+ location = d['meta'].get('location',None)
+ if location is not None:
+ r['Location'] = location
+
+ return r
+
+def _resolve_name(nid):
+ if nid == None:
+ return None
+
+ if '/' in nid:
+ return lookup(nid)
+
+ try:
+ pk = int(nid)
+ return Name.objects.get(id=pk)
+ except ValueError:
+ pass
+
+ try:
+ return object_for_uuid(str(UUID(nid)))
+ except ValueError:
+ pass
+
+ return None
+
+def scim_v1_get(request,name,handler,uuid):
+ o = object_for_uuid(uuid)
+ if o == None:
+ return HttpResponseNotFound
+ if not isinstance(o, handler.model):
+ return HttpResponseBadRequest("%s does not resolve to an object of type %s" % (uuid,handler.model.__name__))
+ d = handler.serialize(o)
+ #logging.debug(d)
+ d['meta']['location'] = request.build_absolute_uri()
+ return scim_response(d)
+
+def scim_v1_post(request,name,handler):
+ # authorize request based on name
+ d = simplejson.loads(request.raw_post_data)
+
+ o = handler.create(d)
+
+ d = handler.serialize(o)
+ d['meta']['location'] = request.build_absolute_uri()
+ return scim_response(d,201)
+
+def scim_v1_delete(request,name,handler,uuid):
+ o = object_for_uuid(uuid)
+ if o == None:
+ return HttpResponseNotFound
+ if not isinstance(o, handler.model):
+ return HttpResponseBadRequest("%s does not resolve to an object of type %s" % (uuid,handler.model.__name__))
+ o.delete()
+
+ return scim_response(200)
+
+def scim_v1_put(request,name,handler,uuid):
+ o = object_for_uuid(uuid)
+ if o == None:
+ return HttpResponseNotFound
+ if not isinstance(o,handler.model):
+ return HttpResponseBadRequest("%s does not resolve to an object of type %s" % (uuid,handler.model.__name__))
+
+ d = simplejson.loads(request.raw_post_data)
+ handler.update(o,d,replace=True)
+ o.save()
+
+ d = handler.serialize(o)
+ d['meta']['location'] = request.build_absolute_uri()
+ return scim_response(d,200)
+
+def scim_v1_patch(request,name,handler,uuid):
+ o = object_for_uuid(uuid)
+ if o == None:
+ return HttpResponseNotFound()
+ if not isinstance(o, handler.model):
+ return HttpResponseBadRequest("%s does not resolve to an object of type %s" % (uuid,handler.model.__name__))
+
+ d = simplejson.loads(request.raw_post_data)
+ handler.update(o,d,replace=False)
+ o.save()
+
+ return scim_response(204)
+
+def scim_v1(request,nid=None,prefix='Groups',uuid=None):
+ name = _resolve_name(nid)
+ handler = get_handler_for_prefix(prefix)
+ if handler == None:
+ return HttpResponseNotFound("Unknown SCIM resource type %s" % prefix)
+
+ if request.method == 'GET':
+ return scim_v1_get(request,name,handler,uuid)
+
+ if request.method == 'POST':
+ #if name == None:
+ # return HttpResponseNotFound("No such name")
+ if uuid != None:
+ return HttpResponseBadRequest("POSTing to resource is not allowed. Use PUT to update a resource.")
+ return scim_v1_post(request,name,handler)
+
+ if request.method == 'DELETE':
+ if uuid == None:
+ return HttpResponseBadRequest("Missing resource")
+ return scim_v1_delete(request,name,handler,uuid)
+
+ if request.method == 'PATCH':
+ if uuid == None:
+ return HttpResponseBadRequest("Missing resource")
+ return scim_v1_patch(request,name,handler,uuid)
+
+ if request.method == 'PUT':
+ if uuid == None:
+ return HttpResponseBadRequest("Missing resource")
+ return scim_v1_put(request,name,handler,uuid)
+
+ return HttpResponseBadRequest() \ No newline at end of file