fastapi-admin-kit 0.3.0__tar.gz → 0.3.1__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.1}/PKG-INFO +3 -1
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/__init__.py +7 -1
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/admin/admin_template.py +3 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/admin/core.py +10 -2
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/audit/context.py +33 -1
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/audit/events.py +2 -2
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/audit/logger.py +8 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/audit/sqlalchemy_logger.py +6 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/models.py +2 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/permissions.py +15 -1
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/types.py +2 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/config/nav.py +2 -0
- fastapi_admin_kit-0.3.1/fastapi_admin_kit/export_import/__init__.py +28 -0
- fastapi_admin_kit-0.3.1/fastapi_admin_kit/export_import/base.py +387 -0
- fastapi_admin_kit-0.3.1/fastapi_admin_kit/export_import/csv.py +181 -0
- fastapi_admin_kit-0.3.1/fastapi_admin_kit/export_import/excel.py +193 -0
- fastapi_admin_kit-0.3.1/fastapi_admin_kit/export_import/registry.py +85 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/modeladmin.py +99 -2
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/router.py +202 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/static/js/admin.js +4 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/macros/icons.html +1 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/form.html +10 -1
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/list.html +86 -3
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/list_table.html +14 -2
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/sidebar.html +17 -5
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/class_views.py +97 -20
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/context.py +4 -0
- fastapi_admin_kit-0.3.1/fastapi_admin_kit/views/factory.py +629 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/renderers.py +139 -13
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/pyproject.toml +1 -0
- 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.1}/.gitignore +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/CHANGELOG.md +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/LICENSE +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/README.md +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/actions/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/actions/base.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/actions/registry.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/admin/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/admin/admin_config.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/admin/admin_database.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/admin/admin_router.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/admin/builtin_models.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/admin/decorators.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/admin/state.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/api/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/api/auth.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/api/crud.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/api/deps.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/api/roles.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/api/schema_generator.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/api/schemas.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/api/search.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/audit/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/audit/diff.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/audit/event_bus.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/audit/listener.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/audit/middleware.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/audit/models.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/backend.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/csrf.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/dependencies.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/hasher.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/identity.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/mixins.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/password.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/protocol.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/ratelimit.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/router.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/session.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/totp.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/auth/views.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/backends/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/backends/protocols.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/backends/sqlalchemy.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/cli/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/cli/__main__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/cli/helpers.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/cli/migrate.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/cli/permissions.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/cli/scaffold.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/cli/user.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/config/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/config/audit.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/config/auth.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/config/behavior.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/config/database.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/config/storage.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/config/theme.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/config/ui.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/dashboard/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/db.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/exceptions.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/field_types.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/filters/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/filters/base.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/filters/registry.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/flash.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/form/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/form/pipeline.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/form/types.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/inline.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/inspection/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/inspection/registry.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/inspection/types.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/inspection.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/models/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/models/base.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/nav.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/pagination/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/pagination/base.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/pagination/cursor.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/pagination/dynamic.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/pagination/offset.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/plugins/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/py.typed +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/registry/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/registry/core.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/registry/validation.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/registry.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/schemas/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/schemas/builtin.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/schemas/schema.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/search_utils.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/static/css/admin.css +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/static/css/presets.css +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/static/css/tokens.css +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/static/css/variables.css +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/static/icons/heroicons.svg +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/static/js/htmx-config.js +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/storage/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/storage/base.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/storage/local.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/base.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/macros/form_fields.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/macros/table.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/macros/widgets.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/2fa/setup.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/2fa/verify.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/403.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/audit_detail.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/audit_log.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/dashboard.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/detail.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/login.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/profile/password.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/profile/profile.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/role_form.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/roles/form.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/roles/list.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/roles.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/search.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/settings/theme.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/users/form.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/pages/users/list.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/_inline_edit_row.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/command_palette.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/field_wrapper.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/flash_messages.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/head.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/head_minimal.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/inline_edit_form.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/inline_stacked.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/inline_tabular.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/mobile_backdrop.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/pagination.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/perm_select_widget.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/permission_widget.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/scripts.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/templates/partials/topbar.html +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/types.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/ui/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/ui/types.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/validation.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/audit.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/bulk.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/dashboard.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/delete.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/extra.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/file_handler.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/form.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/list.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/list_context.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/model_saver.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/profile.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/protocols.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/roles.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/search.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/settings.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/sidebar.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/totp.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views/users.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/views.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/widgets/__init__.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/widgets/base.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/widgets/inputs.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/widgets/registry.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/widgets/relation.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/fastapi_admin_kit/widgets/resolver.py +0 -0
- {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/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.1
|
|
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/
|
|
@@ -44,6 +44,8 @@ Provides-Extra: docs
|
|
|
44
44
|
Requires-Dist: mkdocs-material>=9.5.0; extra == 'docs'
|
|
45
45
|
Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
|
|
46
46
|
Requires-Dist: mkdocstrings[python]>=0.25.0; extra == 'docs'
|
|
47
|
+
Provides-Extra: excel
|
|
48
|
+
Requires-Dist: openpyxl>=3.1.0; extra == 'excel'
|
|
47
49
|
Provides-Extra: full
|
|
48
50
|
Requires-Dist: pyjwt>=2.13.0; extra == 'full'
|
|
49
51
|
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.1"
|
{fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/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:
|
|
@@ -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,6 +262,7 @@ 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
|
|
|
@@ -283,6 +285,7 @@ class Admin:
|
|
|
283
285
|
dark_mode_default=config.ui.dark_mode_default,
|
|
284
286
|
dashboard_permission=config.nav.dashboard_permission,
|
|
285
287
|
settings_permission=config.nav.settings_permission,
|
|
288
|
+
sidebar_bottom_links=config.nav.sidebar_bottom_links,
|
|
286
289
|
)
|
|
287
290
|
|
|
288
291
|
self.config = config
|
|
@@ -555,7 +558,9 @@ class Admin:
|
|
|
555
558
|
from fastapi_admin_kit.db import create_session_factory
|
|
556
559
|
|
|
557
560
|
session_factory = create_session_factory(engine)
|
|
558
|
-
from fastapi_admin_kit.backends.sqlalchemy import
|
|
561
|
+
from fastapi_admin_kit.backends.sqlalchemy import (
|
|
562
|
+
SqlAlchemyAuditBackend,
|
|
563
|
+
)
|
|
559
564
|
|
|
560
565
|
audit_backend = SqlAlchemyAuditBackend()
|
|
561
566
|
audit_backend.attach_listeners(session_factory, self.registry)
|
|
@@ -736,7 +741,9 @@ class Admin:
|
|
|
736
741
|
# Unified signing-key source for sessions, CSRF, and JWT (see AdminState).
|
|
737
742
|
app.state.admin_secret_key = state.secret_key
|
|
738
743
|
# Multi-ORM backend: store composed backend and derive individual adapters
|
|
739
|
-
from fastapi_admin_kit.backends.sqlalchemy import
|
|
744
|
+
from fastapi_admin_kit.backends.sqlalchemy import (
|
|
745
|
+
SqlAlchemySessionAdapter,
|
|
746
|
+
)
|
|
740
747
|
|
|
741
748
|
app.state.admin_backend = self.backend
|
|
742
749
|
app.state.admin_session_backend_class = SqlAlchemySessionAdapter
|
|
@@ -848,6 +855,7 @@ class Admin:
|
|
|
848
855
|
"bars-": "menu",
|
|
849
856
|
"bars-3": "menu",
|
|
850
857
|
"arrow-down-tray": "download",
|
|
858
|
+
"arrow-up-tray": "upload",
|
|
851
859
|
"arrow-path": "refresh",
|
|
852
860
|
"paper-airplane": "send",
|
|
853
861
|
"exclamation-triangle": "warning",
|
|
@@ -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."""
|
{fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.1}/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,
|
|
@@ -129,6 +129,8 @@ class Permission(Base):
|
|
|
129
129
|
can_create = Column(Boolean, default=False)
|
|
130
130
|
can_edit = Column(Boolean, default=False)
|
|
131
131
|
can_delete = Column(Boolean, default=False)
|
|
132
|
+
can_export = Column(Boolean, default=False)
|
|
133
|
+
can_import = Column(Boolean, default=False)
|
|
132
134
|
|
|
133
135
|
roles = relationship("Role", secondary=admin_role_permissions, back_populates="permissions")
|
|
134
136
|
|
|
@@ -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)
|
|
@@ -16,6 +16,7 @@ class NavConfig:
|
|
|
16
16
|
site_dropdown: list[dict[str, str]] | None = None,
|
|
17
17
|
dashboard_permission: str | None = None,
|
|
18
18
|
settings_permission: str | None = None,
|
|
19
|
+
sidebar_bottom_links: list[dict[str, str]] | None = None,
|
|
19
20
|
):
|
|
20
21
|
self.nav_groups = nav_groups or []
|
|
21
22
|
self.sidebar_builder = sidebar_builder
|
|
@@ -23,6 +24,7 @@ class NavConfig:
|
|
|
23
24
|
self.site_dropdown = site_dropdown or []
|
|
24
25
|
self.dashboard_permission = dashboard_permission
|
|
25
26
|
self.settings_permission = settings_permission
|
|
27
|
+
self.sidebar_bottom_links = sidebar_bottom_links or []
|
|
26
28
|
|
|
27
29
|
def validate_nav_config(self) -> None:
|
|
28
30
|
"""Validate navigation configuration."""
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Export and Import module for FastAPI Admin Kit."""
|
|
2
|
+
|
|
3
|
+
from fastapi_admin_kit.export_import.base import ExportBase, ImportBase
|
|
4
|
+
from fastapi_admin_kit.export_import.csv import CSVExport, CSVImport
|
|
5
|
+
from fastapi_admin_kit.export_import.registry import (
|
|
6
|
+
get_export_class,
|
|
7
|
+
get_import_class,
|
|
8
|
+
register_export,
|
|
9
|
+
register_import,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"ExportBase",
|
|
14
|
+
"ImportBase",
|
|
15
|
+
"CSVExport",
|
|
16
|
+
"CSVImport",
|
|
17
|
+
"register_export",
|
|
18
|
+
"register_import",
|
|
19
|
+
"get_export_class",
|
|
20
|
+
"get_import_class",
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
try:
|
|
24
|
+
from fastapi_admin_kit.export_import.excel import ExcelExport, ExcelImport
|
|
25
|
+
|
|
26
|
+
__all__ += ["ExcelExport", "ExcelImport"]
|
|
27
|
+
except ImportError:
|
|
28
|
+
pass
|