@@ -253,4 +253,62 @@ def _filter_owner(self,model,model_setting,q):
253253 return owner_filtered ,q
254254
255255 def post (self ):
256+ tag = self .request_data .get ("@tag" )
257+ for key in self .request_data :
258+ if key [0 ]!= "@" :
259+ rsp = self ._post_one (key ,tag )
260+ if rsp :
261+ return rsp
262+ else :
263+ #only accept one table
264+ return json (self .rdict )
256265 return json (self .rdict )
266+
267+ def _post_one (self ,key ,tag ):
268+ tag = tag or key
269+ modelname = key
270+ params = self .request_data [key ]
271+
272+ try :
273+ model = getattr (models ,modelname )
274+ model_setting = settings .APIJSON_MODELS .get (modelname ,{})
275+ request_setting_tag = settings .APIJSON_REQUESTS .get (tag ,{})
276+ user_id_field = model_setting .get ("user_id_field" )
277+ except ModelNotFound as e :
278+ log .error ("try to find model '%s' but not found: '%s'" % (modelname ,e ))
279+ return json ({"code" :400 ,"msg" :"model '%s' not found" % (modelname )})
280+
281+
282+ request_setting = request_setting_tag .get (modelname ,{})
283+ ADD = request_setting .get ("ADD" )
284+ permission_check_ok = False
285+ if ADD :
286+ _role = ADD .get ("@role" )
287+ if _role :
288+ for r in _role :
289+ if r == "OWNER" :
290+ if request .user :
291+ permission_check_ok = True
292+ if user_id_field :
293+ params [user_id_field ] = request .user .id
294+ if not permission_check_ok :
295+ return json ({"code" :400 ,"msg" :"no permission" })
296+
297+ DISALLOW = request_setting .get ("DISALLOW" )
298+ if DISALLOW :
299+ for field in DISALLOW :
300+ if field in params :
301+ log .error ("request '%s' disallow '%s'" % (tag ,field ))
302+ return json ({"code" :400 ,"msg" :"request '%s' disallow '%s'" % (tag ,field )})
303+
304+ obj = model (** params )
305+ ret = obj .save ()
306+ obj_dict = obj .to_dict (convert = False )
307+ if ret :
308+ obj_dict ["code" ] = 200
309+ obj_dict ["message" ] = "success"
310+ else :
311+ obj_dict ["code" ] = 400
312+ obj_dict ["message" ] = "fail"
313+
314+ self .rdict [key ] = obj_dict
0 commit comments