Skip to content

Commit ecdf07a

Browse files
committed
add apijson delete support and example; change 'tag' to '@tag'
1 parent a611184 commit ecdf07a

File tree

3 files changed

+142
-17
lines changed

3 files changed

+142
-17
lines changed

demo/apps/apijson_demo/templates/index.html

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<tab-pane label="apijson get" name="tab_get"></tab-pane>
1010
<tab-pane label="apijson post" name="tab_post"></tab-pane>
1111
<tab-pane label="apijson put" name="tab_put"></tab-pane>
12+
<tab-pane label="apijson delete" name="tab_delete"></tab-pane>
1213
</tabs>
1314
<Row>
1415
<i-col span="3"><div align="center">login user</div></i-col>
@@ -49,14 +50,27 @@
4950
<i-col span="3"><div align="center">PUT URL</div></i-col>
5051
<i-col span="8"><i-input value="/apijson/put" readonly/></i-col>
5152
</Row>
52-
<Row v-if="tab_current==='tab_put'">
53-
<i-col span="3"><div align="center"><strong>apijson put</strong> request examples</div></i-col>
54-
<i-col span="8">
55-
<i-select v-model="request_data">
56-
<i-option v-for="item in request_put" :value="item.value" :key="item.value">{ item.label }</i-option>
57-
</i-select>
58-
</i-col>
59-
</Row>
53+
<Row v-if="tab_current==='tab_put'">
54+
<i-col span="3"><div align="center"><strong>apijson put</strong> request examples</div></i-col>
55+
<i-col span="8">
56+
<i-select v-model="request_data">
57+
<i-option v-for="item in request_put" :value="item.value" :key="item.value">{ item.label }</i-option>
58+
</i-select>
59+
</i-col>
60+
</Row>
61+
62+
<Row v-if="tab_current==='tab_delete'">
63+
<i-col span="3"><div align="center">DELETE URL</div></i-col>
64+
<i-col span="8"><i-input value="/apijson/delete" readonly/></i-col>
65+
</Row>
66+
<Row v-if="tab_current==='tab_delete'">
67+
<i-col span="3"><div align="center"><strong>apijson delete</strong> request examples</div></i-col>
68+
<i-col span="8">
69+
<i-select v-model="request_data">
70+
<i-option v-for="item in request_delete" :value="item.value" :key="item.value">{ item.label }</i-option>
71+
</i-select>
72+
</i-col>
73+
</Row>
6074

6175
<Row>
6276
<i-col span="3"><div align="center">request data</div></i-col>
@@ -76,14 +90,16 @@
7690
request_get : {{=request_get_json}},
7791
request_post : {{=request_post_json}},
7892
request_put : {{=request_put_json}},
93+
request_delete : {{=request_delete_json}},
7994
request_data : "",
8095
can_post : true,
8196
response_data : "",
8297
tab_current : "tab_get",
8398
tab2url : {
8499
"tab_get":"{{=url_for('uliweb_apijson.apijson.views.ApiJson.get')}}",
85100
"tab_post":"{{=url_for('uliweb_apijson.apijson.views.ApiJson.post')}}",
86-
"tab_put":"{{=url_for('uliweb_apijson.apijson.views.ApiJson.put')}}"
101+
"tab_put":"{{=url_for('uliweb_apijson.apijson.views.ApiJson.put')}}",
102+
"tab_delete":"{{=url_for('uliweb_apijson.apijson.views.ApiJson.delete')}}"
87103
}
88104
},
89105
methods: {
@@ -120,6 +136,9 @@
120136
else if (n=="tab_put") {
121137
vm.request_data = vm.request_put[0].value
122138
}
139+
else if (n=="tab_delete") {
140+
vm.request_data = vm.request_delete[0].value
141+
}
123142
vm.response_data = ""
124143
}
125144
}

demo/apps/apijson_demo/views.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def index():
7979
"moment_id": 1,
8080
"content": "new test comment"
8181
},
82-
"tag": "comment"
82+
"@tag": "comment"
8383
}''',
8484
},
8585
]
@@ -92,7 +92,19 @@ def index():
9292
"id": 1,
9393
"content": "modify moment content"
9494
},
95-
"tag": "moment"
95+
"@tag": "moment"
96+
}''',
97+
},
98+
]
99+
100+
request_delete = [
101+
{
102+
"label":"Delete moment",
103+
"value":'''{
104+
"moment": {
105+
"id": 1
106+
},
107+
"@tag": "moment"
96108
}''',
97109
},
98110
]
@@ -102,4 +114,5 @@ def index():
102114
"request_get_json":dumps(request_get),
103115
"request_post_json":dumps(request_post),
104116
"request_put_json":dumps(request_put),
117+
"request_delete_json":dumps(request_delete),
105118
}

uliweb_apijson/apijson/views.py

Lines changed: 99 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,8 @@ def _filter_owner(self,model,model_setting,q):
254254

255255
def post(self):
256256
tag = self.request_data.get("@tag")
257+
if not tag:
258+
return json({"code":400,"msg":"'tag' parameter is needed"})
257259
for key in self.request_data:
258260
if key[0]!="@":
259261
rsp = self._post_one(key,tag)
@@ -265,7 +267,6 @@ def post(self):
265267
return json(self.rdict)
266268

267269
def _post_one(self,key,tag):
268-
tag = tag or key
269270
modelname = key
270271
params = self.request_data[key]
271272
params_role = params.get("@role")
@@ -282,12 +283,12 @@ def _post_one(self,key,tag):
282283
request_setting_model = request_setting_tag.get(modelname,{})
283284
request_setting_POST = request_setting_model.get("POST",{})
284285
ADD = request_setting_POST.get("ADD")
285-
permission_check_ok = False
286286
if ADD:
287287
ADD_role = ADD.get("@role")
288288
if ADD_role and not params_role:
289289
params_role = ADD_role
290290

