Skip to content

Commit 39386fb

Browse files
committed
add post support in apijson;add APIJSON_MODELS and APIJSON_REQUESTS for moment in demo; add a new post example
1 parent ef703f3 commit 39386fb

File tree

5 files changed

+84
-5
lines changed

5 files changed

+84
-5
lines changed

demo/apps/apijson_demo/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class Moment(Model):
1414
user_id = Reference("user")
1515
date = Field(datetime.datetime, auto_now_add=True)
1616
content = Field(TEXT)
17+
picture_list = Field(JSON, default=[])
1718

1819
class Comment(Model):
1920
user_id = Reference("user")

demo/apps/apijson_demo/settings.ini

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,23 @@
22
privacy = 'apijson_demo.models.Privacy'
33
comment = 'apijson_demo.models.Comment'
44
moment = 'apijson_demo.models.Moment'
5+
6+
[APIJSON_MODELS]
7+
moment = {
8+
"user_id_field" : "user_id",
9+
"rbac_get" : {
10+
"roles" : ["OWNER"]
11+
},
12+
"rbac_post" : {
13+
"roles" : ["OWNER"]
14+
}
15+
}
16+
17+
[APIJSON_REQUESTS]
18+
moment = {
19+
"moment": {
20+
"ADD" :{"@role": ["OWNER"]},
21+
"DISALLOW" : ["id"],
22+
"NECESSARY" : ["content"]
23+
}
24+
}

demo/apps/apijson_demo/templates/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
url: vm.tab2url[vm.tab_current],
8383
data: vm.request_data,
8484
success: function (data) {
85-
vm.response_data = JSON.stringify(data,null,2)
85+
vm.response_data = JSON.stringify(data,null,4)
8686
vm.can_post = false
8787
}
8888
})

demo/apps/apijson_demo/views.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,15 @@ def index():
4949

5050
request_post = [
5151
{
52-
"label":"Add record",
52+
"label":"Add new moment",
5353
"value":'''{
54-
"Moment": {
54+
"moment": {
5555
"content": "new moment for test",
56-
"pictureList": [
56+
"picture_list": [
5757
"http://static.oschina.net/uploads/user/48/96331_50.jpg"
5858
]
5959
},
60-
"tag": "Moment"
60+
"@tag": "moment"
6161
}''',
6262
},
6363
]

uliweb_apijson/apijson/views.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)