@@ -10,13 +10,14 @@ class HasRoles:
10
10
def roles (self ):
11
11
"""User can have multiple roles"""
12
12
from ..models .role import Role
13
+
13
14
return Role
14
-
15
+
15
16
def permissions (self ):
16
17
"""User can have multiple permissions"""
17
18
from ..models .permission import Permission
18
-
19
- roles = self .roles .pluck ('id' )
19
+
20
+ roles = self .roles .pluck ("id" )
20
21
return (
21
22
Permission .join ("permission_role as pr" , "pr.permission_id" , "=" , "id" )
22
23
.where_in ("pr.role_id" , roles )
@@ -71,7 +72,7 @@ def sync_roles(self, roles):
71
72
QueryBuilder ().table ("role_user" ).where ("user_id" , self .id ).delete ()
72
73
self .save_many ("roles" , roles )
73
74
74
- def attach_role (self , role ):
75
+ def assign_role (self , role ):
75
76
"""Assign a role to a user
76
77
77
78
Arguments:
@@ -93,7 +94,7 @@ def attach_role(self, role):
93
94
if not exists :
94
95
self .attach ("roles" , role )
95
96
96
- def detatch_role (self , role ):
97
+ def remove_role (self , role ):
97
98
"""Detach a role from a user
98
99
99
100
Arguments:
@@ -113,4 +114,82 @@ def detatch_role(self, role):
113
114
)
114
115
115
116
if exists :
116
- self .detach ("roles" , role )
117
+ self .detach ("roles" , role )
118
+
119
+ def has_permission (self , permission ):
120
+ """Check if user has a permission"""
121
+ if type (permission ) != str :
122
+ raise PermissionException ("permission must be a string!" )
123
+
124
+ return self .permissions ().pluck ("slug" ).contains (permission )
125
+
126
+ def has_any_permission (self , permissions ):
127
+ """Check if user has any of the permissions"""
128
+ from ..models .permission import Permission
129
+
130
+ if type (permissions ) != Collection and type (permissions ) != list :
131
+ raise PermissionException (
132
+ "argument must be a collection of permissions or list of permission ids!"
133
+ )
134
+
135
+ if len (permissions ) != 0 :
136
+ permission = permissions [0 ]
137
+ if isinstance (permission , str ):
138
+ permissions = Permission .where_in ("slug" , permissions ).get ().pluck ("slug" )
139
+
140
+ slugs = set (self .permissions ().pluck ("slug" ))
141
+
142
+ return len (slugs .intersection (permissions )) > 0
143
+
144
+ def has_all_permissions (self , permissions ):
145
+ """Check if user has all of the permissions"""
146
+
147
+ if permissions is None or len (permissions ) == 0 or type (permissions ) != list :
148
+ raise PermissionException ("permissions must be list of permission slugs!" )
149
+
150
+ slugs = self .permissions ().pluck ("slug" )
151
+ return set (permissions ).issubset (slugs ) and len (set (permissions ) - set (slugs )) == 0
152
+
153
+ def can_ (self , permissions ):
154
+ """Check if user has a permission"""
155
+ if type (permissions ) != str :
156
+ raise PermissionException ("permission must be a string!" )
157
+
158
+ action = "all" # can be all or any
159
+
160
+ # check if permissions contains a comma
161
+ if "," in permissions :
162
+ permissions = permissions .split ("," )
163
+ elif "|" in permissions :
164
+ action = "any"
165
+ permissions = permissions .split ("|" )
166
+ else :
167
+ permissions = [permissions ]
168
+
169
+ if action == "all" :
170
+ return self .has_all_permissions (permissions )
171
+
172
+ if action == "any" :
173
+ return self .has_any_permission (permissions )
174
+
175
+ def is_ (self , roles ):
176
+ """Check if user has a role"""
177
+ if type (roles ) != str :
178
+ raise PermissionException ("role must be a string!" )
179
+
180
+ action = "all" # can be all or any
181
+
182
+ # check if permissions contains a comma
183
+ if "," in roles :
184
+ roles = roles .split ("," )
185
+ elif "|" in roles :
186
+ action = "any"
187
+ roles = roles .split ("|" )
188
+ else :
189
+ roles = [roles ]
190
+
191
+ if action == "all" :
192
+ return self .has_all_roles (roles )
193
+
194
+ if action == "any" :
195
+ return self .has_any_role (roles )
0 commit comments