Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
add apijson delete support and example; change 'tag' to '@tag'
  • Loading branch information
zhangchunlin committed Dec 28, 2018
commit ecdf07aab65d82c97d20b42afb94d636a8bcb0ea
37 changes: 28 additions & 9 deletions demo/apps/apijson_demo/templates/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<tab-pane label="apijson get" name="tab_get"></tab-pane>
<tab-pane label="apijson post" name="tab_post"></tab-pane>
<tab-pane label="apijson put" name="tab_put"></tab-pane>
<tab-pane label="apijson delete" name="tab_delete"></tab-pane>
</tabs>
<Row>
<i-col span="3"><div align="center">login user</div></i-col>
Expand Down Expand Up @@ -49,14 +50,27 @@
<i-col span="3"><div align="center">PUT URL</div></i-col>
<i-col span="8"><i-input value="/apijson/put" readonly/></i-col>
</Row>
<Row v-if="tab_current==='tab_put'">
<i-col span="3"><div align="center"><strong>apijson put</strong> request examples</div></i-col>
<i-col span="8">
<i-select v-model="request_data">
<i-option v-for="item in request_put" :value="item.value" :key="item.value">{ item.label }</i-option>
</i-select>
</i-col>
</Row>
<Row v-if="tab_current==='tab_put'">
<i-col span="3"><div align="center"><strong>apijson put</strong> request examples</div></i-col>
<i-col span="8">
<i-select v-model="request_data">
<i-option v-for="item in request_put" :value="item.value" :key="item.value">{ item.label }</i-option>
</i-select>
</i-col>
</Row>

<Row v-if="tab_current==='tab_delete'">
<i-col span="3"><div align="center">DELETE URL</div></i-col>
<i-col span="8"><i-input value="/apijson/delete" readonly/></i-col>
</Row>
<Row v-if="tab_current==='tab_delete'">
<i-col span="3"><div align="center"><strong>apijson delete</strong> request examples</div></i-col>
<i-col span="8">
<i-select v-model="request_data">
<i-option v-for="item in request_delete" :value="item.value" :key="item.value">{ item.label }</i-option>
</i-select>
</i-col>
</Row>

<Row>
<i-col span="3"><div align="center">request data</div></i-col>
Expand All @@ -76,14 +90,16 @@
request_get : {{=request_get_json}},
request_post : {{=request_post_json}},
request_put : {{=request_put_json}},
request_delete : {{=request_delete_json}},
request_data : "",
can_post : true,
response_data : "",
tab_current : "tab_get",
tab2url : {
"tab_get":"{{=url_for('uliweb_apijson.apijson.views.ApiJson.get')}}",
"tab_post":"{{=url_for('uliweb_apijson.apijson.views.ApiJson.post')}}",
"tab_put":"{{=url_for('uliweb_apijson.apijson.views.ApiJson.put')}}"
"tab_put":"{{=url_for('uliweb_apijson.apijson.views.ApiJson.put')}}",
"tab_delete":"{{=url_for('uliweb_apijson.apijson.views.ApiJson.delete')}}"
}
},
methods: {
Expand Down Expand Up @@ -120,6 +136,9 @@
else if (n=="tab_put") {
vm.request_data = vm.request_put[0].value
}
else if (n=="tab_delete") {
vm.request_data = vm.request_delete[0].value
}
vm.response_data = ""
}
}
Expand Down
17 changes: 15 additions & 2 deletions demo/apps/apijson_demo/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ def index():
"moment_id": 1,
"content": "new test comment"
},
"tag": "comment"
"@tag": "comment"
}''',
},
]
Expand All @@ -92,7 +92,19 @@ def index():
"id": 1,
"content": "modify moment content"
},
"tag": "moment"
"@tag": "moment"
}''',
},
]

request_delete = [
{
"label":"Delete moment",
"value":'''{
"moment": {
"id": 1
},
"@tag": "moment"
}''',
},
]
Expand All @@ -102,4 +114,5 @@ def index():
"request_get_json":dumps(request_get),
"request_post_json":dumps(request_post),
"request_put_json":dumps(request_put),
"request_delete_json":dumps(request_delete),
}
105 changes: 99 additions & 6 deletions uliweb_apijson/apijson/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,8 @@ def _filter_owner(self,model,model_setting,q):

