Merge branch 'onelab' of ssh://git.onelab.eu/git/myslice into onelab
[unfold.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         
45             self.setLocalFields()
46         
47     
48     def setKey(self):
49         print self.type
50         # What about key formed of multiple fields???
51         query = Query.get('local:object').filter_by('table', '==', self.type).select('key')
52         results = execute_query(self.request, query)
53         print "key of object = %s" % results
54         if results :
55             for r in results[0]['key'] :
56                 self.id = r
57         else :
58             raise Exception, 'Manifold db error'
59     
60     def setLocalFields(self):
61         query = Query.get('local:object').filter_by('table', '==', self.type).select('column.name')
62         results = execute_query(self.request, query)
63         if results :
64             for r in results[0]['column'] :
65                 self.fields.append(r['name'])
66         else :
67             raise Exception, 'Manifold db error'
68     
69     def setFields(self, fields):
70         selected_fields = []
71         for p in fields :
72             if p in self.fields :
73                 selected_fields.append(p)
74         self.fields = selected_fields
75         
76         # 
77         if self.id in self.fields :
78             self.fields.remove(self.id)
79             [self.id].extend(self.fields)
80     
81     def applyFilters(self, query, force_filters = False):
82         if (force_filters and not self.filters) :
83             raise Exception, "Filters required"
84         if self.filters :
85             for k, f in self.filters.iteritems() :
86                 if (f[:1] == "!") :
87                     query.filter_by(k, '!=', f[1:])
88                 elif (f[:2] == ">=") :
89                     query.filter_by(k, '>=', f[2:])
90                 elif (f[:1] == ">") :
91                     query.filter_by(k, '>', f[1:])
92                 elif (f[:2] == "<=") :
93                     query.filter_by(k, '<=', f[2:])
94                 elif (f[:1] == "<") :
95                     query.filter_by(k, '<', f[1:])
96                 else :
97                     query.filter_by(k, '==', f)
98         return query
99     
100     def get(self):
101         query = Query.get(self.type).select(self.fields)
102         query = self.applyFilters(query)
103         return execute_query(self.request, query)
104     
105     def update(self):
106         query = Query.update(self.type)
107         query = self.applyFilters(query, True)
108         if self.params :
109             query.set(self.params)
110         else:
111             raise Exception, "Params are required for update"
112         return execute_query(self.request, query)
113     
114     def delete(self):
115         query = Query.delete(self.type)
116         query = self.applyFilters(query, True)
117         if self.params :
118             query.set(self.params)
119         else:
120             raise Exception, "Params are required for update"
121         return execute_query(self.request, query)
122     
123     def json(self):
124         return HttpResponse(json.dumps(self.get(), cls=DecimalEncoder, default=DateEncoder), content_type="application/json")
125     
126     def datatable(self):
127         response = self.get()
128         response_data = {}
129         response_data['fields'] = self.fields
130         response_data['labels'] = self.fields
131         response_data['data'] = []
132         response_data['total'] = len(response)
133         for r in response :
134             d = []
135             for p in self.fields :
136                 d.append(r[p])
137             response_data['data'].append(d)
138          
139         return HttpResponse(json.dumps(response_data, cls=DecimalEncoder, default=DateEncoder), content_type="application/json")
140
141 def error(msg):
142     return HttpResponse(json.dumps({'error' : msg}), content_type="application/json")
143
144 def success(msg):
145     return HttpResponse(json.dumps({'success' : msg}), content_type="application/json")