filters and columns can be passed to the rest api
[unfold.git] / rest / __init__.py
index 58fec2c..3b6c48d 100644 (file)
@@ -10,12 +10,17 @@ from manifold.core.query            import Query, AnalyzedQuery
 from manifoldapi.manifoldapi        import execute_query
 
 from string import join
+import decimal
+import datetime
 import json
-
+import urlparse
 
 # handles serialization of datetime in json
 DateEncoder = lambda obj: obj.strftime("%B %d, %Y %H:%M:%S") if isinstance(obj, datetime.datetime) else None
 
+# support converting decimal in json
+json.encoder.FLOAT_REPR = lambda o: format(o, '.2f')
+
 # handles decimal numbers serialization in json
 class DecimalEncoder(json.JSONEncoder):
     def _iterencode(self, o, markers=None):
@@ -24,54 +29,78 @@ class DecimalEncoder(json.JSONEncoder):
         return super(DecimalEncoder, self)._iterencode(o, markers)
 
 def dispatch(request, object_type, object_name):
-
+    
+    object_properties = []
+    object_filters = {}
+    
     switch = {
          'platform' : platform,
          'slice' : slice,
          'resource' : resource,
          'user' : user
     }
-
+    
+    if request.method == 'POST':
+        for el in request.POST.items():
+            if el[0].startswith('filters'):
+                object_filters[el[0][8:-1]] = el[1]
+            elif el[0].startswith('columns'):
+                object_properties = request.POST.getlist('columns[]')
+    
     # platform is local
     if ((object_type == 'platform') or (object_type == 'testbed')) :
         object_type = 'local:platform'
-        object_properties = ['platform', 'platform_longname', 'platform_url', 'platform_description','gateway_type'];
-        return switch.get('platform', error)(request, object_name, object_properties)
+        if object_properties == None :
+            object_properties = ['platform', 'platform_longname', 'platform_url', 'platform_description','gateway_type'];
+        return switch.get('platform', error)(request, object_name, object_properties, object_filters)
     else :
-        query = Query.get('local:object').filter_by('table', '==', object_type).select('column.name')
-        results = execute_query(request, query)
-        if results :
-            object_properties = []
-            for r in results[0]['column'] :
-                object_properties.append(r['name'])
-        else :
-            return error(request, object_name, {})
-        return switch.get(object_type, error)(request, object_name, object_properties)
-
-#     if request.method == 'GET':
-#         return switch.get(request, object_type, object_name, object_properties)
-#     elif request.method == 'POST':
-#         return post(request, object_type, object_name)
-
-def platform(request, object_name, object_properties):
-    query  = Query().get('local:platform').filter_by('disabled', '==', '0').select(object_properties)
+        if object_properties == None :
+            query = Query.get('local:object').filter_by('table', '==', object_type).select('column.name')
+            results = execute_query(request, query)
+            if results :
+                object_properties = []
+                for r in results[0]['column'] :
+                    object_properties.append(r['name'])
+            else :
+                return error(request, object_name, {})
+        return switch.get(object_type, error)(request, object_name, object_properties, object_filters)
+
+def platform(request, object_name, object_properties, object_filters = None):
+    query  = Query().get('local:platform').filter_by('disabled', '==', '0').filter_by('gateway_type', '==', 'sfa').filter_by('platform', '!=', 'myslice')
+    if object_filters :
+        for k, f in object_filters.iteritems() :
+            query.filter_by(k, '==', f)
+    query.select(object_properties)
     return send(request, execute_query(request, query), object_properties)
 
-def slice(request, object_name, object_properties):
-    query = Query().get('slice').filter_by('user.user_hrn', '==', '$user_hrn').select(object_properties)
+def slice(request, object_name, object_properties, object_filters = None):
+    query = Query().get('slice').filter_by('user.user_hrn', '==', '$user_hrn')
+    if object_filters :
+        for k, f in object_filters.iteritems() :
+            query.filter_by(k, '==', f)
+    query.select(object_properties)
     return send(request, execute_query(request, query), object_properties)
 
-def resource(request, object_name, object_properties):
-    pass
+def resource(request, object_name, object_properties, object_filters = None):
+    query = Query().get('resource')
+    if object_filters :
+        for k, f in object_filters.iteritems() :
+            query.filter_by(k, '==', f)
+    query.select(object_properties)
+    return send(request, execute_query(request, query), object_properties)
 
-def user(request, object_name, object_properties):
-    query = Query().get('user').filter_by('user_hrn', '==', '$user_hrn').select(object_properties)
+def user(request, object_name, object_properties, object_filters = None):
+    query = Query().get('user').filter_by('user_hrn', '==', '$user_hrn')
+    if object_filters :
+        for k, f in object_filters.iteritems() :
+            query.filter_by(k, '==', f)
+    query.select(object_properties)
     return send(request, execute_query(request, query), object_properties)
 
 def send(request, response, object_properties):
     if request.path.split('/')[1] == 'rest' :
         response_data = response
-        return HttpResponse(json.dumps(response_data), content_type="application/json")
+        return HttpResponse(json.dumps(response_data, cls=DecimalEncoder, default=DateEncoder), content_type="application/json")
     elif request.path.split('/')[1] == 'table' :
         return render_to_response('table-default.html', {'data' : response, 'properties' : object_properties})
     elif request.path.split('/')[1] == 'datatable' :
@@ -92,4 +121,23 @@ def send(request, response, object_properties):
         return HttpResponse(json.dumps(response_data, cls=DecimalEncoder, default=DateEncoder), content_type="application/json")
 
 def error(request, object_name, object_properties):
-    return HttpResponse(json.dumps({'error' : 'an error has occurred'}), content_type="application/json")
\ No newline at end of file
+    return HttpResponse(json.dumps({'error' : 'an error has occurred'}), content_type="application/json")
+
+def getDictArray(post, name):
+    dic = {}
+    for k in post.keys():
+        if k.startswith(name):
+            rest = k[len(name):]
+
+            # split the string into different components
+            parts = [p[:-1] for p in rest.split('[')][1:]
+            print parts
+            id = int(parts[0])
+
+            # add a new dictionary if it doesn't exist yet
+            if id not in dic:
+                dic[id] = {}
+
+            # add the information to the dictionary
+            dic[id][parts[1]] = post.get(k)
+    return dic
\ No newline at end of file