Skip to content

Commit e4a8bb2

Browse files
Formatted Code
1 parent 37d5c14 commit e4a8bb2

File tree

16 files changed

+530
-71
lines changed

16 files changed

+530
-71
lines changed

config/database.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from masonite.environment import LoadEnvironment, env
2+
from masoniteorm.connections import ConnectionResolver
3+
4+
# Loads in the environment variables when this page is imported.
5+
LoadEnvironment()
6+
7+
"""
8+
The connections here don't determine the database but determine the "connection".
9+
They can be named whatever you want.
10+
"""
11+
DATABASES = {
12+
"default": env("DB_CONNECTION", "sqlite"),
13+
"sqlite": {
14+
"driver": "sqlite",
15+
"database": env("SQLITE_DB_DATABASE", "masonite.sqlite3"),
16+
"prefix": "",
17+
"log_queries": env("DB_LOG"),
18+
},
19+
"mysql": {
20+
"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"),
26+
"prefix": "",
27+
"grammar": "mysql",
28+
"options": {
29+
"charset": "utf8mb4",
30+
},
31+
"log_queries": env("DB_LOG"),
32+
},
33+
"postgres": {
34+
"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"),
40+
"prefix": "",
41+
"grammar": "postgres",
42+
"log_queries": env("DB_LOG"),
43+
},
44+
"mssql": {
45+
"driver": "mssql",
46+
"host": env("MSSQL_DATABASE_HOST"),
47+
"user": env("MSSQL_DATABASE_USER"),
48+
"password": env("MSSQL_DATABASE_PASSWORD"),
49+
"database": env("MSSQL_DATABASE_DATABASE"),
50+
"port": env("MSSQL_DATABASE_PORT"),
51+
"prefix": "",
52+
"log_queries": env("DB_LOG"),
53+
},
54+
}
55+
56+
DB = ConnectionResolver().set_connection_details(DATABASES)

config renamed to config_

File renamed without changes.

masonite.sqlite3

8 KB
Binary file not shown.

