each table element is identified by a key
[myslice.git] / rest / __init__.py
1 from manifold.core.query            import Query
2 from manifoldapi.manifoldapi        import execute_query
3
4 from django.http                    import HttpResponse
5
6
7 import decimal
8 import datetime
9 import json
10
11 # handles serialization of datetime in json
12 DateEncoder = lambda obj: obj.strftime("%B %d, %Y %H:%M:%S") if isinstance(obj, datetime.datetime) else None
13
14 # support converting decimal in json
15 json.encoder.FLOAT_REPR = lambda o: format(o, '.2f')
16
17 # handles decimal numbers serialization in json
18 class DecimalEncoder(json.JSONEncoder):
19     def _iterencode(self, o, markers=None):
20         if isinstance(o, decimal.Decimal):
21             return (str(o) for o in [o])
22         return super(DecimalEncoder, self)._iterencode(o, markers)
23     
24 class ObjectRequest(object):
25     
26     def __init__(self, request, object_type, object_name):
27         self.type = object_type
28         self.name = object_name
29         self.fields = []
30         self.filters = {}
31         self.options = None
32
33         self.request = request
34         
35         if ((self.type == 'platform') or (self.type == 'testbed')) :
36             self.type = 'local:platform'
37             self.id = 'platform'
38             self.fields = ['platform', 'platform_longname', 'platform_url', 'platform_description','gateway_type'];
39             self.filters['disabled'] = '0'
40             self.filters['gateway_type'] = 'sfa'
41             self.filters['platform'] = '!myslice'
42         else :
43             self.setKey()
44             self.setLocalFields()
45         
46     
47     def setKey(self):
48         # What about key formed of multiple fields???
49         query = Query.get('local:object').filter_by('table', '==', self.type).select('key')
50         results = execute_query(self.request, query)
51         print "key of object = %s" % results
52         if results :
53             for r in results[0]['key'] :
54                 self.id = r
55         else :
56             raise Exception, 'Manifold db error'
57     
58     def setLocalFields(self):
59         query = Query.get('local:object').filter_by('table', '==', self.type).select('column.name')
60         results = execute_query(self.request, query)
61         if results :
62             for r in results[0]['column'] :
63                 self.fields.append(r['name'])
64         else :
65             raise Exception, 'Manifold db error'
66     
67     def setFields(self, fields):
68         selected_fields = []
69         for p in fields :
70             if p in self.fields :
71                 selected_fields.append(p)
72         self.fields = selected_fields
73         
74         # 
75         if self.id in self.fields :
76             self.fields.remove(self.id)
77             [self.id].extend(self.fields)
78     
79     def applyFilters(self, query, force_filters = False):
80         if (force_filters and not self.filters) :
81             raise Exception, "Filters required"
82         if self.filters :
83             for k, f in self.filters.iteritems() :
84                 if (f[:1] == "!") :
85                     query.filter_by(k, '!=', f[1:])
86                 elif (f[:2] == ">=") :
87                     query.filter_by(k, '>=', f[2:])
88                 elif (f[:1] == ">") :
89                     query.filter_by(k, '>', f[1:])
90                 elif (f[:2] == "<=") :
91                     query.filter_by(k, '<=', f[2:])
92                 elif (f[:1] == "<") :
93                     query.filter_by(k, '<', f[1:])
94                 else :
95                     query.filter_by(k, '==', f)
96         return query
97     
98     def get(self):
99         query = Query.get(self.type).select(self.fields)
100         query = self.applyFilters(query)
101         return execute_query(self.request, query)
102     
103     def update(self):
104         query = Query.update(self.type)
105         query = self.applyFilters(query, True)
106         if self.params :
107             query.set(self.params)
108         else:
109             raise Exception, "Params are required for update"
110         return execute_query(self.request, query)
111     
112     def delete(self):
113         query = Query.delete(self.type)
114         query = self.applyFilters(query, True)
115         if self.params :
116             query.set(self.params)
117         else:
118             raise Exception, "Params are required for update"
119         return execute_query(self.request, query)
120     
121     def json(self):
122         return HttpResponse(json.dumps(self.get(), cls=DecimalEncoder, default=DateEncoder), content_type="application/json")
123     
124     def datatable(self):
125         response = self.get()
126         response_data = {}
127         response_data['fields'] = self.fields
128         response_data['labels'] = self.fields
129         response_data['data'] = []
130         response_data['total'] = len(response)
131         for r in response :
132             d = []
133             for p in self.fields :
134                 d.append(r[p])
135             response_data['data'].append(d)
136          
137         return HttpResponse(json.dumps(response_data, cls=DecimalEncoder, default=DateEncoder), content_type="application/json")
138
139 def error(msg):
140     return HttpResponse(json.dumps({'error' : msg}), content_type="application/json")
141
142 def success(msg):
143     return HttpResponse(json.dumps({'success' : msg}), content_type="application/json")