291+
permission_check_ok = False
291292
POST = model_setting.get("POST")
292293
if POST:
293294
roles = POST.get("roles")
@@ -349,6 +350,8 @@ def _post_one(self,key,tag):
349350

350351
def put(self):
351352
tag = self.request_data.get("@tag")
353+
if not tag:
354+
return json({"code":400,"msg":"'tag' parameter is needed"})
352355
for key in self.request_data:
353356
if key[0]!="@":
354357
rsp = self._put_one(key,tag)
@@ -361,7 +364,6 @@ def put(self):
361364
return json(self.rdict)
362365

363366
def _put_one(self,key,tag):
364-
tag = tag or key
365367
modelname = key
366368
params = self.request_data[key]
367369
params_role = params.get("@role")
@@ -377,7 +379,6 @@ def _put_one(self,key,tag):
377379

378380
request_setting_model = request_setting_tag.get(modelname,{})
379381
request_setting_PUT = request_setting_model.get("PUT",{})
380-
permission_check_ok = False
381382

382383
ADD = request_setting_PUT.get("ADD")
383384
if ADD:
@@ -393,7 +394,10 @@ def _put_one(self,key,tag):
393394
except ValueError as e:
394395
return json({"code":400,"msg":"id '%s' cannot convert to integer"%(params.get("id"))})
395396
obj = model.get(id_)
397+
if not obj:
398+
return json({"code":400,"msg":"cannot find record id '%s'"%(id_)})
396399

400+
permission_check_ok = False
397401
PUT = model_setting.get("PUT")
398402
if PUT:
399403
roles = PUT.get("roles")
@@ -419,8 +423,6 @@ def _put_one(self,key,tag):
419423
if not permission_check_ok:
420424
return json({"code":400,"msg":"no permission"})
421425

422-
if not obj:
423-
return json({"code":400,"msg":"cannot find record id '%s'"%(id_)})
424426
kwargs = {}
425427
for k in params:
426428
if k=="id":
@@ -445,4 +447,95 @@ def _put_one(self,key,tag):
445447
self.rdict[key] = obj_dict
446448

447449
def delete(self):
450+
tag = self.request_data.get("@tag")
451+
if not tag:
452+
return json({"code":400,"msg":"'tag' parameter is needed"})
453+
for key in self.request_data:
454+
if key[0]!="@":
455+
rsp = self._delete_one(key,tag)
456+
if rsp:
457+
return rsp
458+
else:
459+
#only accept one table
460+
return json(self.rdict)
448461
return json(self.rdict)
462+
463+
def _delete_one(self,key,tag):
464+
modelname = key
465+
params = self.request_data[key]
466+
params_role = params.get("@role")
467+
468+
try:
469+
model = getattr(models,modelname)
470+
model_setting = settings.APIJSON_MODELS.get(modelname,{})
471+
request_setting_tag = settings.APIJSON_REQUESTS.get(tag,{})
472+
user_id_field = model_setting.get("user_id_field")
473+
except ModelNotFound as e:
474+
log.error("try to find model '%s' but not found: '%s'"%(modelname,e))
475+
return json({"code":400,"msg":"model '%s' not found"%(modelname)})
476+
477+
request_setting_model = request_setting_tag.get(modelname,{})
478+
request_setting_DELETE = request_setting_model.get("DELETE",{})
479+
480+
ADD = request_setting_DELETE.get("ADD")
481+
if ADD:
482+
ADD_role = ADD.get("@role")
483+
if ADD_role and not params_role:
484+
params_role = ADD_role
485+
486+
try:
487+
id_ = params.get("id")
488+
if not id_:
489+
return json({"code":400,"msg":"id param needed"})
490+
id_ = int(id_)
491+
except ValueError as e:
492+
return json({"code":400,"msg":"id '%s' cannot convert to integer"%(params.get("id"))})
493+
obj = model.get(id_)
494+
if not obj:
495+
return json({"code":400,"msg":"cannot find record id '%s'"%(id_)})
496+
497+
permission_check_ok = False
498+
DELETE = model_setting.get("DELETE")
499+
if DELETE:
500+
roles = DELETE.get("roles")
501+
if params_role:
502+
if not params_role in roles:
503+
return json({"code":401,"msg":"'%s' not accessible by role '%s'"%(modelname,params_role)})
504+
roles = [params_role]
505+
if roles:
506+
for role in roles:
507+
if role == "OWNER":
508+
if request.user:
509+
if user_id_field:
510+
if obj.to_dict().get(user_id_field)==request.user.id:
511+
permission_check_ok = True
512+
break
513+
else:
514+
return json({"code":400,"msg":"need login user"})
515+
else:
516+
if functions.has_role(request.user,role):
517+
permission_check_ok = True
518+
break
519+
520+
if not permission_check_ok:
521+
return json({"code":400,"msg":"no permission"})
522+
523+
try:
524+
obj.delete()
525+
ret = True
526+
except Exception as e:
527+
log.error("remove %s %s fail"%(modelname,id_))
528+
ret = False
529+
530+
obj_dict = {"id":id_}
531+
if ret:
532+
obj_dict["code"] = 200
533+
obj_dict["message"] = "success"
534+
obj_dict["count"] = 1
535+
else:
536+
obj_dict["code"] = 400
537+
obj_dict["message"] = "fail"
538+
obj_dict["count"] = 0
539+
self.rdict["code"] = 400
540+
self.rdict["message"] = "fail"
541+
self.rdict[key] = obj_dict

0 commit comments

Comments
 (0)