-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathseed.py
More file actions
134 lines (118 loc) · 4.1 KB
/
Copy pathseed.py
File metadata and controls
134 lines (118 loc) · 4.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
from __future__ import annotations
from flask import Flask, current_app, has_app_context
from app import create_app
from app.db import db
from app.models import Permission, Resource, Role, User, UserRole
from app.security import hash_password, verify_password
def get_or_create(model, defaults: dict | None = None, **filters):
instance = model.query.filter_by(**filters).first()
if instance:
return instance
params = {**filters, **(defaults or {})}
instance = model(**params)
db.session.add(instance)
return instance
def ensure_seed_password(user: User, password: str) -> None:
if not verify_password(password, user.password_hash):
user.password_hash = hash_password(password)
def seed(app: Flask | None = None) -> None:
app = app or (current_app._get_current_object() if has_app_context() else create_app())
with app.app_context():
db.create_all()
admin = get_or_create(
Role,
code="admin",
defaults={
"name": "Administrator",
"description": "Can manage users and access rules",
},
)
manager = get_or_create(
Role,
code="manager",
defaults={"name": "Manager", "description": "Can read and change business data"},
)
user_role = get_or_create(
Role,
code="user",
defaults={"name": "User", "description": "Can read public business data"},
)
projects = get_or_create(
Resource,
code="projects",
defaults={"name": "Projects", "description": "Mock project list"},
)
reports = get_or_create(
Resource,
code="reports",
defaults={"name": "Reports", "description": "Mock report list"},
)
access_rules = get_or_create(
Resource,
code="access_rules",
defaults={
"name": "Access rules",
"description": "Roles, resources and permissions management",
},
)
for role, resource, action in [
(user_role, projects, "read"),
(manager, projects, "read"),
(manager, projects, "write"),
(manager, reports, "read"),
(admin, projects, "read"),
(admin, projects, "write"),
(admin, reports, "read"),
(admin, reports, "write"),
(admin, access_rules, "manage"),
]:
get_or_create(
Permission,
role_id=role.id,
resource_id=resource.id,
action=action,
defaults={"is_allowed": True},
)
admin_user = get_or_create(
User,
email="admin@example.com",
defaults={
"password_hash": hash_password("Admin12345"),
"first_name": "Alice",
"last_name": "Admin",
"middle_name": None,
},
)
manager_user = get_or_create(
User,
email="manager@example.com",
defaults={
"password_hash": hash_password("Manager12345"),
"first_name": "Mark",
"last_name": "Manager",
"middle_name": None,
},
)
regular_user = get_or_create(
User,
email="user@example.com",
defaults={
"password_hash": hash_password("User12345"),
"first_name": "Uma",
"last_name": "User",
"middle_name": None,
},
)
ensure_seed_password(admin_user, "Admin12345")
ensure_seed_password(manager_user, "Manager12345")
ensure_seed_password(regular_user, "User12345")
for user, role in [
(admin_user, admin),
(manager_user, manager),
(regular_user, user_role),
]:
get_or_create(UserRole, user_id=user.id, role_id=role.id)
db.session.commit()
if __name__ == "__main__":
seed()
print("Database seeded")