Skip to content

Commit ba528f0

Browse files
Refactored Query
1 parent f2beb96 commit ba528f0

File tree

9 files changed

+97
-68
lines changed

9 files changed

+97
-68
lines changed

README.md

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222

2323
Associate users with roles and permissions to control access to your application.
2424

25-
> Note: Give a try and let me know :).
26-
2725
## Getting Started
2826

2927
Install the package using pip:
@@ -353,14 +351,6 @@ Checking if user can do all of the {permissions}
353351

354352
Please read the [Contributing Documentation](CONTRIBUTING.md) here.
355353

356-
## Maintainers
357-
358-
- [Yubaraj Shrestha](https://www.github.com/yubarajshrestha)
359-
360354
## License
361355

362356
Masonite Permission is open-sourced software licensed under the [MIT license](LICENSE).
363-
364-
```
365-
366-
```

masonite.sqlite3

-56 KB
Binary file not shown.

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
# Versions should comply with PEP440. For a discussion on single-sourcing
99
# the version across setup.py and the project code, see
1010
# https://packaging.python.org/en/latest/single_source_version.html
11-
version="0.1.6",
11+
version="0.1.7",
1212
packages=[
1313
"masonite_permission",
1414
"masonite_permission.config",

src/masonite_permission/mixins/has_permissions.py

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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

tests/integrations/app/controllers/WelcomeController.py

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from src.masonite_permission.models.permission import Permission
66
from src.masonite_permission.models.role import Role
77
from tests.integrations.app.models.User import User
8+
from masoniteorm.expressions import JoinClause
9+
from masoniteorm.query import QueryBuilder
810

911

1012
class WelcomeController(Controller):
@@ -18,13 +20,61 @@ def show(self, view: View):
1820
return view.render("welcome", {"user": user})
1921

2022
def test(self):
23+
user = User.first()
24+
role = Role.first()
25+
26+
# user.sync_permissions(["create-post", "edit-user"])
27+
# role.sync_permissions(["create-user", "edit-user", "delete-user"])
28+
29+
return user.permissions()
30+
31+
# user_two = User.create(
32+
# {
33+
# "name": "John",
34+
# "email": "john@example.com",
35+
# "password": "OK",
36+
# "phone": "+123456789",
37+
# }
38+
# )
39+
40+
# user_two.sync_permissions("delete-user")
41+
42+
return (
43+
QueryBuilder().table("permissions").select_raw("permissions.id, permissions.name").where_in("id", lambda q: (
44+
q.table("model_has_permissions")
45+
.select("model_has_permissions.permission_id")
46+
.where_raw(f"""
47+
(model_has_permissions.permissionable_type = 'users' and model_has_permissions.permissionable_id = {user.id})
48+
or
49+
(model_has_permissions.permissionable_type = 'roles' and model_has_permissions.permissionable_id in (
50+
select role_user.role_id from role_user where role_user.user_id = {user.id}
51+
))
52+
""")
53+
)).get()
54+
)
55+
56+
return (
57+
QueryBuilder().table("permissions")
58+
.select_raw("permissions.id, permissions.name, permissions.slug, users.id")
59+
.join(pivot_query)
60+
.join(role_permission_query)
61+
.join(user_permission_query)
62+
.group_by("permissions.id, users.id")
63+
.where("users.id", 1)
64+
.get()
65+
)
66+
67+
user = User.first()
68+
admin = Role.where("slug", "admin").first()
69+
70+
71+
user.attach_permission("edit-user")
2172

22-
permission = Permission.where("slug", "create-user").first()
73+
admin.sync_permissions(["create-post", "edit-post", "delete-post"])
2374

24-
permission.sync_roles(["admin", "editor", 3])
75+
user.sync_roles(['admin', 'editor'])
2576

26-
permission.detach_role("admin")
27-
permission.attach_role("admin")
77+
return user.permissions()
2878

2979
return {
3080
"roles": permission.roles().serialize(),

tests/integrations/config/database.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,20 @@
99
They can be named whatever you want.
1010
"""
1111
DATABASES = {
12-
"default": env("DB_CONNECTION", "sqlite"),
12+
"default": env("DB_CONNECTION", "postgres"),
1313
"sqlite": {
1414
"driver": "sqlite",
1515
"database": env("SQLITE_DB_DATABASE", "masonite.sqlite3"),
1616
"prefix": "",
1717
"log_queries": env("DB_LOG"),
1818
},
1919
"mysql": {
20+
"host": "127.0.0.1",
2021
"driver": "mysql",
21-
"host": env("DB_HOST"),
22-
"user": env("DB_USERNAME"),
23-
"password": env("DB_PASSWORD"),
24-
"database": env("DB_DATABASE"),
25-
"port": env("DB_PORT"),
22+
"database": "masonite_permission",
23+
"user": "meyubaraj",
24+
"password": "MDB@123#go",
25+
"port": 3306,
2626
"prefix": "",
2727
"grammar": "mysql",
2828
"options": {
@@ -31,12 +31,12 @@
3131
"log_queries": env("DB_LOG"),
3232
},
3333
"postgres": {
34+
"host": "127.0.0.1",
3435
"driver": "postgres",
35-
"host": env("DB_HOST"),
36-
"user": env("DB_USERNAME"),
37-
"password": env("DB_PASSWORD"),
38-
"database": env("DB_DATABASE"),
39-
"port": env("DB_PORT"),
36+
"database": "masonite_permission",
37+
"user": "meyubaraj",
38+
"password": "MDB@123#go",
39+
"port": 5432,
4040
"prefix": "",
4141
"grammar": "postgres",
4242
"log_queries": env("DB_LOG"),

tests/unit/test_permission.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
class TestPermission(TestCase):
77
@classmethod
88
def setUpClass(cls):
9-
QueryBuilder().table("permissions").truncate()
9+
QueryBuilder().table("permissions").truncate(True)
1010

1111
def setUp(self):
1212
super().setUp()
@@ -19,7 +19,8 @@ def setUp(self):
1919

2020
def tearDown(self):
2121
super().tearDown()
22-
QueryBuilder().table("permissions").truncate()
22+
QueryBuilder().table("permissions").truncate(True)
23+
QueryBuilder().table("roles").truncate(True)
2324

2425
def test_permission_created(self):
2526
permission = Permission.first()

tests/unit/test_role.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
class TestRole(TestCase):
77
@classmethod
88
def setUpClass(cls):
9-
QueryBuilder().table("roles").truncate()
9+
QueryBuilder().table("roles").truncate(True)
1010

1111
def setUp(self):
1212
super().setUp()
@@ -19,7 +19,7 @@ def setUp(self):
1919

2020
def tearDown(self):
2121
super().tearDown()
22-
QueryBuilder().table("roles").truncate()
22+
QueryBuilder().table("roles").truncate(True)
2323

2424
def test_role_created(self):
2525
role = Role.first()

tests/unit/test_user.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
class TestUser(TestCase):
1010
@classmethod
1111
def setUpClass(cls):
12-
QueryBuilder().table("users").truncate()
13-
QueryBuilder().table("roles").truncate()
14-
QueryBuilder().table("permissions").truncate()
12+
QueryBuilder().table("users").truncate(True)
13+
QueryBuilder().table("roles").truncate(True)
14+
QueryBuilder().table("permissions").truncate(True)
1515

1616
def setUp(self):
1717
super().setUp()
@@ -26,9 +26,9 @@ def setUp(self):
2626

2727
def tearDown(self):
2828
super().tearDown()
29-
QueryBuilder().table("users").truncate()
30-
QueryBuilder().table("roles").truncate()
31-
QueryBuilder().table("permissions").truncate()
29+
QueryBuilder().table("users").truncate(True)
30+
QueryBuilder().table("roles").truncate(True)
31+
QueryBuilder().table("permissions").truncate(True)
3232

3333
def test_user_has_roles(self):
3434
role = Role.create(

0 commit comments

Comments
 (0)