Skip to content

Commit b9dba54

Browse files
committed
for apijson get, support case when setting inAPIJSON_MODELS only define permissions no roles
1 parent 2a4357c commit b9dba54

File tree

3 files changed

+44
-16
lines changed

3 files changed

+44
-16
lines changed

tests/demo/apps/apijson_demo/settings.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ comment = {
4747
"PUT" : { "roles" : ["OWNER","ADMIN"] },
4848
"DELETE" : { "roles" : ["OWNER","ADMIN"] },
4949
}
50+
# only define permissions, no roles
5051
comment2 = {
5152
"user_id_field" : "user_id",
5253
"GET" : { "permissions":["get_comment2"] },

tests/test.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1764,6 +1764,17 @@ def test_apijson_permission():
17641764
>>> print(d)
17651765
{'code': 200, 'msg': 'success', 'comment2': {'user_id': 2, 'to_id': 3, 'moment_id': 1, 'date': '2018-12-01 00:00:00', 'content': 'comment from usera to userb', 'id': 2}}
17661766
1767+
>>> #apijson get, query array
1768+
>>> data ='''{
1769+
... "[]":{
1770+
... "comment2": {"@role":"ADMIN"}
1771+
... }
1772+
... }'''
1773+
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
1774+
>>> d = json_loads(r.data)
1775+
>>> print(d)
1776+
{'code': 200, 'msg': 'success', '[]': [{'comment2': {'user_id': 1, 'to_id': 3, 'moment_id': 1, 'date': '2018-11-01 00:00:00', 'content': 'comment from admin', 'id': 1}}, {'comment2': {'user_id': 2, 'to_id': 3, 'moment_id': 1, 'date': '2018-12-01 00:00:00', 'content': 'comment from usera to userb', 'id': 2}}, {'comment2': {'user_id': 3, 'to_id': 2, 'moment_id': 2, 'date': '2018-12-02 00:00:00', 'content': 'comment from userb to usera', 'id': 3}}, {'comment2': {'user_id': 4, 'to_id': 2, 'moment_id': 3, 'date': '2018-12-09 00:00:00', 'content': 'comment from userc to usera', 'id': 4}}]}
1777+
17671778
>>> #apijson head
17681779
>>> data ='''{
17691780
... "comment2": {

uliweb_apijson/apijson/__init__.py

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -88,23 +88,39 @@ def _check_GET_permission(self):
8888

8989
roles = GET.get("roles")
9090
params_role = self.params.get("@role")
91-
92-
if not params_role:
93-
if hasattr(request,"user"):
94-
params_role = "LOGIN"
91+
user = getattr(request, "user", None)
92+
93+
if roles:
94+
if not params_role:
95+
if user:
96+
params_role = "LOGIN"
97+
else:
98+
params_role = "UNKNOWN"
99+
elif params_role != "UNKNOWN":
100+
if not user:
101+
raise UliwebError("no login user for role '%s'" % (params_role))
102+
if params_role not in roles:
103+
raise UliwebError("'%s' not accessible by role '%s'" % (self.name, params_role))
104+
if params_role == "UNKNOWN":
105+
self.permission_check_ok = True
106+
elif functions.has_role(user, params_role):
107+
self.permission_check_ok = True
95108
else:
96-
params_role = "UNKNOWN"
97-
elif params_role != "UNKNOWN":
98-
if not hasattr(request,"user"):
99-
raise UliwebError("no login user for role '%s'"%(params_role))
100-
if params_role not in roles:
101-
raise UliwebError("'%s' not accessible by role '%s'"%(self.name,params_role))
102-
if params_role == "UNKNOWN":
103-
self.permission_check_ok = True
104-
elif functions.has_role(request.user,params_role):
105-
self.permission_check_ok = True
106-
else:
107-
raise UliwebError("user doesn't have role '%s'"%(params_role))
109+
raise UliwebError("user doesn't have role '%s'" % (params_role))
110+
if not self.permission_check_ok:
111+
perms = GET.get("permissions")
112+
if perms:
113+
if params_role:
114+
role, msg = functions.has_permission_as_role(user, params_role, *perms)
115+
if role:
116+
self.permission_check_ok = True
117+
else:
118+
role = functions.has_permission(user, *perms)
119+
if role:
120+
role_name = getattr(role, "name")
121+
if role_name:
122+
self.permission_check_ok = True
123+
params_role = role_name
108124

109125
if not self.permission_check_ok:
110126
raise UliwebError("no permission")

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy