@@ -10,13 +10,14 @@ class HasRoles:
1010 def roles (self ):
1111 """User can have multiple roles"""
1212 from ..models .role import Role
13+
1314 return Role
14-
15+
1516 def permissions (self ):
1617 """User can have multiple permissions"""
1718 from ..models .permission import Permission
18-
19- roles = self .roles .pluck ('id' )
19+
20+ roles = self .roles .pluck ("id" )
2021 return (
2122 Permission .join ("permission_role as pr" , "pr.permission_id" , "=" , "id" )
2223 .where_in ("pr.role_id" , roles )
@@ -71,7 +72,7 @@ def sync_roles(self, roles):
7172 QueryBuilder ().table ("role_user" ).where ("user_id" , self .id ).delete ()
7273 self .save_many ("roles" , roles )
7374
74- def attach_role (self , role ):
75+ def assign_role (self , role ):
7576 """Assign a role to a user
7677
7778 Arguments:
@@ -93,7 +94,7 @@ def attach_role(self, role):
9394 if not exists :
9495 self .attach ("roles" , role )
9596
96- def detatch_role (self , role ):
97+ def remove_role (self , role ):
9798 """Detach a role from a user
9899
99100 Arguments:
@@ -113,4 +114,82 @@ def detatch_role(self, role):
113114 )
114115
115116 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