fastapi-admin-kit 0.3.0__tar.gz → 0.3.2__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_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/PKG-INFO +5 -1
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/__init__.py +7 -1
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/admin_database.py +13 -8
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/admin_template.py +3 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/builtin_models.py +2 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/core.py +20 -6
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/context.py +33 -1
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/events.py +2 -2
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/logger.py +8 -0
- fastapi_admin_kit-0.3.2/fastapi_admin_kit/audit/models.py +22 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/sqlalchemy_logger.py +6 -0
- fastapi_admin_kit-0.3.2/fastapi_admin_kit/auth/models.py +45 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/permissions.py +15 -1
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/types.py +2 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/backends/sqlalchemy.py +243 -4
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/cli/__init__.py +1 -1
- fastapi_admin_kit-0.3.2/fastapi_admin_kit/cli/migrate.py +636 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/behavior.py +2 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/nav.py +2 -0
- fastapi_admin_kit-0.3.2/fastapi_admin_kit/export_import/__init__.py +28 -0
- fastapi_admin_kit-0.3.2/fastapi_admin_kit/export_import/base.py +387 -0
- fastapi_admin_kit-0.3.2/fastapi_admin_kit/export_import/csv.py +181 -0
- fastapi_admin_kit-0.3.2/fastapi_admin_kit/export_import/excel.py +193 -0
- fastapi_admin_kit-0.3.2/fastapi_admin_kit/export_import/registry.py +85 -0
- fastapi_admin_kit-0.3.2/fastapi_admin_kit/migrations/models.py +116 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/modeladmin.py +99 -2
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/router.py +202 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/schemas/builtin.py +95 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/schemas/schema.py +3 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/static/js/admin.js +4 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/macros/icons.html +1 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/dashboard.html +1 -6
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/form.html +10 -1
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/list.html +86 -3
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/list_table.html +14 -2
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/sidebar.html +10 -8
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/class_views.py +97 -20
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/context.py +4 -0
- fastapi_admin_kit-0.3.2/fastapi_admin_kit/views/factory.py +629 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/renderers.py +139 -13
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/pyproject.toml +3 -0
- fastapi_admin_kit-0.3.0/fastapi_admin_kit/audit/models.py +0 -51
- fastapi_admin_kit-0.3.0/fastapi_admin_kit/auth/models.py +0 -240
- fastapi_admin_kit-0.3.0/fastapi_admin_kit/cli/migrate.py +0 -266
- fastapi_admin_kit-0.3.0/fastapi_admin_kit/views/factory.py +0 -14
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/.gitignore +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/CHANGELOG.md +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/LICENSE +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/README.md +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/actions/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/actions/base.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/actions/registry.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/admin_config.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/admin_router.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/decorators.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/state.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/auth.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/crud.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/deps.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/roles.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/schema_generator.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/schemas.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/search.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/diff.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/event_bus.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/listener.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/middleware.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/backend.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/csrf.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/dependencies.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/hasher.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/identity.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/mixins.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/password.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/protocol.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/ratelimit.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/router.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/session.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/totp.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/views.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/backends/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/backends/protocols.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/cli/__main__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/cli/helpers.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/cli/permissions.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/cli/scaffold.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/cli/user.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/audit.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/auth.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/database.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/storage.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/theme.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/ui.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/dashboard/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/db.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/exceptions.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/field_types.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/filters/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/filters/base.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/filters/registry.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/flash.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/form/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/form/pipeline.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/form/types.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/inline.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/inspection/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/inspection/registry.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/inspection/types.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/inspection.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/models/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/models/base.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/nav.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/pagination/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/pagination/base.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/pagination/cursor.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/pagination/dynamic.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/pagination/offset.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/plugins/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/py.typed +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/registry/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/registry/core.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/registry/validation.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/registry.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/schemas/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/search_utils.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/static/css/admin.css +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/static/css/presets.css +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/static/css/tokens.css +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/static/css/variables.css +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/static/icons/heroicons.svg +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/static/js/htmx-config.js +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/storage/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/storage/base.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/storage/local.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/base.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/macros/form_fields.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/macros/table.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/macros/widgets.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/2fa/setup.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/2fa/verify.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/403.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/audit_detail.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/audit_log.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/detail.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/login.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/profile/password.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/profile/profile.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/role_form.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/roles/form.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/roles/list.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/roles.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/search.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/settings/theme.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/users/form.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/users/list.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/_inline_edit_row.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/command_palette.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/field_wrapper.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/flash_messages.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/head.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/head_minimal.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/inline_edit_form.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/inline_stacked.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/inline_tabular.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/mobile_backdrop.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/pagination.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/perm_select_widget.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/permission_widget.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/scripts.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/topbar.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/types.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/ui/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/ui/types.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/validation.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/audit.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/bulk.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/dashboard.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/delete.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/extra.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/file_handler.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/form.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/list.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/list_context.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/model_saver.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/profile.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/protocols.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/roles.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/search.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/settings.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/sidebar.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/totp.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/users.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/widgets/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/widgets/base.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/widgets/inputs.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/widgets/registry.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/widgets/relation.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/widgets/resolver.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/mkdocs.yml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fastapi-admin-kit
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: Drop-in admin panel for FastAPI + SQLAlchemy + SQLModel apps
|
|
5
5
|
Project-URL: Homepage, https://github.com/borhanst/fastapi-admin-kit
|
|
6
6
|
Project-URL: Documentation, https://borhanst.github.io/fastapi-admin-kit/
|
|
@@ -31,6 +31,8 @@ Requires-Dist: jinja2>=3.1.0
|
|
|
31
31
|
Requires-Dist: pre-commit>=4.6.0
|
|
32
32
|
Requires-Dist: python-multipart>=0.0.9
|
|
33
33
|
Requires-Dist: sqlalchemy>=2.0.0
|
|
34
|
+
Provides-Extra: alembic
|
|
35
|
+
Requires-Dist: alembic>=1.13.0; extra == 'alembic'
|
|
34
36
|
Provides-Extra: dev
|
|
35
37
|
Requires-Dist: hatch>=1.13.0; extra == 'dev'
|
|
36
38
|
Requires-Dist: httpx>=0.27.0; extra == 'dev'
|
|
@@ -44,6 +46,8 @@ Provides-Extra: docs
|
|
|
44
46
|
Requires-Dist: mkdocs-material>=9.5.0; extra == 'docs'
|
|
45
47
|
Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
|
|
46
48
|
Requires-Dist: mkdocstrings[python]>=0.25.0; extra == 'docs'
|
|
49
|
+
Provides-Extra: excel
|
|
50
|
+
Requires-Dist: openpyxl>=3.1.0; extra == 'excel'
|
|
47
51
|
Provides-Extra: full
|
|
48
52
|
Requires-Dist: pyjwt>=2.13.0; extra == 'full'
|
|
49
53
|
Requires-Dist: uvicorn>=0.30.0; extra == 'full'
|
|
@@ -5,6 +5,7 @@ from fastapi_admin_kit.admin.decorators import column
|
|
|
5
5
|
from fastapi_admin_kit.auth.mixins import AuthModelMixin
|
|
6
6
|
from fastapi_admin_kit.config import DatabaseConfig, DatabaseType
|
|
7
7
|
from fastapi_admin_kit.exceptions import ConfigError
|
|
8
|
+
from fastapi_admin_kit.export_import import CSVExport, CSVImport, ExportBase, ImportBase
|
|
8
9
|
from fastapi_admin_kit.inline import InlineModelAdmin, StackedInline, TabularInline
|
|
9
10
|
from fastapi_admin_kit.nav import (
|
|
10
11
|
BuiltNavGroup,
|
|
@@ -81,5 +82,10 @@ __all__ = [
|
|
|
81
82
|
"SearchView",
|
|
82
83
|
# Per-model assets
|
|
83
84
|
"AdminExtra",
|
|
85
|
+
# Export/Import
|
|
86
|
+
"ExportBase",
|
|
87
|
+
"ImportBase",
|
|
88
|
+
"CSVExport",
|
|
89
|
+
"CSVImport",
|
|
84
90
|
]
|
|
85
|
-
__version__ = "0.3.
|
|
91
|
+
__version__ = "0.3.2"
|
{fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/admin_database.py
RENAMED
|
@@ -33,10 +33,12 @@ class AdminDatabase:
|
|
|
33
33
|
engine: Any | None = None,
|
|
34
34
|
base: Any | None = None,
|
|
35
35
|
database_config: DatabaseConfig | None = None,
|
|
36
|
+
use_alembic: bool = False,
|
|
36
37
|
):
|
|
37
38
|
self.engine = engine
|
|
38
39
|
self.base = base
|
|
39
40
|
self.database_config = database_config
|
|
41
|
+
self.use_alembic = use_alembic
|
|
40
42
|
self._backend = SqlAlchemyDatabaseBackend(
|
|
41
43
|
admin_database=self, database_config=database_config
|
|
42
44
|
)
|
|
@@ -48,16 +50,19 @@ class AdminDatabase:
|
|
|
48
50
|
return self.engine
|
|
49
51
|
|
|
50
52
|
async def _create_tables(self) -> None:
|
|
51
|
-
"""Create all admin database tables (async-safe).
|
|
52
|
-
from sqlalchemy.ext.asyncio import AsyncEngine
|
|
53
|
+
"""Create all admin database tables (async-safe).
|
|
53
54
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
If ``use_alembic=True`` (production mode), this method does nothing
|
|
56
|
+
and expects Alembic to manage the schema via migrations.
|
|
57
|
+
"""
|
|
58
|
+
if self.use_alembic:
|
|
59
|
+
logger.info("use_alembic=True: skipping create_all; schema managed by Alembic")
|
|
60
|
+
return
|
|
61
|
+
|
|
62
|
+
from sqlalchemy.ext.asyncio import AsyncEngine
|
|
57
63
|
|
|
58
64
|
# Import models to register them with metadata
|
|
59
|
-
from fastapi_admin_kit.
|
|
60
|
-
from fastapi_admin_kit.models.base import Base as AdminBase
|
|
65
|
+
from fastapi_admin_kit.migrations.models import Base as AdminBase
|
|
61
66
|
|
|
62
67
|
if isinstance(self.engine, AsyncEngine):
|
|
63
68
|
# Async engine - use run_sync
|
|
@@ -166,7 +171,7 @@ class AdminDatabase:
|
|
|
166
171
|
from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession
|
|
167
172
|
from sqlalchemy.orm import Session, sessionmaker
|
|
168
173
|
|
|
169
|
-
from fastapi_admin_kit.
|
|
174
|
+
from fastapi_admin_kit.migrations.models import Permission, Role
|
|
170
175
|
|
|
171
176
|
is_async = isinstance(self.engine, AsyncEngine)
|
|
172
177
|
|
{fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/admin_template.py
RENAMED
|
@@ -22,6 +22,7 @@ class AdminTemplate:
|
|
|
22
22
|
dark_mode_default: bool = False,
|
|
23
23
|
dashboard_permission: str | None = None,
|
|
24
24
|
settings_permission: str | None = None,
|
|
25
|
+
sidebar_bottom_links: list[dict[str, str]] | None = None,
|
|
25
26
|
):
|
|
26
27
|
self.title = title
|
|
27
28
|
self.logo_url = logo_url
|
|
@@ -31,6 +32,7 @@ class AdminTemplate:
|
|
|
31
32
|
self.dark_mode_default = dark_mode_default
|
|
32
33
|
self.dashboard_permission = dashboard_permission
|
|
33
34
|
self.settings_permission = settings_permission
|
|
35
|
+
self.sidebar_bottom_links: list[dict[str, str]] = sidebar_bottom_links or []
|
|
34
36
|
self._nav_groups_built: list = []
|
|
35
37
|
|
|
36
38
|
def _init_jinja(self, app: Any) -> None:
|
|
@@ -221,6 +223,7 @@ class AdminTemplate:
|
|
|
221
223
|
"current_user": user_for_template,
|
|
222
224
|
"dashboard_visible": dashboard_visible,
|
|
223
225
|
"settings_visible": settings_visible,
|
|
226
|
+
"sidebar_bottom_links": self.sidebar_bottom_links,
|
|
224
227
|
}
|
|
225
228
|
|
|
226
229
|
async def apply_sidebar_context(self, request: Any, user: Any, context: dict) -> dict:
|
{fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/builtin_models.py
RENAMED
|
@@ -170,6 +170,8 @@ class UserAdmin(ModelAdmin):
|
|
|
170
170
|
class RoleAdmin(ModelAdmin):
|
|
171
171
|
tag = "admin"
|
|
172
172
|
icon = "shield-check"
|
|
173
|
+
verbose_name = "Admin Role"
|
|
174
|
+
verbose_name_plural = "Admin Roles"
|
|
173
175
|
list_display = ["id", "name", "description"]
|
|
174
176
|
search_fields = ["name"]
|
|
175
177
|
exclude = ["users"]
|
|
@@ -180,6 +180,7 @@ class Admin:
|
|
|
180
180
|
mobile_sidebar: str = "overlay",
|
|
181
181
|
dashboard_permission: str | None = None,
|
|
182
182
|
settings_permission: str | None = None,
|
|
183
|
+
sidebar_bottom_links: list[dict[str, str]] | None = None,
|
|
183
184
|
):
|
|
184
185
|
self.registry = AdminRegistry()
|
|
185
186
|
self._app: FastAPI | None = app
|
|
@@ -261,11 +262,17 @@ class Admin:
|
|
|
261
262
|
require_tags=require_tags,
|
|
262
263
|
dashboard_permission=dashboard_permission,
|
|
263
264
|
settings_permission=settings_permission,
|
|
265
|
+
sidebar_bottom_links=sidebar_bottom_links,
|
|
264
266
|
),
|
|
265
267
|
)
|
|
266
268
|
|
|
267
269
|
if database is None:
|
|
268
|
-
database = AdminDatabase(
|
|
270
|
+
database = AdminDatabase(
|
|
271
|
+
engine=engine,
|
|
272
|
+
base=base,
|
|
273
|
+
database_config=database_config,
|
|
274
|
+
use_alembic=config.behavior.use_alembic,
|
|
275
|
+
)
|
|
269
276
|
|
|
270
277
|
if router is None:
|
|
271
278
|
router = AdminRouter(
|
|
@@ -283,6 +290,7 @@ class Admin:
|
|
|
283
290
|
dark_mode_default=config.ui.dark_mode_default,
|
|
284
291
|
dashboard_permission=config.nav.dashboard_permission,
|
|
285
292
|
settings_permission=config.nav.settings_permission,
|
|
293
|
+
sidebar_bottom_links=config.nav.sidebar_bottom_links,
|
|
286
294
|
)
|
|
287
295
|
|
|
288
296
|
self.config = config
|
|
@@ -538,7 +546,8 @@ class Admin:
|
|
|
538
546
|
# 8.2 Apply skip_models — mark listed models to hide from admin
|
|
539
547
|
skip_models = self.config.behavior.skip_models
|
|
540
548
|
# Built-in internal models are always hidden from admin
|
|
541
|
-
|
|
549
|
+
# Note: model class names match table names (e.g., admin_refresh_tokens)
|
|
550
|
+
default_skip = {"admin_refresh_tokens", "admin_user_permissions", "admin_user_totp"}
|
|
542
551
|
all_skip = default_skip | skip_models
|
|
543
552
|
skip_lower = {s.lower() for s in all_skip}
|
|
544
553
|
for registered in self.registry.all():
|
|
@@ -555,7 +564,9 @@ class Admin:
|
|
|
555
564
|
from fastapi_admin_kit.db import create_session_factory
|
|
556
565
|
|
|
557
566
|
session_factory = create_session_factory(engine)
|
|
558
|
-
from fastapi_admin_kit.backends.sqlalchemy import
|
|
567
|
+
from fastapi_admin_kit.backends.sqlalchemy import (
|
|
568
|
+
SqlAlchemyAuditBackend,
|
|
569
|
+
)
|
|
559
570
|
|
|
560
571
|
audit_backend = SqlAlchemyAuditBackend()
|
|
561
572
|
audit_backend.attach_listeners(session_factory, self.registry)
|
|
@@ -736,7 +747,9 @@ class Admin:
|
|
|
736
747
|
# Unified signing-key source for sessions, CSRF, and JWT (see AdminState).
|
|
737
748
|
app.state.admin_secret_key = state.secret_key
|
|
738
749
|
# Multi-ORM backend: store composed backend and derive individual adapters
|
|
739
|
-
from fastapi_admin_kit.backends.sqlalchemy import
|
|
750
|
+
from fastapi_admin_kit.backends.sqlalchemy import (
|
|
751
|
+
SqlAlchemySessionAdapter,
|
|
752
|
+
)
|
|
740
753
|
|
|
741
754
|
app.state.admin_backend = self.backend
|
|
742
755
|
app.state.admin_session_backend_class = SqlAlchemySessionAdapter
|
|
@@ -848,6 +861,7 @@ class Admin:
|
|
|
848
861
|
"bars-": "menu",
|
|
849
862
|
"bars-3": "menu",
|
|
850
863
|
"arrow-down-tray": "download",
|
|
864
|
+
"arrow-up-tray": "upload",
|
|
851
865
|
"arrow-path": "refresh",
|
|
852
866
|
"paper-airplane": "send",
|
|
853
867
|
"exclamation-triangle": "warning",
|
|
@@ -983,8 +997,8 @@ class Admin:
|
|
|
983
997
|
RoleAdmin,
|
|
984
998
|
UserAdmin,
|
|
985
999
|
)
|
|
986
|
-
from fastapi_admin_kit.
|
|
987
|
-
|
|
1000
|
+
from fastapi_admin_kit.migrations.models import (
|
|
1001
|
+
AuditLog,
|
|
988
1002
|
LoginAttempt,
|
|
989
1003
|
Permission,
|
|
990
1004
|
Role,
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
from contextvars import ContextVar
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import TYPE_CHECKING, Any
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from fastapi_admin_kit.audit.events import AuditEvent
|
|
7
10
|
|
|
8
11
|
# Context variable to store audit context (user, IP, user_agent, etc.)
|
|
9
12
|
_current_audit_context: ContextVar[dict] = ContextVar("_current_audit_context", default={})
|
|
@@ -60,3 +63,32 @@ class AuditContext:
|
|
|
60
63
|
def clear_context(self) -> None:
|
|
61
64
|
"""Clear the audit context."""
|
|
62
65
|
clear_audit_context()
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
async def log_audit_event(request: Any, event: AuditEvent) -> None:
|
|
69
|
+
"""Persist an AuditEvent directly to the database.
|
|
70
|
+
|
|
71
|
+
Used for EXPORT/IMPORT events that don't go through the SQLAlchemy
|
|
72
|
+
before_flush listener.
|
|
73
|
+
"""
|
|
74
|
+
from fastapi_admin_kit.audit.models import AuditLog
|
|
75
|
+
from fastapi_admin_kit.db import get_db_session
|
|
76
|
+
|
|
77
|
+
session = get_db_session(request)
|
|
78
|
+
ctx = get_audit_context()
|
|
79
|
+
|
|
80
|
+
entry = AuditLog(
|
|
81
|
+
action=event.event_type,
|
|
82
|
+
model_name=event.model_name,
|
|
83
|
+
table_name=event.table_name,
|
|
84
|
+
object_id=event.object_id,
|
|
85
|
+
object_repr=event.object_repr,
|
|
86
|
+
changes=event.changes,
|
|
87
|
+
full_snapshot=event.full_snapshot,
|
|
88
|
+
user_id=event.user_id or ctx.get("user_id"),
|
|
89
|
+
user_email=event.user_email or ctx.get("user_email"),
|
|
90
|
+
ip_address=event.ip_address or ctx.get("ip_address"),
|
|
91
|
+
user_agent=event.user_agent or ctx.get("user_agent"),
|
|
92
|
+
)
|
|
93
|
+
session.add(entry)
|
|
94
|
+
await session.flush()
|
|
@@ -9,13 +9,13 @@ from typing import Any
|
|
|
9
9
|
|
|
10
10
|
@dataclass
|
|
11
11
|
class AuditEvent:
|
|
12
|
-
"""Represents a single audit event (CREATE, UPDATE, or
|
|
12
|
+
"""Represents a single audit event (CREATE, UPDATE, DELETE, EXPORT, or IMPORT).
|
|
13
13
|
|
|
14
14
|
This is a pure data structure with no side effects, making it
|
|
15
15
|
easy to test and serialize.
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
|
-
event_type: str # "CREATE" | "UPDATE" | "DELETE"
|
|
18
|
+
event_type: str # "CREATE" | "UPDATE" | "DELETE" | "EXPORT" | "IMPORT"
|
|
19
19
|
model_name: str
|
|
20
20
|
table_name: str
|
|
21
21
|
object_id: str
|
|
@@ -26,3 +26,11 @@ class AuditLogger(ABC):
|
|
|
26
26
|
@abstractmethod
|
|
27
27
|
def log_delete(self, event: AuditEvent) -> None:
|
|
28
28
|
"""Persist a DELETE audit event."""
|
|
29
|
+
|
|
30
|
+
@abstractmethod
|
|
31
|
+
def log_export(self, event: AuditEvent) -> None:
|
|
32
|
+
"""Persist an EXPORT audit event."""
|
|
33
|
+
|
|
34
|
+
@abstractmethod
|
|
35
|
+
def log_import(self, event: AuditEvent) -> None:
|
|
36
|
+
"""Persist an IMPORT audit event."""
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""SQLAlchemy model for the admin audit log.
|
|
2
|
+
|
|
3
|
+
.. deprecated:: 2.1.0
|
|
4
|
+
This module is deprecated. Use ``fastapi_admin_kit.migrations.models`` instead,
|
|
5
|
+
which materializes models from schemas for both runtime and Alembic migrations.
|
|
6
|
+
This module will be removed in v3.0.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import warnings
|
|
12
|
+
|
|
13
|
+
from fastapi_admin_kit.migrations.models import AuditLog
|
|
14
|
+
|
|
15
|
+
warnings.warn(
|
|
16
|
+
"fastapi_admin_kit.audit.models is deprecated and will be removed in v3.0. "
|
|
17
|
+
"Use fastapi_admin_kit.migrations.models instead.",
|
|
18
|
+
DeprecationWarning,
|
|
19
|
+
stacklevel=2,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
__all__ = ["AuditLog"]
|
{fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/sqlalchemy_logger.py
RENAMED
|
@@ -32,6 +32,12 @@ class SqlAlchemyAuditLogger(AuditLogger):
|
|
|
32
32
|
def log_delete(self, event: AuditEvent) -> None:
|
|
33
33
|
self._buffer(event)
|
|
34
34
|
|
|
35
|
+
def log_export(self, event: AuditEvent) -> None:
|
|
36
|
+
self._buffer(event)
|
|
37
|
+
|
|
38
|
+
def log_import(self, event: AuditEvent) -> None:
|
|
39
|
+
self._buffer(event)
|
|
40
|
+
|
|
35
41
|
def _buffer(self, event: AuditEvent) -> None:
|
|
36
42
|
entry = AuditLog(
|
|
37
43
|
user_id=event.user_id,
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""SQLAlchemy models for admin auth: roles, users, permissions.
|
|
2
|
+
|
|
3
|
+
.. deprecated:: 2.1.0
|
|
4
|
+
This module is deprecated. Use ``fastapi_admin_kit.migrations.models`` instead,
|
|
5
|
+
which materializes models from schemas for both runtime and Alembic migrations.
|
|
6
|
+
This module will be removed in v3.0.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import warnings
|
|
12
|
+
|
|
13
|
+
from fastapi_admin_kit.auth.mixins import AuthModelMixin
|
|
14
|
+
from fastapi_admin_kit.migrations.models import (
|
|
15
|
+
LoginAttempt,
|
|
16
|
+
Permission,
|
|
17
|
+
RefreshToken,
|
|
18
|
+
Role,
|
|
19
|
+
User,
|
|
20
|
+
UserPermission,
|
|
21
|
+
UserTOTP,
|
|
22
|
+
admin_role_permissions,
|
|
23
|
+
admin_user_roles,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
warnings.warn(
|
|
27
|
+
"fastapi_admin_kit.auth.models is deprecated and will be removed in v3.0. "
|
|
28
|
+
"Use fastapi_admin_kit.migrations.models instead.",
|
|
29
|
+
DeprecationWarning,
|
|
30
|
+
stacklevel=2,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
# Re-export the mixin
|
|
34
|
+
__all__ = [
|
|
35
|
+
"AuthModelMixin",
|
|
36
|
+
"User",
|
|
37
|
+
"Role",
|
|
38
|
+
"Permission",
|
|
39
|
+
"UserPermission",
|
|
40
|
+
"RefreshToken",
|
|
41
|
+
"UserTOTP",
|
|
42
|
+
"LoginAttempt",
|
|
43
|
+
"admin_user_roles",
|
|
44
|
+
"admin_role_permissions",
|
|
45
|
+
]
|
|
@@ -82,6 +82,10 @@ class PermissionChecker:
|
|
|
82
82
|
ps.can_edit = True
|
|
83
83
|
if perm.can_delete:
|
|
84
84
|
ps.can_delete = True
|
|
85
|
+
if perm.can_export:
|
|
86
|
+
ps.can_export = True
|
|
87
|
+
if perm.can_import:
|
|
88
|
+
ps.can_import = True
|
|
85
89
|
|
|
86
90
|
return self._role_cache
|
|
87
91
|
|
|
@@ -116,6 +120,10 @@ class PermissionChecker:
|
|
|
116
120
|
ps.can_edit = True
|
|
117
121
|
if perm.can_delete:
|
|
118
122
|
ps.can_delete = True
|
|
123
|
+
if perm.can_export:
|
|
124
|
+
ps.can_export = True
|
|
125
|
+
if perm.can_import:
|
|
126
|
+
ps.can_import = True
|
|
119
127
|
|
|
120
128
|
return self._direct_cache
|
|
121
129
|
|
|
@@ -137,7 +145,7 @@ class PermissionChecker:
|
|
|
137
145
|
async def has_permission(self, table_name: str, action: str) -> bool:
|
|
138
146
|
"""Return True if the current user may perform *action* on *table_name*.
|
|
139
147
|
|
|
140
|
-
Actions: ``"view"`` | ``"create"`` | ``"edit"`` | ``"delete"``
|
|
148
|
+
Actions: ``"view"`` | ``"create"`` | ``"edit"`` | ``"delete"`` | ``"export"`` | ``"import"``
|
|
141
149
|
|
|
142
150
|
Superusers always return True. Results are cached per-request.
|
|
143
151
|
"""
|
|
@@ -191,6 +199,8 @@ class PermissionChecker:
|
|
|
191
199
|
can_create=True,
|
|
192
200
|
can_edit=True,
|
|
193
201
|
can_delete=True,
|
|
202
|
+
can_export=True,
|
|
203
|
+
can_import=True,
|
|
194
204
|
)
|
|
195
205
|
# Check if cache has been populated for this table
|
|
196
206
|
cache_populated = any(key[0] == table_name for key in self._cache)
|
|
@@ -207,6 +217,8 @@ class PermissionChecker:
|
|
|
207
217
|
can_create=self._cache.get((table_name, "create"), False),
|
|
208
218
|
can_edit=self._cache.get((table_name, "edit"), False),
|
|
209
219
|
can_delete=self._cache.get((table_name, "delete"), False),
|
|
220
|
+
can_export=self._cache.get((table_name, "export"), False),
|
|
221
|
+
can_import=self._cache.get((table_name, "import"), False),
|
|
210
222
|
)
|
|
211
223
|
|
|
212
224
|
async def load_permissions(self, table_name: str) -> PermissionSet:
|
|
@@ -218,4 +230,6 @@ class PermissionChecker:
|
|
|
218
230
|
await self.has_permission(table_name, "create")
|
|
219
231
|
await self.has_permission(table_name, "edit")
|
|
220
232
|
await self.has_permission(table_name, "delete")
|
|
233
|
+
await self.has_permission(table_name, "export")
|
|
234
|
+
await self.has_permission(table_name, "import")
|
|
221
235
|
return self.permission_set(table_name)
|