fastapi-admin-kit 0.4.0__tar.gz → 0.5.0__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.4.0 → fastapi_admin_kit-0.5.0}/CHANGELOG.md +21 -9
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/PKG-INFO +4 -1
- fastapi_admin_kit-0.5.0/SECURITY.md +32 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/__init__.py +3 -2
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/admin/admin_config.py +4 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/admin/admin_database.py +50 -7
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/admin/admin_router.py +5 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/admin/builtin_models.py +39 -6
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/admin/core.py +303 -11
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/admin/decorators.py +156 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/api/__init__.py +6 -5
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/api/auth.py +194 -23
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/api/crud.py +219 -0
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/api/deps.py +141 -0
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/api/middleware.py +131 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/api/roles.py +2 -1
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/api/schema_generator.py +61 -1
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/api/search.py +3 -0
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/api/security.py +23 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/audit/middleware.py +6 -1
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/auth/backend.py +221 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/auth/csrf.py +68 -15
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/auth/dependencies.py +5 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/auth/identity.py +22 -6
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/auth/mixins.py +9 -7
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/auth/password.py +6 -3
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/auth/proxy.py +98 -0
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/auth/ratelimit.py +112 -0
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/auth/session.py +186 -0
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/auth/totp.py +158 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/auth/views.py +63 -21
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/backends/memory.py +12 -2
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/backends/protocols.py +5 -1
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/backends/sqlalchemy.py +103 -4
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/cli/user.py +360 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/config/__init__.py +2 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/config/auth.py +25 -6
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/config/cache.py +137 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/db.py +12 -12
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/export_import/base.py +56 -5
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/export_import/csv.py +2 -2
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/export_import/excel.py +8 -5
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/filters/__init__.py +4 -0
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/filters/base.py +527 -0
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/filters/lookups.py +76 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/filters/registry.py +52 -17
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/inspection/__init__.py +59 -1
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/inspection/types.py +26 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/inspection.py +38 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/migrations/models.py +18 -15
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/modeladmin.py +115 -6
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/nav.py +3 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/notifications/plugin.py +4 -1
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/notifications/router.py +17 -2
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/notifications/service.py +18 -2
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/pagination/cursor.py +12 -2
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/redis.py +325 -0
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/registry/__init__.py +9 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/registry/core.py +70 -37
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/router.py +209 -61
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/schemas/builtin.py +30 -45
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/static/css/admin.css +10 -4
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/storage/base.py +3 -0
- fastapi_admin_kit-0.5.0/fastapi_admin_kit/storage/local.py +117 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/admin/base_list.html +58 -7
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/macros/form_fields.html +7 -8
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/macros/table.html +1 -1
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/roles/form.html +1 -1
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/users/form.html +2 -2
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/_inline_edit_row.html +1 -1
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/inline_stacked.html +2 -2
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/inline_tabular.html +2 -2
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/list_table.html +1 -1
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/perm_select_widget.html +1 -1
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/permission_widget.html +1 -1
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/topbar.html +1 -1
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/validation.py +9 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/class_views.py +90 -6
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/file_handler.py +43 -15
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/list_context.py +16 -38
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/model_saver.py +7 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/profile.py +7 -4
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/protocols.py +1 -1
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/renderers.py +91 -151
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/roles.py +6 -6
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/settings.py +1 -1
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/totp.py +96 -11
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/users.py +2 -2
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views.py +10 -2
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/mkdocs.yml +2 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/pyproject.toml +4 -0
- fastapi_admin_kit-0.4.0/fastapi_admin_kit/admin/decorators.py +0 -70
- fastapi_admin_kit-0.4.0/fastapi_admin_kit/api/crud.py +0 -134
- fastapi_admin_kit-0.4.0/fastapi_admin_kit/api/deps.py +0 -75
- fastapi_admin_kit-0.4.0/fastapi_admin_kit/auth/backend.py +0 -94
- fastapi_admin_kit-0.4.0/fastapi_admin_kit/auth/ratelimit.py +0 -104
- fastapi_admin_kit-0.4.0/fastapi_admin_kit/auth/session.py +0 -106
- fastapi_admin_kit-0.4.0/fastapi_admin_kit/auth/totp.py +0 -86
- fastapi_admin_kit-0.4.0/fastapi_admin_kit/cli/user.py +0 -207
- fastapi_admin_kit-0.4.0/fastapi_admin_kit/filters/base.py +0 -335
- fastapi_admin_kit-0.4.0/fastapi_admin_kit/registry/__init__.py +0 -5
- fastapi_admin_kit-0.4.0/fastapi_admin_kit/storage/local.py +0 -73
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/.gitignore +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/LICENSE +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/README.md +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/example/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/example/custom_templates/admin/list.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/example/custom_templates/admin/products/list.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/example/example_ai.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/example/example_custom_templates.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/example/example_notifications.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/example/validate_ws.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/actions/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/actions/base.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/actions/registry.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/admin/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/admin/admin_template.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/admin/state.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/agent.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/attachments.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/backends/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/backends/pydantic_ai_backend.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/backends/repairer.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/builtin_tools.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/config.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/conversation.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/dashboard.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/data_access.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/deps.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/errors.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/model_agent.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/plugin.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/prompts.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/serialization.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/service.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/tools.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/ui/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/ui/native.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ai/usage.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/api/schemas.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/audit/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/audit/context.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/audit/diff.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/audit/event_bus.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/audit/events.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/audit/listener.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/audit/logger.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/audit/models.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/audit/sqlalchemy_logger.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/auth/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/auth/hasher.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/auth/models.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/auth/permissions.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/auth/protocol.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/auth/router.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/auth/types.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/backends/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/cli/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/cli/__main__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/cli/helpers.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/cli/migrate.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/cli/permissions.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/cli/scaffold.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/config/ai_chat.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/config/audit.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/config/behavior.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/config/database.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/config/nav.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/config/storage.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/config/theme.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/config/ui.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/dashboard/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/exceptions.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/export_import/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/export_import/registry.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/field_types.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/flash.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/form/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/form/pipeline.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/form/types.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/inline.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/inspection/registry.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/migrations/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/models/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/models/base.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/notifications/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/notifications/config.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/notifications/dispatcher.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/notifications/email.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/notifications/models.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/notifications/realtime.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/notifications/schemas.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/notifications/sms/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/notifications/sms/base.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/notifications/sms/twilio.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/notifications/store.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/pagination/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/pagination/base.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/pagination/dynamic.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/pagination/offset.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/plugins/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/py.typed +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/registry/validation.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/registry.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/schemas/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/schemas/schema.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/search_utils.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/static/css/presets.css +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/static/css/tokens.css +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/static/css/variables.css +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/static/icons/heroicons.svg +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/static/js/admin.js +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/static/js/htmx-config.js +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/storage/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/admin/base_detail.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/admin/base_form.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/base.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/macros/icons.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/macros/widgets.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/2fa/setup.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/2fa/verify.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/403.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/ai/agents.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/ai/chat.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/ai/chat_htmx.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/ai/dashboard.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/ai/logs.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/ai/tools.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/audit_detail.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/audit_log.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/dashboard.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/detail.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/form.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/list.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/login.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/profile/password.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/profile/profile.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/role_form.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/roles/list.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/roles.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/search.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/settings/theme.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/pages/users/list.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/ai_chat_widget.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/command_palette.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/detail_field.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/field_wrapper.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/flash_messages.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/head.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/head_minimal.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/inline_edit_form.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/mobile_backdrop.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/pagination.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/scripts.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/templates/partials/sidebar.html +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/types.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ui/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/ui/types.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/audit.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/bulk.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/context.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/dashboard.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/delete.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/extra.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/factory.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/form.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/list.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/search.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/views/sidebar.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/widgets/__init__.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/widgets/base.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/widgets/inputs.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/widgets/registry.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/widgets/relation.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/widgets/resolver.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/scripts/generate_changelog.py +0 -0
- {fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/test_on_complete.py +0 -0
|
@@ -7,6 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Added
|
|
11
|
+
- Robust Django-style filtering system
|
|
12
|
+
([#52](https://github.com/borhanst/fastapi-admin-kit/issues/52)):
|
|
13
|
+
- New lookup types for the JSON API and admin UI list views:
|
|
14
|
+
`icontains`, `startswith`, `endswith`, `gt`, `gte`, `lt`, `lte`,
|
|
15
|
+
`range`, and `in` — in addition to exact matches.
|
|
16
|
+
- New `ChoiceFilter` for relation/FK fields (auto-detected in
|
|
17
|
+
`FilterRegistry.auto_generate()`), plus `IntegerFilter` with full
|
|
18
|
+
numeric lookups.
|
|
19
|
+
- Admin UI now renders text-input filters (case-insensitive contains)
|
|
20
|
+
and min/max inputs for numeric fields.
|
|
21
|
+
- Filters are ORM-agnostic: `QueryBackend` gained an `and_` combinator
|
|
22
|
+
and the in-memory backend now handles `%`-anchored `ilike` patterns.
|
|
23
|
+
- `Admin.setup()` now logs a non-blocking preflight warning naming any missing
|
|
24
|
+
`admin_ai_*` tables (with the command to fix them) when `ai_enabled=True`
|
|
25
|
+
but the schema is absent (Alembic / `SKIP_CREATE_TABLES=true` mode).
|
|
26
|
+
- `fastapi_admin_kit.schemas.builtin.AI_TABLE_NAMES` and
|
|
27
|
+
`INTERNAL_TABLE_NAMES` constants for gating/identification.
|
|
28
|
+
- `AdminRegistry.auto_discover(exclude_tables=...)` accepts a set of table
|
|
29
|
+
names to skip during discovery.
|
|
30
|
+
|
|
10
31
|
### Changed
|
|
11
32
|
- **AI is now gated behind `ai_enabled` (default `False`).** When AI is
|
|
12
33
|
disabled, the `admin_ai_*` tables are not created, and the AI models, nav
|
|
@@ -17,15 +38,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
17
38
|
JSON API (previously a latent security hole). They remain hidden from the
|
|
18
39
|
sidebar.
|
|
19
40
|
|
|
20
|
-
### Added
|
|
21
|
-
- `Admin.setup()` now logs a non-blocking preflight warning naming any missing
|
|
22
|
-
`admin_ai_*` tables (with the command to fix them) when `ai_enabled=True`
|
|
23
|
-
but the schema is absent (Alembic / `SKIP_CREATE_TABLES=true` mode).
|
|
24
|
-
- `fastapi_admin_kit.schemas.builtin.AI_TABLE_NAMES` and
|
|
25
|
-
`INTERNAL_TABLE_NAMES` constants for gating/identification.
|
|
26
|
-
- `AdminRegistry.auto_discover(exclude_tables=...)` accepts a set of table
|
|
27
|
-
names to skip during discovery.
|
|
28
|
-
|
|
29
41
|
## [0.3.2] - 2026-07-31
|
|
30
42
|
|
|
31
43
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: fastapi-admin-kit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
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/
|
|
@@ -39,6 +39,7 @@ Requires-Dist: pydantic-ai>=2.0.0; extra == 'ai-gemini'
|
|
|
39
39
|
Provides-Extra: alembic
|
|
40
40
|
Requires-Dist: alembic>=1.13.0; extra == 'alembic'
|
|
41
41
|
Provides-Extra: dev
|
|
42
|
+
Requires-Dist: fakeredis>=2.26.0; extra == 'dev'
|
|
42
43
|
Requires-Dist: hatch>=1.13.0; extra == 'dev'
|
|
43
44
|
Requires-Dist: httpx>=0.27.0; extra == 'dev'
|
|
44
45
|
Requires-Dist: pre-commit>=3.5.0; extra == 'dev'
|
|
@@ -62,6 +63,8 @@ Provides-Extra: notifications
|
|
|
62
63
|
Requires-Dist: twilio>=8.9.0; extra == 'notifications'
|
|
63
64
|
Provides-Extra: postgres
|
|
64
65
|
Requires-Dist: asyncpg>=0.29.0; extra == 'postgres'
|
|
66
|
+
Provides-Extra: redis
|
|
67
|
+
Requires-Dist: fastapi-redis-sdk>=0.8.0; extra == 'redis'
|
|
65
68
|
Provides-Extra: sqlmodel
|
|
66
69
|
Requires-Dist: sqlmodel>=0.0.39; extra == 'sqlmodel'
|
|
67
70
|
Description-Content-Type: text/markdown
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting Security Issues
|
|
4
|
+
|
|
5
|
+
**DO NOT report security vulnerabilities via public GitHub issues.**
|
|
6
|
+
|
|
7
|
+
Instead, please report them by emailing security@fastapi-admin-kit.com with:
|
|
8
|
+
|
|
9
|
+
- A detailed description of the vulnerability
|
|
10
|
+
- Steps to reproduce the issue
|
|
11
|
+
- Potential impact and affected versions
|
|
12
|
+
- Any proof-of-concept code (if applicable)
|
|
13
|
+
|
|
14
|
+
## What to Include
|
|
15
|
+
|
|
16
|
+
Please include the following in your report:
|
|
17
|
+
|
|
18
|
+
1. **Vulnerability type** (e.g., XSS, SQL injection, authentication bypass, etc.)
|
|
19
|
+
2. **Affected components** or endpoints
|
|
20
|
+
3. **Steps to reproduce**
|
|
21
|
+
4. **Expected vs. actual behavior**
|
|
22
|
+
5. **Environment details** (OS, Python version, framework version)
|
|
23
|
+
6. **Suggested fix** (optional but appreciated)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
## Security Policy
|
|
27
|
+
|
|
28
|
+
This project follows responsible disclosure. We will:
|
|
29
|
+
|
|
30
|
+
- Credit reporters in the release notes (unless requested otherwise)
|
|
31
|
+
- Fix security issues in a timely manner
|
|
32
|
+
- Publish security advisories via the GitHub Security tab
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""FastAPI Admin Kit — Drop-in admin panel for FastAPI + SQLAlchemy apps."""
|
|
2
2
|
|
|
3
3
|
from fastapi_admin_kit.admin import Admin
|
|
4
|
-
from fastapi_admin_kit.admin.decorators import column
|
|
4
|
+
from fastapi_admin_kit.admin.decorators import column, endpoint
|
|
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
|
|
@@ -74,6 +74,7 @@ __all__ = [
|
|
|
74
74
|
"RegisteredModel",
|
|
75
75
|
"ModelAdmin",
|
|
76
76
|
"column",
|
|
77
|
+
"endpoint",
|
|
77
78
|
"BuiltNavGroup",
|
|
78
79
|
"BuiltNavItem",
|
|
79
80
|
"DefaultSidebarBuilder",
|
|
@@ -133,4 +134,4 @@ __all__ = [
|
|
|
133
134
|
"configure_notifications",
|
|
134
135
|
"notifications_router",
|
|
135
136
|
]
|
|
136
|
-
__version__ = "0.
|
|
137
|
+
__version__ = "0.5.0"
|
|
@@ -7,6 +7,7 @@ from fastapi_admin_kit.config import (
|
|
|
7
7
|
AuditConfig,
|
|
8
8
|
AuthConfig,
|
|
9
9
|
BehaviorConfig,
|
|
10
|
+
CacheConfig,
|
|
10
11
|
NavConfig,
|
|
11
12
|
StorageConfig,
|
|
12
13
|
UIConfig,
|
|
@@ -29,6 +30,7 @@ class AdminConfig:
|
|
|
29
30
|
nav: NavConfig | None = None,
|
|
30
31
|
template_dirs: list[str] | None = None,
|
|
31
32
|
ai_chat: AIChatConfig | None = None,
|
|
33
|
+
cache: CacheConfig | None = None,
|
|
32
34
|
):
|
|
33
35
|
self.ui = ui or UIConfig()
|
|
34
36
|
self.auth = auth or AuthConfig()
|
|
@@ -38,6 +40,7 @@ class AdminConfig:
|
|
|
38
40
|
self.nav = nav or NavConfig()
|
|
39
41
|
self.template_dirs = template_dirs or []
|
|
40
42
|
self.ai_chat = ai_chat or AIChatConfig()
|
|
43
|
+
self.cache = cache or CacheConfig()
|
|
41
44
|
|
|
42
45
|
def validate_all(self) -> None:
|
|
43
46
|
"""Validate all configuration components."""
|
|
@@ -45,6 +48,7 @@ class AdminConfig:
|
|
|
45
48
|
self.audit.validate_audit_config()
|
|
46
49
|
self.storage.validate_storage_config()
|
|
47
50
|
self.nav.validate_nav_config()
|
|
51
|
+
self.cache.validate_cache_config()
|
|
48
52
|
|
|
49
53
|
def get_ui_context(self) -> dict:
|
|
50
54
|
"""Get UI configuration for template context."""
|
{fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/admin/admin_database.py
RENAMED
|
@@ -43,13 +43,31 @@ class AdminDatabase:
|
|
|
43
43
|
admin_database=self, database_config=database_config
|
|
44
44
|
)
|
|
45
45
|
|
|
46
|
+
@property
|
|
47
|
+
def resolved_engine(self) -> Any:
|
|
48
|
+
"""Return the SQLAlchemy engine, lazily creating it from
|
|
49
|
+
``database_config`` if no engine was passed at construction time.
|
|
50
|
+
|
|
51
|
+
This is the property to use everywhere a backend call needs an
|
|
52
|
+
engine. Reading the raw ``self.engine`` attribute can be ``None``
|
|
53
|
+
when the project supplied a ``database_config`` instead of an
|
|
54
|
+
``engine`` — calling methods on it then surfaces a confusing
|
|
55
|
+
``AttributeError: 'NoneType' object has no attribute
|
|
56
|
+
'_run_ddl_visitor'`` from deep inside SQLAlchemy.
|
|
57
|
+
"""
|
|
58
|
+
return self._ensure_engine()
|
|
59
|
+
|
|
46
60
|
def _ensure_engine(self) -> Any:
|
|
47
61
|
"""Create the async engine from ``database_config`` if no engine is set."""
|
|
48
62
|
if self.engine is None and self.database_config is not None:
|
|
49
63
|
self.engine = self.database_config.create_engine()
|
|
50
64
|
return self.engine
|
|
51
65
|
|
|
52
|
-
async def _create_tables(
|
|
66
|
+
async def _create_tables(
|
|
67
|
+
self,
|
|
68
|
+
include_ai_tables: bool = True,
|
|
69
|
+
extra_exclude_tables: list[str] | None = None,
|
|
70
|
+
) -> None:
|
|
53
71
|
"""Create all admin database tables (async-safe).
|
|
54
72
|
|
|
55
73
|
If ``use_alembic=True`` (production mode), this method does nothing
|
|
@@ -59,6 +77,13 @@ class AdminDatabase:
|
|
|
59
77
|
``admin_ai_*`` tables are skipped. This is safe because the AI schemas
|
|
60
78
|
declare ``relations=[]`` and no FK columns (the "log pattern"), so
|
|
61
79
|
excluding them cannot break ``create_all`` dependency sorting.
|
|
80
|
+
|
|
81
|
+
``extra_exclude_tables`` lets callers (typically the ``Admin`` setup
|
|
82
|
+
path) drop built-in tables that should not be created for this
|
|
83
|
+
installation — most notably the default ``admin_users`` /
|
|
84
|
+
``admin_user_roles`` tables when a project supplies a custom
|
|
85
|
+
``auth_model``. Filtering at ``create_all`` time avoids mutating the
|
|
86
|
+
shared ``AdminBase.metadata`` (whose FacadeDict is immutable).
|
|
62
87
|
"""
|
|
63
88
|
if self.use_alembic:
|
|
64
89
|
logger.info("use_alembic=True: skipping create_all; schema managed by Alembic")
|
|
@@ -67,24 +92,42 @@ class AdminDatabase:
|
|
|
67
92
|
from fastapi_admin_kit.migrations.models import Base as AdminBase
|
|
68
93
|
from fastapi_admin_kit.schemas.builtin import AI_TABLE_NAMES
|
|
69
94
|
|
|
95
|
+
exclude = set(extra_exclude_tables or ())
|
|
96
|
+
|
|
70
97
|
def _filtered(metadata: Any) -> Any:
|
|
71
|
-
if include_ai_tables
|
|
98
|
+
drop = exclude | (set() if include_ai_tables else AI_TABLE_NAMES)
|
|
99
|
+
if not drop:
|
|
72
100
|
return None # create_all(tables=None) == all tables
|
|
73
|
-
return [t for name, t in metadata.tables.items() if name not in
|
|
101
|
+
return [t for name, t in metadata.tables.items() if name not in drop]
|
|
74
102
|
|
|
75
103
|
ai_filtered_admin = _filtered(AdminBase.metadata)
|
|
76
104
|
ai_filtered_base = _filtered(self.base.metadata) if self.base is not None else None
|
|
77
105
|
|
|
106
|
+
engine = self.resolved_engine
|
|
107
|
+
if engine is None:
|
|
108
|
+
raise RuntimeError(
|
|
109
|
+
"AdminDatabase has no engine: pass `engine=` or "
|
|
110
|
+
"`database_config=` to Admin() so the admin tables can be "
|
|
111
|
+
"created. If you manage schema via Alembic, set "
|
|
112
|
+
"`use_alembic=True` on Admin() to skip create_all."
|
|
113
|
+
)
|
|
114
|
+
|
|
78
115
|
await self._run_backend(
|
|
79
|
-
self._backend.create_tables,
|
|
116
|
+
self._backend.create_tables,
|
|
117
|
+
engine,
|
|
118
|
+
AdminBase.metadata,
|
|
119
|
+
ai_filtered_admin,
|
|
80
120
|
)
|
|
81
121
|
if self.base is not None:
|
|
82
122
|
await self._run_backend(
|
|
83
|
-
self._backend.create_tables,
|
|
123
|
+
self._backend.create_tables,
|
|
124
|
+
engine,
|
|
125
|
+
self.base.metadata,
|
|
126
|
+
ai_filtered_base,
|
|
84
127
|
)
|
|
85
|
-
await self._run_backend(self._backend.auto_migrate,
|
|
128
|
+
await self._run_backend(self._backend.auto_migrate, engine, AdminBase.metadata)
|
|
86
129
|
if self.base is not None:
|
|
87
|
-
await self._run_backend(self._backend.auto_migrate,
|
|
130
|
+
await self._run_backend(self._backend.auto_migrate, engine, self.base.metadata)
|
|
88
131
|
|
|
89
132
|
async def _missing_tables(self, ai_enabled: bool, names: list[str]) -> set[str]:
|
|
90
133
|
"""Return the subset of ``names`` whose tables do not exist yet.
|
|
@@ -31,7 +31,12 @@ class AdminRouter:
|
|
|
31
31
|
for registered in registry.all():
|
|
32
32
|
if getattr(registered.admin, "skip_auto_routes", False):
|
|
33
33
|
continue
|
|
34
|
+
# API-only models (export_endpoint="api") get no admin HTML router.
|
|
35
|
+
if getattr(registered.admin, "export_endpoint", None) == "api":
|
|
36
|
+
continue
|
|
34
37
|
model_router = build_model_router(registered)
|
|
38
|
+
if model_router is None:
|
|
39
|
+
continue
|
|
35
40
|
app.include_router(model_router, prefix=self.admin_path)
|
|
36
41
|
|
|
37
42
|
# Auth routes (login/logout)
|
{fastapi_admin_kit-0.4.0 → fastapi_admin_kit-0.5.0}/fastapi_admin_kit/admin/builtin_models.py
RENAMED
|
@@ -4,6 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from typing import Any
|
|
6
6
|
|
|
7
|
+
from fastapi_admin_kit.inspection.types import SENSITIVE_FIELDS
|
|
7
8
|
from fastapi_admin_kit.modeladmin import ModelAdmin
|
|
8
9
|
from fastapi_admin_kit.types import ExtraField
|
|
9
10
|
from fastapi_admin_kit.widgets.inputs import AutocompleteWidget, PasswordWidget
|
|
@@ -70,7 +71,7 @@ async def flush_pending_perm_ops(request):
|
|
|
70
71
|
from fastapi_admin_kit.db import get_db_session
|
|
71
72
|
|
|
72
73
|
perm_ids = getattr(request.state, "_admin_perm_perm_ids", None)
|
|
73
|
-
if
|
|
74
|
+
if perm_ids is None or not isinstance(perm_ids, list):
|
|
74
75
|
return
|
|
75
76
|
|
|
76
77
|
# Get the user object from request state
|
|
@@ -107,7 +108,7 @@ class UserAdmin(ModelAdmin):
|
|
|
107
108
|
list_display = ["id", "email", "full_name", "is_superuser", "is_active"]
|
|
108
109
|
search_fields = ["email", "full_name"]
|
|
109
110
|
inline_edit = True
|
|
110
|
-
exclude = ["
|
|
111
|
+
exclude = ["password", "password_changed_at"]
|
|
111
112
|
extra_fields = [
|
|
112
113
|
ExtraField(
|
|
113
114
|
name="password",
|
|
@@ -124,14 +125,40 @@ class UserAdmin(ModelAdmin):
|
|
|
124
125
|
),
|
|
125
126
|
}
|
|
126
127
|
|
|
128
|
+
def _actor_is_superuser(self, request) -> bool:
|
|
129
|
+
"""Return True if the acting user may modify privileged user fields."""
|
|
130
|
+
if request is None:
|
|
131
|
+
return False
|
|
132
|
+
snapshot = getattr(request.state, "admin_user_snapshot", None) or {}
|
|
133
|
+
return bool(snapshot.get("is_superuser", False))
|
|
134
|
+
|
|
135
|
+
def _strip_privileged_fields(self, data, request):
|
|
136
|
+
"""Remove privilege-granting fields unless a superuser is acting.
|
|
137
|
+
|
|
138
|
+
Prevents privilege escalation via mass assignment: a non-superuser
|
|
139
|
+
with edit permission on admin_users must not grant themselves
|
|
140
|
+
``is_superuser``, toggle ``is_active``, change ``roles``, or write
|
|
141
|
+
secret columns (``password`` etc.) directly.
|
|
142
|
+
"""
|
|
143
|
+
if self._actor_is_superuser(request):
|
|
144
|
+
return data
|
|
145
|
+
from fastapi_admin_kit.inspection.types import PRIVILEGED_ASSIGNMENT_FIELDS
|
|
146
|
+
|
|
147
|
+
for field in SENSITIVE_FIELDS | PRIVILEGED_ASSIGNMENT_FIELDS:
|
|
148
|
+
data.pop(field, None)
|
|
149
|
+
return data
|
|
150
|
+
|
|
127
151
|
def prepare_create_data(self, data, request=None):
|
|
128
152
|
from fastapi_admin_kit.auth.models import User
|
|
129
153
|
|
|
154
|
+
# Strip first so a direct password injection is removed,
|
|
155
|
+
# then derive password from the (validated) password field.
|
|
156
|
+
self._strip_privileged_fields(data, request)
|
|
130
157
|
password = data.pop("password", None)
|
|
131
158
|
if password:
|
|
132
|
-
data["
|
|
159
|
+
data["password"] = User.hash_password(password)
|
|
133
160
|
else:
|
|
134
|
-
data["
|
|
161
|
+
data["password"] = ""
|
|
135
162
|
return data
|
|
136
163
|
|
|
137
164
|
def validate_create(self, data, request=None):
|
|
@@ -162,6 +189,12 @@ class UserAdmin(ModelAdmin):
|
|
|
162
189
|
raise FieldError({"password": errors})
|
|
163
190
|
return data
|
|
164
191
|
|
|
192
|
+
def prepare_update_data(self, data: dict[str, Any], request: Any = None) -> dict[str, Any]:
|
|
193
|
+
"""Strip extra fields and privileged fields before an update."""
|
|
194
|
+
extra_names = {f.name for f in self.extra_fields}
|
|
195
|
+
data = {k: v for k, v in data.items() if k not in extra_names}
|
|
196
|
+
return self._strip_privileged_fields(data, request)
|
|
197
|
+
|
|
165
198
|
def on_update(self, obj, data, request=None):
|
|
166
199
|
pass
|
|
167
200
|
|
|
@@ -169,7 +202,7 @@ class UserAdmin(ModelAdmin):
|
|
|
169
202
|
if request is None:
|
|
170
203
|
return
|
|
171
204
|
perm_data = getattr(request.state, "_admin_perm_data", None)
|
|
172
|
-
if perm_data:
|
|
205
|
+
if perm_data is not None:
|
|
173
206
|
request.state._admin_perm_perm_ids = perm_data
|
|
174
207
|
request.state._admin_perm_user_obj = obj
|
|
175
208
|
|
|
@@ -177,7 +210,7 @@ class UserAdmin(ModelAdmin):
|
|
|
177
210
|
if request is None:
|
|
178
211
|
return
|
|
179
212
|
perm_data = getattr(request.state, "_admin_perm_data", None)
|
|
180
|
-
if perm_data:
|
|
213
|
+
if perm_data is not None:
|
|
181
214
|
request.state._admin_perm_perm_ids = perm_data
|
|
182
215
|
request.state._admin_perm_user_obj = obj
|
|
183
216
|
|