@@ -13,21 +13,33 @@ def __begin__(self):
1313 "code" :200 ,
1414 "msg" :"success"
1515 }
16+ self .vars = {}
1617
1718 try :
1819 self .request_data = loads (request .data )
1920 except Exception as e :
2021 log .error ("try to load json but get exception: '%s', request data: %s" % (e ,request .data ))
2122 return json ({"code" :400 ,"msg" :"not json data in the request" })
2223
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+
2332 def get (self ):
2433 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 :]== "[]" :
2638 rsp = self ._get_array (key )
2739 else :
2840 rsp = self ._get_one (key )
2941 if rsp : return rsp
30-
42+ self . apply_vars ()
3143 return json (self .rdict )
3244
3345 def _get_one (self ,key ):
@@ -95,35 +107,40 @@ def _get_one(self,key):
95107
96108 def _get_array (self ,key ):
97109 params = self .request_data [key ]
98- query_count = None
99- query_page = None
100110 modelname = None
101111 model_param = None
102112 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+
103138 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
125141 modelname = n
126-
142+ break
143+
127144 if not modelname :
128145 return json ({"code" :400 ,"msg" :"no model found in array query" })
129146
@@ -174,37 +191,41 @@ def _get_array(self,key):
174191 if not owner_filtered :
175192 return json ({"code" :400 ,"msg" :"'%s' cannot filter with owner" % (modelname )})
176193
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 :
204220 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
208229
209230 def _filter_owner (self ,model ,model_setting ,q ):
210231 owner_filtered = False
0 commit comments