@@ -7,28 +7,19 @@ class HasPermissions:
77 def permissions (self ):
88 from ..models .permission import Permission
99
10- table = self .get_table_name ()
11-
12- direct_permissions = (
13- Permission .join (
14- "model_has_permissions as mhp" , "mhp.permission_id" , "=" , "permissions.id"
15- )
16- .where ("mhp.permissionable_id" , self .id )
17- .where ("mhp.permissionable_type" , table )
18- .select_raw ("permissions.*" )
19- .get ()
20- )
21-
22- indirect_permissions = (
23- Permission .join (
24- "model_has_permissions as mhp" , "mhp.permission_id" , "=" , "permissions.id"
25- )
26- .where_in ("mhp.permissionable_id" , self .roles ().pluck ("id" ))
27- .where ("mhp.permissionable_type" , "roles" )
28- .select_raw ("permissions.*" )
29- .get ()
10+ return (
11+ Permission .where_in ("id" , lambda q : (
12+ q .table ("model_has_permissions" )
13+ .select ("model_has_permissions.permission_id" )
14+ .where_raw (f"""
15+ (model_has_permissions.permissionable_type = 'users' and model_has_permissions.permissionable_id = { self .id } )
16+ or
17+ (model_has_permissions.permissionable_type = 'roles' and model_has_permissions.permissionable_id in (
18+ select role_user.role_id from role_user where role_user.user_id = { self .id }
19+ ))
20+ """ )
21+ )).get ()
3022 )
31- return Collection (list (direct_permissions ) + list (indirect_permissions )).unique ("slug" )
3223
3324 def attach_permission (self , permission ):
3425 """Assign a permission to a role
@@ -143,7 +134,6 @@ def sync_permissions(self, *args):
143134
144135 permission_ids = []
145136 permission_slugs = []
146- found_ids = []
147137
148138 if len (args ) == 0 :
149139 QueryBuilder ().table ("model_has_permissions" ).where (
@@ -160,12 +150,16 @@ def sync_permissions(self, *args):
160150 elif isinstance (permission , str ):
161151 permission_slugs .append (permission )
162152 elif isinstance (permission , Permission ):
163- found_ids .append (permission .id )
153+ permission_ids .append (permission .id )
164154
165- permission_by_id = list (Permission .where_in ("id" , permission_ids ).get ().pluck ("id" ))
166- permission_by_slug = list (Permission .where_in ("slug" , permission_slugs ).get ().pluck ("id" ))
155+ ids = []
167156
168- ids = list (dict .fromkeys (found_ids + permission_by_id + permission_by_slug ))
157+ if len (permission_ids ) > 0 and len (permission_slugs ) > 0 :
158+ ids = Permission .where_raw (f"(id in { permission_ids } ) or slug in { permission_slugs } " ).get ().pluck ("id" )
159+ elif len (permission_ids ) > 0 :
160+ ids = list (Permission .where_in ("id" , permission_ids ).get ().pluck ("id" ))
161+ elif len (permission_slugs ) > 0 :
162+ ids = list (Permission .where_in ("slug" , permission_slugs ).get ().pluck ("id" ))
169163
170164 data = []
171165 for permission in ids :
@@ -203,12 +197,6 @@ def has_any_permission(self, *args):
203197
204198 permissions = self .permissions ().pluck ("slug" )
205199
206- # get items that are not in the permissions
207- # permissions_diff = set(slugs) - set(permissions)
208- # if len(permissions_diff) > 0:
209- # diff_permissions = ", ".join(list(permissions_diff))
210- # raise PermissionException(f"Permission: {diff_permissions} does not exist!")
211-
212200 result = set (slugs ).intersection (permissions )
213201
214202 return len (result ) > 0
0 commit comments