fastapi-rtk 1.0.9__tar.gz → 1.0.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/PKG-INFO +1 -1
- fastapi_rtk-1.0.10/fastapi_rtk/_version.py +1 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/commands/security.py +6 -6
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/db.py +1 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/dependencies.py +8 -8
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/fastapi_react_toolkit.py +18 -14
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/security/sqla/apis.py +2 -2
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/security/sqla/models.py +6 -2
- fastapi_rtk-1.0.9/fastapi_rtk/_version.py +0 -1
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/.gitignore +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/LICENSE +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/README.md +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/api/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/api/base_api.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/api/model_rest_api.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/apis.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/auth/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/auth/auth.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/auth/hashers/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/auth/hashers/pbkdf2.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/auth/hashers/scrypt.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/auth/hashers/utils.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/auth/password_helpers/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/auth/password_helpers/fab.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/auth/strategies/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/auth/strategies/config.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/auth/strategies/db.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/auth/strategies/jwt.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/generic/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/generic/column.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/generic/db.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/generic/exceptions.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/generic/filters.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/generic/interface.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/generic/model.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/generic/session.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/column.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/db.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/exceptions.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/extensions/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/extensions/audit/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/extensions/audit/audit.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/extensions/audit/types.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/filters.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/geometry_converter.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/filters.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/interface.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/model.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/session.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/bases/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/bases/db.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/bases/file_manager.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/bases/filter.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/bases/interface.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/bases/model.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/bases/session.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/cli.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/commands/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/commands/db/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/commands/db/templates/fastapi/README +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/commands/db/templates/fastapi/alembic.ini.mako +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/commands/db/templates/fastapi/env.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/commands/db/templates/fastapi/script.py.mako +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/README +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/alembic.ini.mako +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/env.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/script.py.mako +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/commands/export.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/commands/translate.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/const.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/decorators.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/types.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/utils.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/config.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/const.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/decorators.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/exceptions.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/file_managers/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/file_managers/file_manager.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/file_managers/image_manager.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/file_managers/s3_file_manager.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/file_managers/s3_image_manager.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/filters.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/globals.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/lang/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/lang/babel/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/lang/babel/cli.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/lang/babel/config.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/lang/babel.cfg +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/lang/lazy_text.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/lang/messages.pot +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.mo +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.po +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.mo +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.po +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/manager.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/middlewares.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/mixins.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/models.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/routers.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/schemas.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/security/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/security/sqla/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/security/sqla/security_manager.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/setting.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/types.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/__init__.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/async_task_runner.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/class_factory.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/csv_json_converter.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/deep_merge.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/extender_mixin.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/flask_appbuilder_utils.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/hooks.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/lazy.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/merge_schema.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/multiple_async_contexts.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/prettify_dict.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/pydantic.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/run_utils.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/self_dependencies.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/smartdefaultdict.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/sqla.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/timezone.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/update_signature.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/use_default_when_none.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/utils/werkzeug.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/version.py +0 -0
- {fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/pyproject.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fastapi-rtk
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.10
|
|
4
4
|
Summary: A package that provides a set of tools to build a FastAPI application with a Class-Based CRUD API.
|
|
5
5
|
Project-URL: Homepage, https://codeberg.org/datatactics/fastapi-rtk
|
|
6
6
|
Project-URL: Issues, https://codeberg.org/datatactics/fastapi-rtk/issues
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.0.10"
|
|
@@ -238,7 +238,7 @@ async def _check_roles(name: str, create: bool = False):
|
|
|
238
238
|
if not role:
|
|
239
239
|
if not create:
|
|
240
240
|
raise Exception(f"Role {name} does not exist")
|
|
241
|
-
await g.current_app.
|
|
241
|
+
await g.current_app.sm.create_role(name=name, session=session)
|
|
242
242
|
|
|
243
243
|
|
|
244
244
|
async def _create_user(
|
|
@@ -255,7 +255,7 @@ async def _create_user(
|
|
|
255
255
|
"""
|
|
256
256
|
if role:
|
|
257
257
|
await _check_roles(role, create=create_role)
|
|
258
|
-
return await g.current_app.
|
|
258
|
+
return await g.current_app.sm.create_user(
|
|
259
259
|
email=email,
|
|
260
260
|
username=username,
|
|
261
261
|
password=password,
|
|
@@ -269,8 +269,8 @@ async def _reset_password(email_or_username: str, password: str):
|
|
|
269
269
|
"""
|
|
270
270
|
Reset user password.
|
|
271
271
|
"""
|
|
272
|
-
user = await g.current_app.
|
|
273
|
-
return await g.current_app.
|
|
272
|
+
user = await g.current_app.sm.get_user(email_or_username)
|
|
273
|
+
return await g.current_app.sm.reset_password(user, password)
|
|
274
274
|
|
|
275
275
|
|
|
276
276
|
async def export_data(
|
|
@@ -281,7 +281,7 @@ async def export_data(
|
|
|
281
281
|
"""
|
|
282
282
|
Export data.
|
|
283
283
|
"""
|
|
284
|
-
data = await g.current_app.
|
|
284
|
+
data = await g.current_app.sm.export_data(data, type)
|
|
285
285
|
with open(file_path, "w") as f:
|
|
286
286
|
f.write(data)
|
|
287
287
|
|
|
@@ -290,4 +290,4 @@ async def _cleanup():
|
|
|
290
290
|
"""
|
|
291
291
|
Cleanup unused permissions from apis and roles.
|
|
292
292
|
"""
|
|
293
|
-
await g.current_app.
|
|
293
|
+
await g.current_app.sm.cleanup()
|
|
@@ -121,6 +121,7 @@ class UserDatabase(SQLAlchemyUserDatabase[UP, ID]):
|
|
|
121
121
|
raise NotImplementedError()
|
|
122
122
|
|
|
123
123
|
await safe_call(self.session.refresh(user))
|
|
124
|
+
await user.load("oauth_accounts")
|
|
124
125
|
oauth_account = self.oauth_account_table(**create_dict)
|
|
125
126
|
self.session.add(oauth_account)
|
|
126
127
|
user.oauth_accounts.append(oauth_account)
|
|
@@ -85,7 +85,7 @@ def current_permissions(api: BaseApi):
|
|
|
85
85
|
"""
|
|
86
86
|
|
|
87
87
|
async def current_permissions_depedency(_=Depends(_ensure_roles)):
|
|
88
|
-
sm = g.current_app.
|
|
88
|
+
sm = g.current_app.sm
|
|
89
89
|
api_name = api.__class__.__name__
|
|
90
90
|
permissions = set[str]()
|
|
91
91
|
db_role_ids = list[int]()
|
|
@@ -154,10 +154,10 @@ def has_access_dependency(
|
|
|
154
154
|
|
|
155
155
|
async def check_permission():
|
|
156
156
|
_ensure_roles(ErrorCode.PERMISSION_DENIED)
|
|
157
|
+
sm = g.current_app.sm
|
|
157
158
|
|
|
158
159
|
# First, check built-in roles (avoiding unnecessary DB queries)
|
|
159
160
|
# This also covers the case for API and permission name with pipes
|
|
160
|
-
sm = g.current_app.security
|
|
161
161
|
if any(
|
|
162
162
|
sm.has_access_in_builtin_roles(
|
|
163
163
|
role.name, api.__class__.__name__, permission
|
|
@@ -178,8 +178,9 @@ def has_access_dependency(
|
|
|
178
178
|
)
|
|
179
179
|
|
|
180
180
|
api_name = api.__class__.__name__
|
|
181
|
-
|
|
182
|
-
sqlalchemy.select(
|
|
181
|
+
stmt = (
|
|
182
|
+
sqlalchemy.select(sqlalchemy.literal(True))
|
|
183
|
+
.select_from(Permission)
|
|
183
184
|
.join(PermissionApi)
|
|
184
185
|
.join(PermissionApi.roles)
|
|
185
186
|
.join(Api)
|
|
@@ -188,11 +189,10 @@ def has_access_dependency(
|
|
|
188
189
|
Permission.name == permission,
|
|
189
190
|
Role.id.in_(db_role_ids),
|
|
190
191
|
)
|
|
191
|
-
.
|
|
192
|
-
)
|
|
193
|
-
result: bool = await smart_run(
|
|
194
|
-
db.current_session.scalar, sqlalchemy.select(exist_query)
|
|
192
|
+
.limit(1)
|
|
195
193
|
)
|
|
194
|
+
result = await smart_run(db.current_session.scalar, stmt)
|
|
195
|
+
result = bool(result)
|
|
196
196
|
if result:
|
|
197
197
|
return
|
|
198
198
|
|
|
@@ -54,7 +54,7 @@ from .security.sqla.apis import (
|
|
|
54
54
|
from .security.sqla.models import Api, Permission, PermissionApi, Role
|
|
55
55
|
from .security.sqla.security_manager import SecurityManager
|
|
56
56
|
from .setting import Setting
|
|
57
|
-
from .utils import deep_merge, multiple_async_contexts, safe_call, smart_run
|
|
57
|
+
from .utils import deep_merge, lazy, multiple_async_contexts, safe_call, smart_run
|
|
58
58
|
from .version import __version__
|
|
59
59
|
|
|
60
60
|
__all__ = ["FastAPIReactToolkit"]
|
|
@@ -161,7 +161,11 @@ class FastAPIReactToolkit:
|
|
|
161
161
|
# Public attributes
|
|
162
162
|
apis: list[ModelRestApi] = None
|
|
163
163
|
initialized = False
|
|
164
|
-
|
|
164
|
+
sm: SecurityManager = None
|
|
165
|
+
security: SecurityManager = lazy(lambda self: self.sm)
|
|
166
|
+
"""
|
|
167
|
+
Old attribute for `sm`, kept for backward compatibility.
|
|
168
|
+
"""
|
|
165
169
|
started = False
|
|
166
170
|
"""
|
|
167
171
|
Indicates whether the application has been started.
|
|
@@ -217,7 +221,7 @@ class FastAPIReactToolkit:
|
|
|
217
221
|
"""
|
|
218
222
|
g.current_app = self
|
|
219
223
|
self.apis = []
|
|
220
|
-
self.
|
|
224
|
+
self.sm = SecurityManager(self)
|
|
221
225
|
|
|
222
226
|
# Database configuration
|
|
223
227
|
self.create_tables = create_tables
|
|
@@ -430,30 +434,30 @@ class FastAPIReactToolkit:
|
|
|
430
434
|
session, roles, permission_apis
|
|
431
435
|
)
|
|
432
436
|
if self.cleanup:
|
|
433
|
-
await self.
|
|
437
|
+
await self.sm.cleanup()
|
|
434
438
|
logger.info("DATABASE INITIALIZED")
|
|
435
439
|
|
|
436
440
|
async def _insert_permissions(self, session: SQLASession):
|
|
437
441
|
permissions = self.total_permissions() + [
|
|
438
|
-
x[1] for x in self.
|
|
442
|
+
x[1] for x in self.sm.get_api_permission_tuples_from_builtin_roles()
|
|
439
443
|
]
|
|
440
444
|
permissions = list(dict.fromkeys(permissions))
|
|
441
|
-
return await self.
|
|
445
|
+
return await self.sm.create_permissions(permissions, session=session)
|
|
442
446
|
|
|
443
447
|
async def _insert_apis(self, session: SQLASession):
|
|
444
448
|
apis = [api.__class__.__name__ for api in self.apis] + [
|
|
445
|
-
x[0] for x in self.
|
|
449
|
+
x[0] for x in self.sm.get_api_permission_tuples_from_builtin_roles()
|
|
446
450
|
]
|
|
447
451
|
apis = list(dict.fromkeys(apis))
|
|
448
|
-
return await self.
|
|
452
|
+
return await self.sm.create_apis(apis, session=session)
|
|
449
453
|
|
|
450
454
|
async def _insert_roles(self, session: SQLASession):
|
|
451
|
-
roles = self.
|
|
455
|
+
roles = self.sm.get_roles_from_builtin_roles()
|
|
452
456
|
if g.admin_role and g.admin_role not in roles:
|
|
453
457
|
roles.append(g.admin_role)
|
|
454
458
|
if g.public_role and g.public_role not in roles:
|
|
455
459
|
roles.append(g.public_role)
|
|
456
|
-
return await self.
|
|
460
|
+
return await self.sm.create_roles(roles, session=session)
|
|
457
461
|
|
|
458
462
|
async def _associate_permission_with_api(
|
|
459
463
|
self,
|
|
@@ -482,7 +486,7 @@ class FastAPIReactToolkit:
|
|
|
482
486
|
for (
|
|
483
487
|
api_name,
|
|
484
488
|
perm_name,
|
|
485
|
-
) in self.
|
|
489
|
+
) in self.sm.get_api_permission_tuples_from_builtin_roles():
|
|
486
490
|
if (perm_name, api_name) in added_permission_api:
|
|
487
491
|
continue
|
|
488
492
|
permission = permission_map[perm_name]
|
|
@@ -490,7 +494,7 @@ class FastAPIReactToolkit:
|
|
|
490
494
|
permission_api_tuples.append((permission, api_obj))
|
|
491
495
|
added_permission_api.add((permission.name, api_obj.name))
|
|
492
496
|
|
|
493
|
-
return await self.
|
|
497
|
+
return await self.sm.associate_list_of_permission_with_api(
|
|
494
498
|
permission_api_tuples, session=session
|
|
495
499
|
)
|
|
496
500
|
|
|
@@ -510,7 +514,7 @@ class FastAPIReactToolkit:
|
|
|
510
514
|
for (
|
|
511
515
|
role_name,
|
|
512
516
|
role_api_permissions,
|
|
513
|
-
) in self.
|
|
517
|
+
) in self.sm.get_role_and_api_permission_tuples_from_builtin_roles():
|
|
514
518
|
for api_name, permission_name in role_api_permissions:
|
|
515
519
|
role = role_map[role_name]
|
|
516
520
|
permission_api = permission_api_map[(permission_name, api_name)]
|
|
@@ -528,7 +532,7 @@ class FastAPIReactToolkit:
|
|
|
528
532
|
]:
|
|
529
533
|
role_permission_api_tuples.append((admin_role, permission_api))
|
|
530
534
|
|
|
531
|
-
await self.
|
|
535
|
+
await self.sm.associate_list_of_role_with_permission_api(
|
|
532
536
|
role_permission_api_tuples, session=session
|
|
533
537
|
)
|
|
534
538
|
|
|
@@ -164,7 +164,7 @@ class UsersApi(ModelRestApi):
|
|
|
164
164
|
col.required = False
|
|
165
165
|
|
|
166
166
|
async def post_add(self, item, params):
|
|
167
|
-
await g.current_app.
|
|
167
|
+
await g.current_app.sm.update_user(
|
|
168
168
|
user_update={"password": item.password},
|
|
169
169
|
user=item,
|
|
170
170
|
session=params.session,
|
|
@@ -173,7 +173,7 @@ class UsersApi(ModelRestApi):
|
|
|
173
173
|
|
|
174
174
|
async def post_update(self, item, params):
|
|
175
175
|
if params.body.password:
|
|
176
|
-
await g.current_app.
|
|
176
|
+
await g.current_app.sm.update_user(
|
|
177
177
|
user_update={"password": params.body.password},
|
|
178
178
|
user=item,
|
|
179
179
|
session=params.session,
|
|
@@ -76,12 +76,16 @@ class PermissionApi(Model):
|
|
|
76
76
|
api_id: Mapped[int] = mapped_column(
|
|
77
77
|
Integer, ForeignKey(f"{API_TABLE}.id"), name=view_menu_id, nullable=False
|
|
78
78
|
)
|
|
79
|
-
api: Mapped["Api"] = relationship(
|
|
79
|
+
api: Mapped["Api"] = relationship(
|
|
80
|
+
"Api", back_populates="permissions", lazy="joined"
|
|
81
|
+
)
|
|
80
82
|
|
|
81
83
|
permission_id: Mapped[int] = mapped_column(
|
|
82
84
|
Integer, ForeignKey(f"{PERMISSION_TABLE}.id"), nullable=False
|
|
83
85
|
)
|
|
84
|
-
permission: Mapped["Permission"] = relationship(
|
|
86
|
+
permission: Mapped["Permission"] = relationship(
|
|
87
|
+
"Permission", back_populates="apis", lazy="joined"
|
|
88
|
+
)
|
|
85
89
|
|
|
86
90
|
roles: Mapped[list["Role"]] = relationship(
|
|
87
91
|
"Role", secondary=assoc_permission_api_role, back_populates="permissions"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "1.0.9"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/extensions/audit/__init__.py
RENAMED
|
File without changes
|
{fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/extensions/audit/audit.py
RENAMED
|
File without changes
|
{fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/extensions/audit/types.py
RENAMED
|
File without changes
|
|
File without changes
|
{fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/filters.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/commands/db/templates/fastapi/README
RENAMED
|
File without changes
|
|
File without changes
|
{fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/cli/commands/db/templates/fastapi/env.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.mo
RENAMED
|
File without changes
|
{fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.po
RENAMED
|
File without changes
|
{fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.mo
RENAMED
|
File without changes
|
{fastapi_rtk-1.0.9 → fastapi_rtk-1.0.10}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.po
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|