Skip to content

Commit 6962b31

Browse files
authored
Merge pull request #41 from zhangchunlin/master
Sync
2 parents c98d7b0 + cbee292 commit 6962b31

File tree

10 files changed

+513
-39
lines changed

10 files changed

+513
-39
lines changed

Diff for: demo/apps/apijson_demo/settings.ini

+11
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,17 @@ comment = {
3131
}
3232

3333
[APIJSON_REQUESTS]
34+
user = {
35+
"POST" :{
36+
"ADD":{"@role": "ADMIN"},
37+
"DISALLOW" : ["id"],
38+
"NECESSARY" : ["username","nickname"],
39+
},
40+
"PUT" :{
41+
"ADD":{"@role": "OWNER"},
42+
"NECESSARY" : ["id"],
43+
},
44+
}
3445
moment = {
3546
"POST" :{
3647
"ADD":{"@role": "OWNER"},

Diff for: demo/apps/tables/settings.ini

+3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
[APIJSON_TABLES]
2+
user = {
3+
"editable" : "auto",
4+
}
25
moment = {
36
"editable" : "auto",
47
"table_fields" : [

Diff for: tests/demo/apps/apijson_demo/dbinit.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,25 @@
1515
"username": "admin",
1616
"nickname": "Administrator",
1717
"email": "admin@localhost",
18-
"date_join": "2018-1-1",
18+
"date_join": "2018-1-1 0:0:0",
1919
},
2020
{
2121
"username": "usera",
2222
"nickname": "User A",
2323
"email": "usera@localhost",
24-
"date_join": "2018-2-2",
24+
"date_join": "2018-2-2 0:0:0",
2525
},
2626
{
2727
"username": "userb",
2828
"nickname": "User B",
2929
"email": "userb@localhost",
30-
"date_join": "2018-3-3",
30+
"date_join": "2018-3-3 0:0:0",
3131
},
3232
{
3333
"username": "userc",
3434
"nickname": "User C",
3535
"email": "userc@localhost",
36-
"date_join": "2018-4-4",
36+
"date_join": "2018-4-4 0:0:0",
3737
},
3838
]
3939

Diff for: tests/demo/apps/apijson_demo/settings.ini

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ user = {
1010
"secret_fields" : ["password"],
1111
"GET" : { "roles" : ["LOGIN","ADMIN","OWNER"] },
1212
"HEAD" : { "roles" : ["LOGIN","ADMIN","OWNER"] },
13-
"POST" : { "roles" : ["ADMIN"] },
13+
#"POST" : { "roles" : ["ADMIN"] }, #remove for test case
1414
"PUT" : { "roles" : ["ADMIN","OWNER"] },
1515
"DELETE" : { "roles" : ["ADMIN"] },
1616
}
@@ -63,7 +63,7 @@ comment = {
6363
"POST" :{
6464
"ADD" :{"@role": "OWNER"},
6565
"DISALLOW" : ["id"],
66-
"NECESSARY" : ["content"]
66+
"NECESSARY" : ["moment_id","content"]
6767
},
6868
"PUT" :{
6969
"ADD":{"@role": "OWNER"},

Diff for: tests/test.py

+434-2
Large diffs are not rendered by default.

Diff for: uliweb_apijson/apijson/README.md

+5-4
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ uliweb-apijson is a subset and slightly different variation of [apijson](https:/
44

55
# Difference with original apijson
66

7-
| feature | apijson(java) | uliweb-apijson | comment |
8-
| -------- | ------------- | -------------- | ------------------------------------------------------------ |
9-
| @combine | ✔️ | ✖️ | Example: "@combine":"&key0,&key1,\|key2,key3" |
10-
| @expr | ✖️ | ✔️ | Example: "@expr":[["username$","&","email$"],"&",["!","nickname$"]] |
7+
| feature | apijson(java) | uliweb-apijson | comment |
8+
| ------------------- | --------------- | ---------------- | ------------------------------------------------------------ |
9+
| @combine | ✔️ | ✖️ | Example: "@combine":"&key0,&key1,\|key2,key3" |
10+
| @expr | ✖️ | ✔️ | Example: "@expr":[["username$","&","email$"],"&",["!","nickname$"]] |
11+
| tag in apijson post/put | "tag": "Moment" | "@tag": "Moment" | |
1112

1213

1314

Diff for: uliweb_apijson/apijson/__init__.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ def _get_array_q(self,params):
163163

164164
#@expr
165165
model_expr = params.get("@expr")
166-
if model_expr:
166+
if model_expr!=None:
167167
c = self.parent._expr(self.model,params,model_expr)
168168
q = q.filter(c)
169169
else:
@@ -258,5 +258,4 @@ def associated_query_array(self):
258258
del params[i]
259259
params.update(refs)
260260
q = self._get_array_q(params)
261-
q = q.limit(1)
262261
item[self.name] = self._get_info(q.one())

Diff for: uliweb_apijson/apijson/templates/vue/inc_apijson_table.html

+20-6
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
var thisp = this
5454
return {
5555
l_request_tag: null,
56+
role: "{{=role or ''}}",
5657

5758
loading: false,
5859
modal_view: false,
@@ -176,10 +177,13 @@
176177
"@page":thisp.current_page-1,
177178
"@query":2
178179
}
179-
arr_params[thisp.model_name] = {
180-
"@order":thisp.sort_key+thisp.sort_order,
181-
"@role":"{{=role}}"
180+
var model_params = {
181+
"@order":thisp.sort_key+thisp.sort_order
182182
}
183+
if (thisp.role!="") {
184+
model_params["@role"] = thisp.role
185+
}
186+
arr_params[thisp.model_name] = model_params
183187
var params = {
184188
"[]":arr_params,
185189
"total@":"/[]/total"
@@ -253,15 +257,15 @@
253257
}
254258
}
255259
else {
256-
this.viewedit_items.push({title:"id",value:row.id,component:"input"})
260+
this.viewedit_items.push({key:"id",title:"id",value:row.id,component:"input"})
257261
var type2comp = {
258262
"boolean":"checkbox"
259263
}
260264
for (var k in row){
261265
if (k!="id" && k[0]!="_") {
262266
var value = row[k]
263267
var comp = type2comp[typeof value] || "input"
264-
this.viewedit_items.push({title:k,value:value,component:comp})
268+
this.viewedit_items.push({title:k,key:k,value:value,component:comp})
265269
}
266270
}
267271
}
@@ -297,6 +301,9 @@
297301
record_params[d.key] = d.value
298302
}
299303
}
304+
if (thisp.role!="") {
305+
record_params["@role"] = thisp.role
306+
}
300307
params[thisp.l_request_tag] = record_params
301308
params = thisp.ajax_hook("apijson_put","update",params)
302309
$.ajax({
@@ -377,9 +384,13 @@
377384
var params = {
378385
"@tag": thisp.l_request_tag
379386
}
380-
params[thisp.l_request_tag] = {
387+
var model_params = {
381388
"id": thisp.delete_params.row.id
382389
}
390+
if (thisp.role!="") {
391+
model_params["@role"] = thisp.role
392+
}
393+
params[thisp.l_request_tag] = model_params
383394
params = thisp.ajax_hook("apijson_delete","delete",params)
384395
$.ajax({
385396
type: "POST",
@@ -433,6 +444,9 @@
433444
var d = thisp.add_items[k]
434445
post_params[d.key] = d.value
435446
}
447+
if (thisp.role!="") {
448+
post_params["@role"] = thisp.role
449+
}
436450
params[this.l_request_tag] = post_params
437451
params = thisp.ajax_hook("apijson_post","add",params)
438452
$.ajax({

Diff for: uliweb_apijson/apijson/templates/vue/inc_apijson_viewedit.html

+8-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
data: function(){
2626
return {
2727
l_request_tag: null,
28-
role: "{{=role}}",
28+
role: "{{=role or ''}}",
2929
row: {},
3030
row_saved: {},
3131
viewedit_items: [],
@@ -38,8 +38,10 @@
3838
init_viewedit: function(){
3939
var params = {}
4040
var model_params = {
41-
"id":this.id,
42-
"@role":this.role
41+
"id":this.id
42+
}
43+
if (this.role!='') {
44+
model_params["@role"] = this.role
4345
}
4446
params[this.model_name] = model_params
4547
var thisp = this
@@ -89,6 +91,9 @@
8991
this.row[d.key] = d.value
9092
}
9193
}
94+
if (this.role!='') {
95+
record_params["@role"] = this.role
96+
}
9297
params[this.l_request_tag] = record_params
9398
params = this.ajax_hook("apijson_put","update",params)
9499
var thisp = this

Diff for: uliweb_apijson/apijson/views.py

+25-16
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,12 @@ def _get_one(self,key):
112112
roles = GET.get("roles")
113113
permission_check_ok = False
114114
if not params_role:
115-
if hasattr(request,"user"):
115+
if hasattr(request,"user") and request.user:
116116
params_role = "LOGIN"
117117
else:
118118
params_role = "UNKNOWN"
119119
elif params_role != "UNKNOWN":
120-
if not hasattr(request,"user"):
120+
if not (hasattr(request,"user") and request.user):
121121
return json({"code":400,"msg":"no login user for role '%s'"%(params_role)})
122122
if params_role not in roles:
123123
return json({"code":400,"msg":"'%s' not accessible by role '%s'"%(model_name,params_role)})
@@ -200,57 +200,61 @@ def _filter_owner(self,model,model_setting,q):
200200

201201
def _expr(self,model,model_param,model_expr):
202202
if not isinstance(model_expr,list):
203-
raise UliwebError("only accept array in @expr: '%s'"%(model_expr))
203+
raise UliwebError("only accept array in @expr, but get '%s'"%(model_expr))
204204
num = len(model_expr)
205205
if (num<2 or num>3):
206-
raise UliwebError("only accept 2 or 3 items in @expr: '%s'"%(model_expr))
206+
raise UliwebError("only accept 2 or 3 items in @expr, but get '%s'"%(model_expr))
207207
op = model_expr[-2]
208208
if op=='&':
209209
if num!=3:
210-
raise UliwebError("'&'(and) expression need 3 items: '%s'"%(model_expr))
210+
raise UliwebError("'&'(and) expression need 3 items, but get '%s'"%(model_expr))
211211
c1 = self._get_filter_condition(model,model_param,model_expr[0],expr=True)
212212
c2 = self._get_filter_condition(model,model_param,model_expr[2],expr=True)
213213
return and_(c1,c2)
214214
elif op=='|':
215215
if num!=3:
216-
raise UliwebError("'|'(or) expression need 3 items: '%s'"%(model_expr))
216+
raise UliwebError("'|'(or) expression need 3 items, but get '%s'"%(model_expr))
217217
c1 = self._get_filter_condition(model,model_param,model_expr[0],expr=True)
218218
c2 = self._get_filter_condition(model,model_param,model_expr[2],expr=True)
219219
return or_(c1,c2)
220220
elif op=='!':
221221
if num!=2:
222-
raise UliwebError("'!'(not) expression need 2 items: '%s'"%(model_expr))
222+
raise UliwebError("'!'(not) expression need 2 items, but get '%s'"%(model_expr))
223223
return not_(self._get_filter_condition(model,model_param,model_expr[1],expr=True))
224224
else:
225225
raise UliwebError("unknown operator: '%s'"%(op))
226226

227227
def _get_filter_condition(self,model,model_param,item,expr=False):
228+
#item can be param key, or expr which expected to be a list
228229
if isinstance(item,list):
229230
if expr:
230231
return self._expr(model,model_param,model_expr=item)
231232
else:
232-
raise UliwebError("item can be array only in @expr: '%s'"%(item))
233+
#current implementation won't run here, but keep for safe
234+
raise UliwebError("item can be list only in @expr: '%s'"%(item))
233235
if not isinstance(item,string_types):
236+
#current implementation won't run here, but keep for safe
234237
raise UliwebError("item should be array or string: '%s'"%(item))
235238
n = item
236239
if n[0]=="@":
240+
#current implementation won't run here, but keep for safe
237241
raise UliwebError("param key should not begin with @: '%s'"%(n))
238242
if n[-1]=="$":
239243
name = n[:-1]
240244
if hasattr(model,name):
241245
return getattr(model.c,name).like(model_param[n])
242246
else:
243-
raise UliwebError("'%s' does not have '%s'"%(model_name,name))
247+
raise UliwebError("model does not have this column: '%s'"%(name))
244248
elif n[-1]=="}" and n[-2]=="{":
245249
name = n[:-2]
246250
if hasattr(model,name):
247-
# TODO
251+
# TODO: https://github.com/APIJSON/APIJSON/blob/master/Document.md#32-%E5%8A%9F%E8%83%BD%E7%AC%A6
248252
pass
249253
raise UliwebError("still not support '%s'"%(name))
250254
elif hasattr(model,n):
251255
return getattr(model.c,n)==model_param[n]
252256
else:
253-
raise UliwebError("not support item: '%s'"%(item))
257+
raise UliwebError("non-existent column or not support item: '%s'"%(item))
254258

255259
def head(self):
256260
try:
@@ -286,18 +290,21 @@ def _head(self,key):
286290
roles = HEAD.get("roles")
287291
permission_check_ok = False
288292
if not params_role:
289-
if request.user:
293+
if hasattr(request,"user") and request.user:
290294
params_role = "LOGIN"
291295
else:
292296
params_role = "UNKNOWN"
293297
if params_role not in roles:
294-
return json({"code":400,"msg":"'%s' not accessible by role '%s'"%(model_name,params_role)})
298+
return json({"code":400,"msg":"role '%s' not have permission HEAD for '%s'"%(params_role,model_name)})
295299
if params_role == "UNKNOWN":
296300
permission_check_ok = True
301+
elif not (hasattr(request,"user") and request.user):
302+
return json({"code":400,"msg":"no login user for role '%s'"%(params_role)})
297303
elif functions.has_role(request.user,params_role):
298304
permission_check_ok = True
299305
else:
300306
return json({"code":400,"msg":"user doesn't have role '%s'"%(params_role)})
307+
#current implementation won't run here, but keep for safe
301308
if not permission_check_ok:
302309
return json({"code":400,"msg":"no permission"})
303310

@@ -381,7 +388,7 @@ def _post_one(self,key,tag):
381388
if roles:
382389
for role in roles:
383390
if role == "OWNER":
384-
if request.user:
391+
if hasattr(request,"user") and request.user:
385392
permission_check_ok = True
386393
if user_id_field:
387394
params[user_id_field] = request.user.id
@@ -500,7 +507,7 @@ def _put_one(self,key,tag):
500507
if roles:
501508
for role in roles:
502509
if role == "OWNER":
503-
if request.user:
510+
if hasattr(request,"user") and request.user:
504511
if user_id_field:
505512
if obj.to_dict().get(user_id_field)==request.user.id:
506513
permission_check_ok = True
@@ -535,6 +542,8 @@ def _put_one(self,key,tag):
535542
for k in params:
536543
if k=="id":
537544
continue
545+
elif k[0]=="@":
546+
continue
538547
elif hasattr(obj,k):
539548
kwargs[k] = params[k]
540549
else:
@@ -621,7 +630,7 @@ def _delete_one(self,key,tag):
621630
if roles:
622631
for role in roles:
623632
if role == "OWNER":
624-
if request.user:
633+
if hasattr(request,"user") and request.user:
625634
if user_id_field:
626635
if obj.to_dict().get(user_id_field)==request.user.id:
627636
permission_check_ok = True

0 commit comments

Comments
 (0)