@@ -13,21 +13,33 @@ def __begin__(self):
13
13
"code" :200 ,
14
14
"msg" :"success"
15
15
}
16
+ self .vars = {}
16
17
17
18
try :
18
19
self .request_data = loads (request .data )
19
20
except Exception as e :
20
21
log .error ("try to load json but get exception: '%s', request data: %s" % (e ,request .data ))
21
22
return json ({"code" :400 ,"msg" :"not json data in the request" })
22
23
24
+ def apply_vars (self ):
25
+ for key in self .request_data :
26
+ if key [- 1 ]== "@" :
27
+ k = self .request_data [key ]
28
+ v = self .vars .get (k )
29
+ if v :
30
+ self .rdict [key [:- 1 ]]= v
31
+
23
32
def get (self ):
24
33
for key in self .request_data :
25
- if key [- 2 :]== "[]" :
34
+ if key [- 1 ]== "@" :
35
+ #vars need to be applied later
36
+ pass
37
+ elif key [- 2 :]== "[]" :
26
38
rsp = self ._get_array (key )
27
39
else :
28
40
rsp = self ._get_one (key )
29
41
if rsp :return rsp
30
-
42
+ self . apply_vars ()
31
43
return json (self .rdict )
32
44
33
45
def _get_one (self ,key ):
@@ -95,35 +107,40 @@ def _get_one(self,key):
95
107
96
108
def _get_array (self ,key ):
97
109
params = self .request_data [key ]
98
- query_count = None
99
- query_page = None
100
110
modelname = None
101
111
model_param = None
102
112
model_column_set = None
113
+
114
+ query_count = params .get ("@count" )
115
+ if query_count :
116
+ try :
117
+ query_count = int (query_count )
118
+ except ValueError as e :
119
+ log .error ("bad param in '%s': '%s'" % (n ,params ))
120
+ return json ({"code" :400 ,"msg" :"@count should be an int, now '%s'" % (params [n ])})
121
+
122
+ query_page = params .get ("@page" )
123
+ if query_page :
124
+ #@page begin from 0
125
+ try :
126
+ query_page = int (params [n ])
127
+ except ValueError as e :
128
+ log .error ("bad param in '%s': '%s'" % (n ,params ))
129
+ return json ({"code" :400 ,"msg" :"@page should be an int, now '%s'" % (params [n ])})
130
+ if query_page < 0 :
131
+ return json ({"code" :400 ,"msg" :"page should >0, now is '%s'" % (query_page )})
132
+
133
+ #https://github.com/TommyLemon/APIJSON/blob/master/Document.md#32-%E5%8A%9F%E8%83%BD%E7%AC%A6
134
+ query_type = params .get ("@query" ,0 )
135
+ if query_type not in [0 ,1 ,2 ]:
136
+ return json ({"code" :400 ,"msg" :"bad param 'query': %s" % (query_type )})
137
+
103
138
for n in params :
104
- if n [0 ]== "@" :
105
- if not query_count and n == "@count" :
106
- try :
107
- query_count = int (params [n ])
108
- except ValueError as e :
109
- log .error ("bad param in '%s': '%s'" % (n ,params ))
110
- return json ({"code" :400 ,"msg" :"@count should be an int, now '%s'" % (params [n ])})
111
- if query_count <= 0 :
112
- return json ({"code" :400 ,"msg" :"count should >0, now is '%s' " % (query_count )})
113
- elif not query_page and n == "@page" :
114
- #@page begin from 0
115
- try :
116
- query_page = int (params [n ])
117
- except ValueError as e :
118
- log .error ("bad param in '%s': '%s'" % (n ,params ))
119
- return json ({"code" :400 ,"msg" :"@page should be an int, now '%s'" % (params [n ])})
120
- if query_page < 0 :
121
- return json ({"code" :400 ,"msg" :"page should >0, now is '%s' " % (query_page )})
122
-
123
- # TODO: support join in the future, now only support 1 model
124
- elif not modelname :
139
+ if n [0 ]!= "@" :
140
+ # TODO: support join in the future, now only support 1 model
125
141
modelname = n
126
-
142
+ break
143
+
127
144
if not modelname :
128
145
return json ({"code" :400 ,"msg" :"no model found in array query" })
129
146
@@ -174,37 +191,41 @@ def _get_array(self,key):
174
191
if not owner_filtered :
175
192
return json ({"code" :400 ,"msg" :"'%s' cannot filter with owner" % (modelname )})
176
193
177
- if query_count :
178
- if query_page :
179
- q = q .offset (query_page * query_count )
180
- q = q .limit (query_count )
181
- if model_order :
182
- for k in model_order .split ("," ):
183
- if k [- 1 ]== "+" :
184
- sort_key = k [:- 1 ]
185
- sort_order = "asc"
186
- elif k [- 1 ]== "-" :
187
- sort_key = k [:- 1 ]
188
- sort_order = "desc"
189
- else :
190
- sort_key = k
191
- sort_order = "asc"
192
- column = getattr (model .c ,sort_key )
193
- q = q .order_by (getattr (column ,sort_order )())
194
-
195
- def _get_info (i ):
196
- d = i .to_dict ()
197
- if secret_fields :
198
- for k in secret_fields :
199
- del d [k ]
200
- if model_column_set :
201
- keys = list (d .keys ())
202
- for k in keys :
203
- if k not in model_column_set :
194
+ if query_type in [1 ,2 ]:
195
+ self .vars ["/%s/total" % (key )]= q .count ()
196
+
197
+ if query_type in [0 ,2 ]:
198
+ if query_count :
199
+ if query_page :
200
+ q = q .offset (query_page * query_count )
201
+ q = q .limit (query_count )
202
+ if model_order :
203
+ for k in model_order .split ("," ):
204
+ if k [- 1 ]== "+" :
205
+ sort_key = k [:- 1 ]
206
+ sort_order = "asc"
207
+ elif k [- 1 ]== "-" :
208
+ sort_key = k [:- 1 ]
209
+ sort_order = "desc"
210
+ else :
211
+ sort_key = k
212
+ sort_order = "asc"
213
+ column = getattr (model .c ,sort_key )
214
+ q = q .order_by (getattr (column ,sort_order )())
215
+
216
+ def _get_info (i ):
217
+ d = i .to_dict ()
218
+ if secret_fields :
219
+ for k in secret_fields :
204
220
del d [k ]
205
- return d
206
- l = [_get_info (i )for i in q ]
207
- self .rdict [key ]= l
221
+ if model_column_set :
222
+ keys = list (d .keys ())
223
+ for k in keys :
224
+ if k not in model_column_set :
225
+ del d [k ]
226
+ return d
227
+ l = [_get_info (i )for i in q ]
228
+ self .rdict [key ]= l
208
229
209
230
def _filter_owner (self ,model ,model_setting ,q ):
210
231
owner_filtered = False