fastapi-admin-kit 0.5.0__tar.gz → 0.5.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.5.0 → fastapi_admin_kit-0.5.1}/PKG-INFO +1 -1
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/example/example_ai.py +1 -1
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/example/example_custom_templates.py +1 -1
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/__init__.py +1 -1
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/admin_database.py +15 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/core.py +81 -1
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/backend.py +0 -2
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/mixins.py +18 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/views.py +1 -2
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/backends/memory.py +10 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/backends/protocols.py +18 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/backends/sqlalchemy.py +506 -63
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/cli/user.py +1 -1
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/form/pipeline.py +6 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/form/types.py +1 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/dispatcher.py +71 -29
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/router.py +2 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/storage/local.py +38 -3
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/admin/base_detail.html +3 -2
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/admin/base_form.html +4 -2
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/macros/form_fields.html +4 -4
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/detail_field.html +2 -2
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/inline_edit_form.html +1 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/class_views.py +3 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/context.py +1 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/factory.py +3 -2
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/file_handler.py +46 -5
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/renderers.py +1 -1
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/widgets/inputs.py +52 -3
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/widgets/resolver.py +2 -1
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/.gitignore +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/CHANGELOG.md +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/LICENSE +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/README.md +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/SECURITY.md +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/example/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/example/custom_templates/admin/list.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/example/custom_templates/admin/products/list.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/example/example_notifications.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/example/validate_ws.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/actions/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/actions/base.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/actions/registry.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/admin_config.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/admin_router.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/admin_template.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/builtin_models.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/decorators.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/state.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/agent.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/attachments.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/backends/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/backends/pydantic_ai_backend.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/backends/repairer.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/builtin_tools.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/config.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/conversation.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/dashboard.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/data_access.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/deps.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/errors.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/model_agent.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/plugin.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/prompts.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/serialization.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/service.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/tools.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/ui/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/ui/native.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/usage.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/auth.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/crud.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/deps.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/middleware.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/roles.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/schema_generator.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/schemas.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/search.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/security.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/context.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/diff.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/event_bus.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/events.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/listener.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/logger.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/middleware.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/models.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/sqlalchemy_logger.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/csrf.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/dependencies.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/hasher.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/identity.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/models.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/password.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/permissions.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/protocol.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/proxy.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/ratelimit.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/router.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/session.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/totp.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/types.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/backends/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/cli/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/cli/__main__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/cli/helpers.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/cli/migrate.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/cli/permissions.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/cli/scaffold.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/ai_chat.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/audit.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/auth.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/behavior.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/cache.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/database.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/nav.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/storage.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/theme.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/ui.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/dashboard/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/db.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/exceptions.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/export_import/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/export_import/base.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/export_import/csv.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/export_import/excel.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/export_import/registry.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/field_types.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/filters/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/filters/base.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/filters/lookups.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/filters/registry.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/flash.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/form/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/inline.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/inspection/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/inspection/registry.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/inspection/types.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/inspection.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/migrations/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/migrations/models.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/modeladmin.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/models/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/models/base.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/nav.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/config.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/email.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/models.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/plugin.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/realtime.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/router.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/schemas.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/service.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/sms/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/sms/base.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/sms/twilio.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/store.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/pagination/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/pagination/base.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/pagination/cursor.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/pagination/dynamic.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/pagination/offset.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/plugins/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/py.typed +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/redis.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/registry/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/registry/core.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/registry/validation.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/registry.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/schemas/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/schemas/builtin.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/schemas/schema.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/search_utils.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/static/css/admin.css +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/static/css/presets.css +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/static/css/tokens.css +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/static/css/variables.css +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/static/icons/heroicons.svg +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/static/js/admin.js +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/static/js/htmx-config.js +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/storage/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/storage/base.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/admin/base_list.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/base.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/macros/icons.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/macros/table.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/macros/widgets.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/2fa/setup.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/2fa/verify.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/403.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/ai/agents.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/ai/chat.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/ai/chat_htmx.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/ai/dashboard.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/ai/logs.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/ai/tools.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/audit_detail.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/audit_log.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/dashboard.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/detail.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/form.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/list.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/login.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/profile/password.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/profile/profile.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/role_form.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/roles/form.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/roles/list.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/roles.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/search.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/settings/theme.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/users/form.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/users/list.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/_inline_edit_row.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/ai_chat_widget.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/command_palette.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/field_wrapper.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/flash_messages.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/head.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/head_minimal.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/inline_stacked.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/inline_tabular.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/list_table.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/mobile_backdrop.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/pagination.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/perm_select_widget.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/permission_widget.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/scripts.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/sidebar.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/topbar.html +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/types.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ui/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ui/types.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/validation.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/audit.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/bulk.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/dashboard.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/delete.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/extra.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/form.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/list.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/list_context.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/model_saver.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/profile.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/protocols.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/roles.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/search.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/settings.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/sidebar.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/totp.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/users.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/widgets/__init__.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/widgets/base.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/widgets/registry.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/widgets/relation.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/mkdocs.yml +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/pyproject.toml +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/scripts/generate_changelog.py +0 -0
- {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/test_on_complete.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: fastapi-admin-kit
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.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/
|
|
@@ -835,7 +835,7 @@ async def seed_admin(session: AsyncSession) -> None:
|
|
|
835
835
|
hashed = bcrypt.hashpw(b"admin", bcrypt.gensalt()).decode()
|
|
836
836
|
admin_user = User(
|
|
837
837
|
email="admin@example.com",
|
|
838
|
-
|
|
838
|
+
password=hashed,
|
|
839
839
|
full_name="Admin",
|
|
840
840
|
is_superuser=True,
|
|
841
841
|
is_active=True,
|
{fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/admin_database.py
RENAMED
|
@@ -94,6 +94,21 @@ class AdminDatabase:
|
|
|
94
94
|
|
|
95
95
|
exclude = set(extra_exclude_tables or ())
|
|
96
96
|
|
|
97
|
+
# If the configured backend cloned the project's auth_model table
|
|
98
|
+
# into AdminBase.metadata (so its FK can resolve within the same
|
|
99
|
+
# MetaData), drop the clone from the create_all table list — the
|
|
100
|
+
# project's own metadata owns the real table and DDL for it
|
|
101
|
+
# would conflict. Check both the backend and the database
|
|
102
|
+
# instance for the cloned names (the backend stores them on the
|
|
103
|
+
# database when available, which is the more reliable path for
|
|
104
|
+
# tests that swap the backend).
|
|
105
|
+
cloned = set()
|
|
106
|
+
backend = getattr(self, "_backend", None)
|
|
107
|
+
if backend is not None:
|
|
108
|
+
cloned = getattr(backend, "_cloned_auth_tables", set()) or set()
|
|
109
|
+
cloned |= getattr(self, "_cloned_auth_tables", set()) or set()
|
|
110
|
+
exclude |= cloned
|
|
111
|
+
|
|
97
112
|
def _filtered(metadata: Any) -> Any:
|
|
98
113
|
drop = exclude | (set() if include_ai_tables else AI_TABLE_NAMES)
|
|
99
114
|
if not drop:
|
|
@@ -1162,6 +1162,32 @@ class Admin:
|
|
|
1162
1162
|
return getattr(obj, name, "")
|
|
1163
1163
|
|
|
1164
1164
|
self._jinja_env.env.filters["slugify"] = slugify
|
|
1165
|
+
|
|
1166
|
+
def file_url(path: Any) -> str:
|
|
1167
|
+
"""Map a stored file path to its public URL for ``src``/``href``.
|
|
1168
|
+
|
|
1169
|
+
Storage keeps relative paths (``"documents/uuid.jpg"``) so that
|
|
1170
|
+
``upload_dir / path`` and ``delete(path)`` work. Browsers need
|
|
1171
|
+
an absolute public URL (``"/uploads/documents/uuid.jpg"``), so
|
|
1172
|
+
templates must pipe stored values through this filter instead
|
|
1173
|
+
of rendering them raw.
|
|
1174
|
+
"""
|
|
1175
|
+
if not path:
|
|
1176
|
+
return ""
|
|
1177
|
+
s = str(path)
|
|
1178
|
+
if s.startswith(("http://", "https://", "data:", "blob:")):
|
|
1179
|
+
return s
|
|
1180
|
+
storage = getattr(getattr(self.config, "storage", None), "storage", None)
|
|
1181
|
+
if storage is not None and hasattr(storage, "url"):
|
|
1182
|
+
try:
|
|
1183
|
+
return storage.url(s)
|
|
1184
|
+
except Exception:
|
|
1185
|
+
pass
|
|
1186
|
+
storage_cfg = getattr(self.config, "storage", None)
|
|
1187
|
+
base = (getattr(storage_cfg, "uploads_url", None) or "/uploads").rstrip("/")
|
|
1188
|
+
return f"{base}/{s.lstrip('/')}"
|
|
1189
|
+
|
|
1190
|
+
self._jinja_env.env.filters["file_url"] = file_url
|
|
1165
1191
|
self._jinja_env.env.globals["attr"] = _attr
|
|
1166
1192
|
from fastapi_admin_kit.inspection import model_display_name
|
|
1167
1193
|
|
|
@@ -1481,6 +1507,18 @@ class Admin:
|
|
|
1481
1507
|
"""Return the names of built-in tables that should NOT be created when
|
|
1482
1508
|
a custom ``auth_model`` is configured.
|
|
1483
1509
|
|
|
1510
|
+
When the project supplies its own user model (``auth_model=``), the
|
|
1511
|
+
built-in ``admin_users`` table is skipped — the custom auth_model
|
|
1512
|
+
is the source of truth for user identity. ``admin_user_roles`` is
|
|
1513
|
+
kept and its ``user_id`` foreign key is retargeted to the custom
|
|
1514
|
+
auth_model's table at create time (see
|
|
1515
|
+
``SqlAlchemyDatabaseBackend.adapt_auth_model``) so the junction
|
|
1516
|
+
links roles to the project's own user rows.
|
|
1517
|
+
|
|
1518
|
+
The role/permission system (``admin_roles``,
|
|
1519
|
+
``admin_role_permissions``, ``admin_permissions``) is kept so the
|
|
1520
|
+
admin can still manage granular per-table access.
|
|
1521
|
+
|
|
1484
1522
|
Returns an empty tuple when the built-in ``User`` is in use (default
|
|
1485
1523
|
installation) or when no ``auth_model`` is configured.
|
|
1486
1524
|
"""
|
|
@@ -1489,7 +1527,7 @@ class Admin:
|
|
|
1489
1527
|
auth_model = self.config.auth.auth_model
|
|
1490
1528
|
if auth_model is None or auth_model is BuiltinUser:
|
|
1491
1529
|
return ()
|
|
1492
|
-
return ("admin_users",
|
|
1530
|
+
return ("admin_users",)
|
|
1493
1531
|
|
|
1494
1532
|
async def create_tables(self) -> None:
|
|
1495
1533
|
"""Create all admin database tables, correctly handling a custom
|
|
@@ -1522,6 +1560,27 @@ class Admin:
|
|
|
1522
1560
|
logger.info("SKIP_CREATE_TABLES=true: skipping admin table creation")
|
|
1523
1561
|
return
|
|
1524
1562
|
self._adapt_builtin_user_id_columns()
|
|
1563
|
+
# Ask the configured backend to retarget the built-in user
|
|
1564
|
+
# relations (admin_user_roles FK, Role.users M2M, etc.) at the
|
|
1565
|
+
# custom auth_model. Each backend implements this against its own
|
|
1566
|
+
# ORM primitives; non-SQLA backends may no-op.
|
|
1567
|
+
#
|
|
1568
|
+
# Use ``self.database._backend`` (the backend that actually performs
|
|
1569
|
+
# DDL in ``_create_tables`` below) rather than the composite
|
|
1570
|
+
# ``self.backend.database`` so tests that swap
|
|
1571
|
+
# ``admin.database._backend`` with a fake do not mutate the global
|
|
1572
|
+
# SQLAlchemy mapper state. A backend without ``adapt_auth_model``
|
|
1573
|
+
# (e.g. a test fake or memory backend) is treated as no-op.
|
|
1574
|
+
database_backend = getattr(self.database, "_backend", None)
|
|
1575
|
+
adapt = getattr(database_backend, "adapt_auth_model", None)
|
|
1576
|
+
if adapt is not None and self.config.auth.auth_model is not None:
|
|
1577
|
+
try:
|
|
1578
|
+
from fastapi_admin_kit.migrations.models import User as BuiltinUser
|
|
1579
|
+
|
|
1580
|
+
if self.config.auth.auth_model is not BuiltinUser:
|
|
1581
|
+
adapt(self.config.auth.auth_model)
|
|
1582
|
+
except Exception as exc: # pragma: no cover - defensive
|
|
1583
|
+
logger.warning("adapt_auth_model failed: %s", exc)
|
|
1525
1584
|
extra_exclude = list(self._builtin_user_tables_to_skip())
|
|
1526
1585
|
if extra_exclude:
|
|
1527
1586
|
logger.info(
|
|
@@ -1607,6 +1666,18 @@ class Admin:
|
|
|
1607
1666
|
)
|
|
1608
1667
|
col.type = new_type
|
|
1609
1668
|
|
|
1669
|
+
# Note: the built-in ``admin_users`` table is excluded from
|
|
1670
|
+
# ``create_all`` at the call site in ``setup()`` via
|
|
1671
|
+
# ``AdminDatabase._create_tables(extra_exclude_tables=...)`` — we do
|
|
1672
|
+
# NOT remove it from ``AdminBase.metadata`` here because the
|
|
1673
|
+
# ``FacadeDict`` exposed by ``Base.metadata`` is immutable.
|
|
1674
|
+
#
|
|
1675
|
+
# FK retargeting on ``admin_user_roles`` and the ``Role.users`` M2M
|
|
1676
|
+
# re-binding are delegated to the configured backend via
|
|
1677
|
+
# ``backend.adapt_auth_model(auth_model)`` — this keeps ``core.py``
|
|
1678
|
+
# ORM-agnostic. Backends (SQLAlchemy) implement the actual column
|
|
1679
|
+
# and relationship mutations; memory/no-op backends can ignore.
|
|
1680
|
+
|
|
1610
1681
|
# Note: the built-in ``admin_users`` and ``admin_user_roles`` tables
|
|
1611
1682
|
# are excluded from ``create_all`` at the call site in ``setup()`` via
|
|
1612
1683
|
# ``AdminDatabase._create_tables(extra_exclude_tables=...)`` — we do
|
|
@@ -1625,12 +1696,21 @@ class Admin:
|
|
|
1625
1696
|
three user-facing AI tables so they never leak into the sidebar/routes.
|
|
1626
1697
|
When notifications are disabled, also excludes the notification tables
|
|
1627
1698
|
so the "notifications" sidebar group never appears.
|
|
1699
|
+
|
|
1700
|
+
When a custom ``auth_model`` is configured, also excludes the built-in
|
|
1701
|
+
``admin_users`` model from auto-discovery (it is never created when a
|
|
1702
|
+
custom auth_model is set — see ``_builtin_user_tables_to_skip``). The
|
|
1703
|
+
``admin_user_roles`` junction table is NOT excluded: it is kept and its
|
|
1704
|
+
``user_id`` foreign key is retargeted to the custom auth_model's table
|
|
1705
|
+
so role relationships still work end-to-end.
|
|
1628
1706
|
"""
|
|
1629
1707
|
excluded = set(INTERNAL_TABLE_NAMES) # incl. admin_ai_attachments
|
|
1630
1708
|
if not self._ai_enabled:
|
|
1631
1709
|
excluded |= AI_TABLE_NAMES
|
|
1632
1710
|
if not self._enable_notification:
|
|
1633
1711
|
excluded |= NOTIFICATION_TABLE_NAMES
|
|
1712
|
+
if self._builtin_user_tables_to_skip():
|
|
1713
|
+
excluded |= {"admin_users"}
|
|
1634
1714
|
return frozenset(excluded)
|
|
1635
1715
|
|
|
1636
1716
|
def _add_ai_nav_group(self) -> None:
|
|
@@ -137,8 +137,6 @@ class BuiltinAuthBackend(AuthBackend):
|
|
|
137
137
|
session = self._resolve_session(session)
|
|
138
138
|
model = self._get_model()
|
|
139
139
|
field = getattr(model, login_field, None)
|
|
140
|
-
print("model: ", model)
|
|
141
|
-
print("field: ", field)
|
|
142
140
|
if field is None:
|
|
143
141
|
field = getattr(model, "email", None)
|
|
144
142
|
if field is None:
|
|
@@ -63,6 +63,24 @@ class AuthModelMixin:
|
|
|
63
63
|
return []
|
|
64
64
|
return [r.id for r in roles]
|
|
65
65
|
|
|
66
|
+
def __str__(self) -> str:
|
|
67
|
+
"""Return a human-readable identifier for the user.
|
|
68
|
+
|
|
69
|
+
Prefers ``email``, falls back to ``username``, then to ``id``.
|
|
70
|
+
Prevents admin templates from dumping raw SQLAlchemy ``__repr__``
|
|
71
|
+
output when the inheriting model does not define ``__str__``.
|
|
72
|
+
"""
|
|
73
|
+
email = getattr(self, "email", None)
|
|
74
|
+
if email:
|
|
75
|
+
return str(email)
|
|
76
|
+
username = getattr(self, "username", None)
|
|
77
|
+
if username:
|
|
78
|
+
return str(username)
|
|
79
|
+
return str(getattr(self, "id", ""))
|
|
80
|
+
|
|
81
|
+
def __repr__(self) -> str:
|
|
82
|
+
return f"<{type(self).__name__} {self.__str__()}>"
|
|
83
|
+
|
|
66
84
|
def verify_password(self, password: str) -> bool:
|
|
67
85
|
"""Check if plaintext password matches the stored hash."""
|
|
68
86
|
from fastapi_admin_kit.auth.password import password_manager
|
|
@@ -120,9 +120,8 @@ async def login_post(
|
|
|
120
120
|
login_field=login_field,
|
|
121
121
|
query_adapter=query_adapter,
|
|
122
122
|
)
|
|
123
|
-
|
|
123
|
+
|
|
124
124
|
except TypeError:
|
|
125
|
-
print("login user error: ", user)
|
|
126
125
|
# Custom backends that don't accept query_adapter
|
|
127
126
|
user = await auth_backend.authenticate(username, password, session, login_field=login_field)
|
|
128
127
|
if user is not None:
|
|
@@ -565,6 +565,16 @@ class MemoryDatabaseBackend:
|
|
|
565
565
|
def session_adapter_class(self) -> type:
|
|
566
566
|
return MemorySessionBackend
|
|
567
567
|
|
|
568
|
+
def adapt_auth_model(self, auth_model: Any) -> None:
|
|
569
|
+
"""No-op for the in-memory backend.
|
|
570
|
+
|
|
571
|
+
Memory backend schemas are flat dicts; there is no foreign-key or
|
|
572
|
+
relationship machinery to retarget. Custom auth_models work as-is
|
|
573
|
+
because the auth layer always queries through the model attribute
|
|
574
|
+
lookup, not the table.
|
|
575
|
+
"""
|
|
576
|
+
return None
|
|
577
|
+
|
|
568
578
|
|
|
569
579
|
# ---------------------------------------------------------------------------
|
|
570
580
|
# Composite backend
|
|
@@ -278,3 +278,21 @@ class DatabaseBackend(Protocol):
|
|
|
278
278
|
directly and never needs this.
|
|
279
279
|
"""
|
|
280
280
|
...
|
|
281
|
+
|
|
282
|
+
def adapt_auth_model(self, auth_model: type) -> None:
|
|
283
|
+
"""Retarget built-in user relations at a custom ``auth_model``.
|
|
284
|
+
|
|
285
|
+
Called once during ``Admin.create_tables()`` when a custom
|
|
286
|
+
``auth_model`` is configured. Backends should:
|
|
287
|
+
|
|
288
|
+
- retarget the built-in ``admin_user_roles`` user-side foreign key to
|
|
289
|
+
the auth_model's table,
|
|
290
|
+
- mirror the auth_model's primary-key type onto the
|
|
291
|
+
``admin_user_roles.user_id`` column,
|
|
292
|
+
- rebind any M2M relationships that pointed at the built-in
|
|
293
|
+
``admin_users`` model (e.g. ``Role.users``) so joins route to the
|
|
294
|
+
custom auth_model.
|
|
295
|
+
|
|
296
|
+
Non-SQLA backends (memory, future ODMs) may no-op.
|
|
297
|
+
"""
|
|
298
|
+
...
|