def post(self):
tag = self.request_data.get("@tag")
if not tag:
return json({"code":400,"msg":"'tag' parameter is needed"})
for key in self.request_data:
if key[0]!="@":
rsp = self._post_one(key,tag)
Expand All @@ -265,7 +267,6 @@ def post(self):
return json(self.rdict)

def _post_one(self,key,tag):
tag = tag or key
modelname = key
params = self.request_data[key]
params_role = params.get("@role")
Expand All @@ -282,12 +283,12 @@ def _post_one(self,key,tag):
request_setting_model = request_setting_tag.get(modelname,{})
request_setting_POST = request_setting_model.get("POST",{})
ADD = request_setting_POST.get("ADD")
permission_check_ok = False
if ADD:
ADD_role = ADD.get("@role")
if ADD_role and not params_role:
params_role = ADD_role

permission_check_ok = False
POST = model_setting.get("POST")
if POST:
roles = POST.get("roles")
Expand Down Expand Up @@ -349,6 +350,8 @@ def _post_one(self,key,tag):

def put(self):
tag = self.request_data.get("@tag")
if not tag:
return json({"code":400,"msg":"'tag' parameter is needed"})
for key in self.request_data:
if key[0]!="@":
rsp = self._put_one(key,tag)
Expand All @@ -361,7 +364,6 @@ def put(self):
return json(self.rdict)

def _put_one(self,key,tag):
tag = tag or key
modelname = key
params = self.request_data[key]
params_role = params.get("@role")
Expand All @@ -377,7 +379,6 @@ def _put_one(self,key,tag):

request_setting_model = request_setting_tag.get(modelname,{})
request_setting_PUT = request_setting_model.get("PUT",{})
permission_check_ok = False

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

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

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

def delete(self):
tag = self.request_data.get("@tag")
if not tag:
return json({"code":400,"msg":"'tag' parameter is needed"})
for key in self.request_data:
if key[0]!="@":
rsp = self._delete_one(key,tag)
if rsp:
return rsp
else:
#only accept one table
return json(self.rdict)
return json(self.rdict)

def _delete_one(self,key,tag):
modelname = key
params = self.request_data[key]
params_role = params.get("@role")

try:
model = getattr(models,modelname)
model_setting = settings.APIJSON_MODELS.get(modelname,{})
request_setting_tag = settings.APIJSON_REQUESTS.get(tag,{})
user_id_field = model_setting.get("user_id_field")
except ModelNotFound as e:
log.error("try to find model '%s' but not found: '%s'"%(modelname,e))
return json({"code":400,"msg":"model '%s' not found"%(modelname)})

request_setting_model = request_setting_tag.get(modelname,{})
request_setting_DELETE = request_setting_model.get("DELETE",{})

ADD = request_setting_DELETE.get("ADD")
if ADD:
ADD_role = ADD.get("@role")
if ADD_role and not params_role:
params_role = ADD_role

try:
id_ = params.get("id")
if not id_:
return json({"code":400,"msg":"id param needed"})
id_ = int(id_)
except ValueError as e:
return json({"code":400,"msg":"id '%s' cannot convert to integer"%(params.get("id"))})
obj = model.get(id_)
if not obj:
return json({"code":400,"msg":"cannot find record id '%s'"%(id_)})

permission_check_ok = False
DELETE = model_setting.get("DELETE")
if DELETE:
roles = DELETE.get("roles")
if params_role:
if not params_role in roles:
return json({"code":401,"msg":"'%s' not accessible by role '%s'"%(modelname,params_role)})
roles = [params_role]
if roles:
for role in roles:
if role == "OWNER":
if request.user:
if user_id_field:
if obj.to_dict().get(user_id_field)==request.user.id:
permission_check_ok = True
break
else:
return json({"code":400,"msg":"need login user"})
else:
if functions.has_role(request.user,role):
permission_check_ok = True
break

if not permission_check_ok:
return json({"code":400,"msg":"no permission"})

try:
obj.delete()
ret = True
except Exception as e:
log.error("remove %s %s fail"%(modelname,id_))
ret = False

obj_dict = {"id":id_}
if ret:
obj_dict["code"] = 200
obj_dict["message"] = "success"
obj_dict["count"] = 1
else:
obj_dict["code"] = 400
obj_dict["message"] = "fail"
obj_dict["count"] = 0
self.rdict["code"] = 400
self.rdict["message"] = "fail"
self.rdict[key] = obj_dict