@@ -44,12 +44,12 @@ def _get_one(self,key):
44
44
q = model .all ()
45
45
46
46
#rbac check begin
47
- rbac_get = model_setting .get ("rbac_get " ,{})
48
- if not rbac_get :
47
+ GET = model_setting .get ("GET " ,{})
48
+ if not GET :
49
49
return json ({"code" :401 ,"msg" :"'%s' not accessible by apijson" % (modelname )})
50
50
51
- roles = rbac_get .get ("roles" )
52
- perms = rbac_get .get ("perms" )
51
+ roles = GET .get ("roles" )
52
+ perms = GET .get ("perms" )
53
53
params_role = params .get ("@role" )
54
54
permission_check_ok = False
55
55
user_role = None
@@ -169,12 +169,12 @@ def _get_array(self,key):
169
169
q = model .all ()
170
170
171
171
#rbac check begin
172
- rbac_get = model_setting .get ("rbac_get " ,{})
173
- if not rbac_get :
172
+ GET = model_setting .get ("GET " ,{})
173
+ if not GET :
174
174
return json ({"code" :401 ,"msg" :"'%s' not accessible by apijson" % (modelname )})
175
175
176
- roles = rbac_get .get ("roles" )
177
- perms = rbac_get .get ("perms" )
176
+ roles = GET .get ("roles" )
177
+ perms = GET .get ("perms" )
178
178
params_role = params .get ("@role" )
179
179
permission_check_ok = False
180
180
user_role = None
@@ -277,38 +277,135 @@ def _post_one(self,key,tag):
277
277
except ModelNotFound as e :
278
278
log .error ("try to find model '%s' but not found: '%s'" % (modelname ,e ))
279
279
return json ({"code" :400 ,"msg" :"model '%s' not found" % (modelname )})
280
-
281
280
282
- request_setting = request_setting_tag .get (modelname ,{})
283
- ADD = request_setting .get ("ADD" )
281
+ request_setting_model = request_setting_tag .get (modelname ,{})
282
+ request_setting_POST = request_setting_model .get ("POST" ,{})
283
+ ADD = request_setting_POST .get ("ADD" )
284
284
permission_check_ok = False
285
285
if ADD :
286
- _role = ADD .get ("@role " )
287
- if _role :
288
- for r in _role :
286
+ roles = ADD .get ("roles " )
287
+ if roles :
288
+ for r in roles :
289
289
if r == "OWNER" :
290
290
if request .user :
291
291
permission_check_ok = True
292
292
if user_id_field :
293
293
params [user_id_field ] = request .user .id
294
+ else :
295
+ #need OWNER, but don't know how to set user id
296
+ return json ({"code" :400 ,"msg" :"no permission" })
294
297
if not permission_check_ok :
295
298
return json ({"code" :400 ,"msg" :"no permission" })
296
299
297
- DISALLOW = request_setting .get ("DISALLOW" )
300
+ DISALLOW = request_setting_POST .get ("DISALLOW" )
298
301
if DISALLOW :
299
302
for field in DISALLOW :
300
303
if field in params :
301
304
log .error ("request '%s' disallow '%s'" % (tag ,field ))
302
305
return json ({"code" :400 ,"msg" :"request '%s' disallow '%s'" % (tag ,field )})
303
306
307
+ NECESSARY = request_setting_POST .get ("NECESSARY" )
308
+ if NECESSARY :
309
+ for field in NECESSARY :
310
+ if field not in params :
311
+ log .error ("request '%s' don't have necessary field '%s'" % (tag ,field ))
312
+ return json ({"code" :400 ,"msg" :"request '%s' don't have necessary field '%s'" % (tag ,field )})
313
+
304
314
obj = model (** params )
305
315
ret = obj .save ()
306
316
obj_dict = obj .to_dict (convert = False )
317
+ secret_fields = model_setting .get ("secret_fields" )
318
+ if secret_fields :
319
+ for k in secret_fields :
320
+ del obj_dict [k ]
321
+
307
322
if ret :
308
323
obj_dict ["code" ] = 200
309
324
obj_dict ["message" ] = "success"
310
325
else :
311
326
obj_dict ["code" ] = 400
312
327
obj_dict ["message" ] = "fail"
328
+ self .rdict ["code" ] = 400
329
+ self .rdict ["message" ] = "fail"
330
+
331
+ self .rdict [key ] = obj_dict
332
+
333
+ def put (self ):
334
+ tag = self .request_data .get ("@tag" )
335
+ for key in self .request_data :
336
+ if key [0 ]!= "@" :
337
+ rsp = self ._put_one (key ,tag )
338
+ if rsp :
339
+ return rsp
340
+ else :
341
+ #only accept one table
342
+ return json (self .rdict )
343
+
344
+ return json (self .rdict )
345
+
346
+ def _put_one (self ,key ,tag ):
347
+ tag = tag or key
348
+ modelname = key
349
+ params = self .request_data [key ]
350
+
351
+ try :
352
+ model = getattr (models ,modelname )
353
+ model_setting = settings .APIJSON_MODELS .get (modelname ,{})
354
+ request_setting_tag = settings .APIJSON_REQUESTS .get (tag ,{})
355
+ user_id_field = model_setting .get ("user_id_field" )
356
+ except ModelNotFound as e :
357
+ log .error ("try to find model '%s' but not found: '%s'" % (modelname ,e ))
358
+ return json ({"code" :400 ,"msg" :"model '%s' not found" % (modelname )})
359
+
360
+ request_setting_model = request_setting_tag .get (modelname ,{})
361
+ request_setting_PUT = request_setting_model .get ("PUT" ,{})
362
+ ADD = request_setting_PUT .get ("ADD" )
363
+ permission_check_ok = False
364
+
365
+ try :
366
+ id_ = params .get ("id" )
367
+ if not id_ :
368
+ return json ({"code" :400 ,"msg" :"id param needed" })
369
+ id_ = int (id_ )
370
+ except ValueError as e :
371
+ return json ({"code" :400 ,"msg" :"id '%s' cannot convert to integer" % (params .get ("id" ))})
372
+ obj = model .get (id_ )
313
373
374
+ if ADD :
375
+ roles = ADD .get ("roles" )
376
+ if roles :
377
+ for r in roles :
378
+ if r == "OWNER" :
379
+ if request .user :
380
+ if user_id_field :
381
+ if getattr (obj ,user_id_field )!= request .user .id :
382
+ permission_check_ok = True
383
+ else :
384
+ return json ({"code" :400 ,"msg" :"need login user" })
385
+ if not permission_check_ok :
386
+ return json ({"code" :400 ,"msg" :"no permission" })
387
+
388
+ if not obj :
389
+ return json ({"code" :400 ,"msg" :"cannot find record id '%s'" % (id_ )})
390
+ kwargs = {}
391
+ for k in params :
392
+ if k == "id" :
393
+ continue
394
+ elif hasattr (obj ,k ):
395
+ kwargs [k ] = params [k ]
396
+ else :
397
+ return json ({"code" :400 ,"msg" :"'%s' don't have field '%s'" % (modelname ,k )})
398
+ obj .update (** kwargs )
399
+ ret = obj .save ()
400
+ obj_dict = {"id" :id_ }
401
+ if ret :
402
+ obj_dict ["code" ] = 200
403
+ obj_dict ["message" ] = "success"
404
+ obj_dict ["count" ] = 1
405
+ else :
406
+ obj_dict ["code" ] = 400
407
+ obj_dict ["message" ] = "fail"
408
+ obj_dict ["count" ] = 0
409
+ self .rdict ["code" ] = 400
410
+ self .rdict ["message" ] = "fail"
314
411
self .rdict [key ] = obj_dict
0 commit comments