requirements.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
masonite>=4,<5
22
masonite-orm>=2,<3
3+
flake8==4.0.1
4+
pyflakes==2.4.0
5+
black==22.3.0

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.5",
11+
version="0.1.6",
1212
packages=[
1313
"masonite_permission",
1414
"masonite_permission.config",

src/masonite_permission/migrations/create_permissions_table.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ def up(self):
88
with self.schema.create("roles") as table:
99
table.increments("id")
1010
table.string("name").nullable()
11-
table.string("slug")
11+
table.string("slug").unique()
1212
table.timestamps()
1313

1414
with self.schema.create("permissions") as table:
1515
table.increments("id")
1616
table.string("name").nullable()
17-
table.string("slug")
17+
table.string("slug").unique()
1818
table.timestamps()
1919

2020
# user, role, permission polymorphic relationship
@@ -37,6 +37,6 @@ def down(self):
3737
"""Revert the migrations."""
3838

3939
self.schema.drop("role_user")
40-
self.schema.drop("permission_role")
40+
self.schema.drop("model_has_permissions")
4141
self.schema.drop("permissions")
4242
self.schema.drop("roles")

src/masonite_permission/mixins/has_permissions.py

Lines changed: 53 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,22 @@ def attach_permission(self, permission):
3838
"""
3939
from ..models.permission import Permission
4040

41-
if isinstance(permission, int) or isinstance(permission, str):
42-
permission = Permission.find(int(permission))
41+
if isinstance(permission, int):
42+
permission = Permission.find(permission)
43+
if not permission:
44+
raise PermissionException(f"Permission: with id {permission} does not exist!")
45+
46+
elif isinstance(permission, str):
47+
permission = Permission.where("slug", permission).first()
48+
if not permission:
49+
raise PermissionException(f"Permission: {permission} does not exist!")
4350

4451
exists = (
4552
QueryBuilder()
46-
.table("permission_role")
47-
.where("role_id", self.id)
53+
.table("model_has_permissions")
54+
.where("permissionable_id", self.id)
4855
.where("permission_id", permission.id)
56+
.where("permissionable_type", self.get_table_name())
4957
.count()
5058
)
5159

@@ -60,15 +68,22 @@ def detach_permission(self, permission):
6068
"""
6169
from ..models.permission import Permission
6270

63-
permission = Permission.where_slug(permission).first()
64-
if not permission:
65-
raise PermissionException(f"Permission: {permission} does not exist!")
71+
if isinstance(permission, int):
72+
permission = Permission.find(permission)
73+
if not permission:
74+
raise PermissionException(f"Permission: with id {permission} does not exist!")
75+
76+
elif isinstance(permission, str):
77+
permission = Permission.where("slug", permission).first()
78+
if not permission:
79+
raise PermissionException(f"Permission: {permission} does not exist!")
6680

6781
exists = (
6882
QueryBuilder()
69-
.table("permission_role")
70-
.where("role_id", self.id)
83+
.table("model_has_permissions")
84+
.where("permissionable_id", self.id)
7185
.where("permission_id", permission.id)
86+
.where("permissionable_type", self.get_table_name())
7287
.count()
7388
)
7489

@@ -126,31 +141,50 @@ def sync_permissions(self, *args):
126141
"""Sync permissions from related model"""
127142
from ..models.permission import Permission
128143

144+
permission_ids = []
145+
permission_slugs = []
146+
found_ids = []
147+
148+
if len(args) == 0:
149+
QueryBuilder().table("model_has_permissions").where(
150+
"permissionable_id", self.id
151+
).where("permissionable_type", self.get_table_name()).delete()
152+
return
153+
129154
if type(args[0]) == list:
130155
args = args[0]
131156

132-
permissions = Permission.where_in("slug", args).get()
133-
slugs = permissions.pluck("slug")
134-
diff = set(args) - set(slugs)
135-
if len(diff) > 0:
136-
diff_permissions = ", ".join(list(diff))
137-
raise PermissionException(f"Permission: {diff_permissions} does not exist!")
157+
for permission in args:
158+
if isinstance(permission, int):
159+
permission_ids.append(permission)
160+
elif isinstance(permission, str):
161+
permission_slugs.append(permission)
162+
elif isinstance(permission, Permission):
163+
found_ids.append(permission.id)
164+
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"))
167+
168+
ids = list(dict.fromkeys(found_ids + permission_by_id + permission_by_slug))
138169

139170
data = []
140-
for permission in permissions:
171+
for permission in ids:
141172
data.append(
142173
{
143-
"permission_id": permission.id,
174+
"permission_id": permission,
144175
"permissionable_id": self.id,
145176
"permissionable_type": self.get_table_name(),
146177
}
147178
)
148179

149-
QueryBuilder().table("model_has_permissions").where("permissionable_id", self.id).where(
180+
query = QueryBuilder().table("model_has_permissions")
181+
182+
query.where("permissionable_id", self.id).where(
150183
"permissionable_type", self.get_table_name()
151184
).delete()
185+
152186
if len(data) > 0:
153-
QueryBuilder().table("model_has_permissions").bulk_create(data)
187+
query.bulk_create(data)
154188

155189
def has_permission_to(self, permission):
156190
if type(permission) != str:

src/masonite_permission/mixins/has_roles.py

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from masoniteorm.query import QueryBuilder
2-
from masoniteorm.collection.Collection import Collection
32

43
from ..exceptions import PermissionException
54

@@ -49,20 +48,44 @@ def has_all_roles(self, *args):
4948

5049
return set(slugs).issubset(roles) and len(set(slugs) - set(roles)) == 0
5150

52-
def sync_roles(self, roles):
51+
def sync_roles(self, *args):
5352
"""Assign a role to a user"""
5453
from ..models.role import Role
5554

56-
if type(roles) != Collection and type(roles) != list:
57-
raise PermissionException("roles must be a collection of roles or list of role ids!")
55+
role_ids = []
56+
role_slugs = []
57+
found_ids = []
5858

59-
if len(roles) != 0:
60-
role = roles[0]
61-
if isinstance(role, int) or isinstance(role, str):
62-
roles = Role.where_in("id", roles).get()
59+
if len(args) == 0:
60+
QueryBuilder().table("role_user").where("user_id", self.id).delete()
61+
return
6362

64-
QueryBuilder().table("role_user").where("user_id", self.id).delete()
65-
self.save_many("roles", roles)
63+
if type(args[0]) == list:
64+
args = args[0]
65+
66+
for role in args:
67+
if isinstance(role, int):
68+
role_ids.append(role)
69+
elif isinstance(role, str):
70+
role_slugs.append(role)
71+
elif isinstance(role, Role):
72+
found_ids.append(role.id)
73+
74+
role_by_id = list(Role.where_in("id", role_ids).get().pluck("id"))
75+
role_by_slug = list(Role.where_in("slug", role_slugs).get().pluck("id"))
76+
77+
ids = list(dict.fromkeys(found_ids + role_by_id + role_by_slug))
78+
79+
data = []
80+
for role in ids:
81+
data.append({"user_id": self.id, "role_id": role})
82+
83+
query = QueryBuilder().table("role_user")
84+
85+
query.where("user_id", self.id).delete()
86+
87+
if len(data) > 0:
88+
query.bulk_create(data)
6689

6790
def assign_role(self, role):
6891
"""Assign a role to a user

src/masonite_permission/models/permission.py

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,32 +26,48 @@ def sync_roles(self, *args):
2626
"""Sync roles from related model"""
2727
from ..models.role import Role
2828

29+
role_ids = []
30+
role_slugs = []
31+
found_ids = []
32+
33+
if len(args) == 0:
34+
QueryBuilder().table("model_has_permissions").where(
35+
"permissionable_type", "roles"
36+
).where("permission_id", self.id).delete()
37+
return
38+
2939
if type(args[0]) == list:
3040
args = args[0]
3141

32-
roles = Role.where_in("slug", args).get()
33-
slugs = roles.pluck("slug")
34-
diff = set(args) - set(slugs)
42+
for role in args:
43+
if isinstance(role, int):
44+
role_ids.append(role)
45+
elif isinstance(role, str):
46+
role_slugs.append(role)
47+
elif isinstance(role, Role):
48+
found_ids.append(role.id)
3549

36-
if len(diff) > 0:
37-
diff_roles = ", ".join(list(diff))
38-
raise PermissionException(f"Role: {diff_roles} does not exist!")
50+
role_by_id = list(Role.where_in("id", role_ids).get().pluck("id"))
51+
role_by_slug = list(Role.where_in("slug", role_slugs).get().pluck("id"))
52+
53+
ids = list(dict.fromkeys(found_ids + role_by_id + role_by_slug))
3954

4055
data = []
41-
for role in roles:
56+
for role in ids:
4257
data.append(
4358
{
4459
"permission_id": self.id,
45-
"permissionable_id": role.id,
60+
"permissionable_id": role,
4661
"permissionable_type": "roles",
4762
}
4863
)
4964

50-
QueryBuilder().table("model_has_permissions").where("permissionable_type", "roles").where(
51-
"permission_id", self.id
52-
).delete()
65+
query = QueryBuilder().table("model_has_permissions")
66+
67+
query.where("permissionable_type", "roles").where("permission_id", self.id).delete()
68+
5369
if len(data) > 0:
54-
QueryBuilder().table("model_has_permissions").bulk_create(data)
70+
query.bulk_create(data)
5571

5672
def attach_role(self, role):
5773
"""Assign a role to a role
@@ -65,6 +81,10 @@ def attach_role(self, role):
6581
role = Role.where("slug", role).first()
6682
if not role:
6783
raise PermissionException(f"Role: {role} does not exist!")
84+
elif type(role) == int:
85+
role = Role.find(role)
86+
if not role:
87+
raise PermissionException(f"Role: with id {role} does not exist!")
6888

6989
exists = (
7090
QueryBuilder()
@@ -96,6 +116,10 @@ def detach_role(self, role):
96116
role = Role.where("slug", role).first()
97117
if not role:
98118
raise PermissionException(f"Role: {role} does not exist!")
119+
elif type(role) == int:
120+
role = Role.find(role)
121+
if not role:
122+
raise PermissionException(f"Role: with id {role} does not exist!")
99123

100124
exists = (
101125
QueryBuilder()

0 commit comments

Comments
 (0)