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.
Files changed (268) hide show
  1. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/PKG-INFO +1 -1
  2. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/example/example_ai.py +1 -1
  3. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/example/example_custom_templates.py +1 -1
  4. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/__init__.py +1 -1
  5. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/admin_database.py +15 -0
  6. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/core.py +81 -1
  7. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/backend.py +0 -2
  8. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/mixins.py +18 -0
  9. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/views.py +1 -2
  10. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/backends/memory.py +10 -0
  11. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/backends/protocols.py +18 -0
  12. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/backends/sqlalchemy.py +506 -63
  13. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/cli/user.py +1 -1
  14. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/form/pipeline.py +6 -0
  15. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/form/types.py +1 -0
  16. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/dispatcher.py +71 -29
  17. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/router.py +2 -0
  18. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/storage/local.py +38 -3
  19. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/admin/base_detail.html +3 -2
  20. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/admin/base_form.html +4 -2
  21. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/macros/form_fields.html +4 -4
  22. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/detail_field.html +2 -2
  23. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/inline_edit_form.html +1 -0
  24. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/class_views.py +3 -0
  25. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/context.py +1 -0
  26. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/factory.py +3 -2
  27. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/file_handler.py +46 -5
  28. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/renderers.py +1 -1
  29. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/widgets/inputs.py +52 -3
  30. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/widgets/resolver.py +2 -1
  31. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/.gitignore +0 -0
  32. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/CHANGELOG.md +0 -0
  33. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/LICENSE +0 -0
  34. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/README.md +0 -0
  35. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/SECURITY.md +0 -0
  36. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/example/__init__.py +0 -0
  37. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/example/custom_templates/admin/list.html +0 -0
  38. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/example/custom_templates/admin/products/list.html +0 -0
  39. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/example/example_notifications.py +0 -0
  40. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/example/validate_ws.py +0 -0
  41. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/actions/__init__.py +0 -0
  42. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/actions/base.py +0 -0
  43. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/actions/registry.py +0 -0
  44. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/__init__.py +0 -0
  45. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/admin_config.py +0 -0
  46. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/admin_router.py +0 -0
  47. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/admin_template.py +0 -0
  48. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/builtin_models.py +0 -0
  49. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/decorators.py +0 -0
  50. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/admin/state.py +0 -0
  51. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/__init__.py +0 -0
  52. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/agent.py +0 -0
  53. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/attachments.py +0 -0
  54. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/backends/__init__.py +0 -0
  55. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/backends/pydantic_ai_backend.py +0 -0
  56. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/backends/repairer.py +0 -0
  57. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/builtin_tools.py +0 -0
  58. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/config.py +0 -0
  59. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/conversation.py +0 -0
  60. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/dashboard.py +0 -0
  61. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/data_access.py +0 -0
  62. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/deps.py +0 -0
  63. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/errors.py +0 -0
  64. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/model_agent.py +0 -0
  65. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/plugin.py +0 -0
  66. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/prompts.py +0 -0
  67. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/serialization.py +0 -0
  68. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/service.py +0 -0
  69. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/tools.py +0 -0
  70. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/ui/__init__.py +0 -0
  71. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/ui/native.py +0 -0
  72. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ai/usage.py +0 -0
  73. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/__init__.py +0 -0
  74. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/auth.py +0 -0
  75. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/crud.py +0 -0
  76. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/deps.py +0 -0
  77. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/middleware.py +0 -0
  78. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/roles.py +0 -0
  79. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/schema_generator.py +0 -0
  80. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/schemas.py +0 -0
  81. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/search.py +0 -0
  82. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/api/security.py +0 -0
  83. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/__init__.py +0 -0
  84. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/context.py +0 -0
  85. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/diff.py +0 -0
  86. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/event_bus.py +0 -0
  87. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/events.py +0 -0
  88. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/listener.py +0 -0
  89. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/logger.py +0 -0
  90. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/middleware.py +0 -0
  91. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/models.py +0 -0
  92. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/audit/sqlalchemy_logger.py +0 -0
  93. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/__init__.py +0 -0
  94. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/csrf.py +0 -0
  95. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/dependencies.py +0 -0
  96. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/hasher.py +0 -0
  97. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/identity.py +0 -0
  98. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/models.py +0 -0
  99. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/password.py +0 -0
  100. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/permissions.py +0 -0
  101. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/protocol.py +0 -0
  102. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/proxy.py +0 -0
  103. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/ratelimit.py +0 -0
  104. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/router.py +0 -0
  105. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/session.py +0 -0
  106. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/totp.py +0 -0
  107. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/auth/types.py +0 -0
  108. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/backends/__init__.py +0 -0
  109. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/cli/__init__.py +0 -0
  110. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/cli/__main__.py +0 -0
  111. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/cli/helpers.py +0 -0
  112. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/cli/migrate.py +0 -0
  113. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/cli/permissions.py +0 -0
  114. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/cli/scaffold.py +0 -0
  115. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/__init__.py +0 -0
  116. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/ai_chat.py +0 -0
  117. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/audit.py +0 -0
  118. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/auth.py +0 -0
  119. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/behavior.py +0 -0
  120. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/cache.py +0 -0
  121. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/database.py +0 -0
  122. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/nav.py +0 -0
  123. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/storage.py +0 -0
  124. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/theme.py +0 -0
  125. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/config/ui.py +0 -0
  126. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/dashboard/__init__.py +0 -0
  127. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/db.py +0 -0
  128. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/exceptions.py +0 -0
  129. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/export_import/__init__.py +0 -0
  130. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/export_import/base.py +0 -0
  131. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/export_import/csv.py +0 -0
  132. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/export_import/excel.py +0 -0
  133. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/export_import/registry.py +0 -0
  134. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/field_types.py +0 -0
  135. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/filters/__init__.py +0 -0
  136. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/filters/base.py +0 -0
  137. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/filters/lookups.py +0 -0
  138. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/filters/registry.py +0 -0
  139. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/flash.py +0 -0
  140. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/form/__init__.py +0 -0
  141. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/inline.py +0 -0
  142. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/inspection/__init__.py +0 -0
  143. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/inspection/registry.py +0 -0
  144. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/inspection/types.py +0 -0
  145. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/inspection.py +0 -0
  146. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/migrations/__init__.py +0 -0
  147. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/migrations/models.py +0 -0
  148. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/modeladmin.py +0 -0
  149. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/models/__init__.py +0 -0
  150. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/models/base.py +0 -0
  151. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/nav.py +0 -0
  152. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/__init__.py +0 -0
  153. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/config.py +0 -0
  154. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/email.py +0 -0
  155. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/models.py +0 -0
  156. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/plugin.py +0 -0
  157. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/realtime.py +0 -0
  158. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/router.py +0 -0
  159. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/schemas.py +0 -0
  160. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/service.py +0 -0
  161. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/sms/__init__.py +0 -0
  162. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/sms/base.py +0 -0
  163. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/sms/twilio.py +0 -0
  164. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/notifications/store.py +0 -0
  165. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/pagination/__init__.py +0 -0
  166. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/pagination/base.py +0 -0
  167. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/pagination/cursor.py +0 -0
  168. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/pagination/dynamic.py +0 -0
  169. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/pagination/offset.py +0 -0
  170. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/plugins/__init__.py +0 -0
  171. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/py.typed +0 -0
  172. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/redis.py +0 -0
  173. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/registry/__init__.py +0 -0
  174. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/registry/core.py +0 -0
  175. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/registry/validation.py +0 -0
  176. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/registry.py +0 -0
  177. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/schemas/__init__.py +0 -0
  178. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/schemas/builtin.py +0 -0
  179. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/schemas/schema.py +0 -0
  180. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/search_utils.py +0 -0
  181. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/static/css/admin.css +0 -0
  182. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/static/css/presets.css +0 -0
  183. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/static/css/tokens.css +0 -0
  184. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/static/css/variables.css +0 -0
  185. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/static/icons/heroicons.svg +0 -0
  186. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/static/js/admin.js +0 -0
  187. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/static/js/htmx-config.js +0 -0
  188. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/storage/__init__.py +0 -0
  189. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/storage/base.py +0 -0
  190. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/admin/base_list.html +0 -0
  191. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/base.html +0 -0
  192. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/macros/icons.html +0 -0
  193. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/macros/table.html +0 -0
  194. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/macros/widgets.html +0 -0
  195. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/2fa/setup.html +0 -0
  196. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/2fa/verify.html +0 -0
  197. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/403.html +0 -0
  198. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/ai/agents.html +0 -0
  199. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/ai/chat.html +0 -0
  200. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/ai/chat_htmx.html +0 -0
  201. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/ai/dashboard.html +0 -0
  202. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/ai/logs.html +0 -0
  203. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/ai/tools.html +0 -0
  204. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/audit_detail.html +0 -0
  205. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/audit_log.html +0 -0
  206. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/dashboard.html +0 -0
  207. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/detail.html +0 -0
  208. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/form.html +0 -0
  209. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/list.html +0 -0
  210. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/login.html +0 -0
  211. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/profile/password.html +0 -0
  212. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/profile/profile.html +0 -0
  213. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/role_form.html +0 -0
  214. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/roles/form.html +0 -0
  215. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/roles/list.html +0 -0
  216. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/roles.html +0 -0
  217. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/search.html +0 -0
  218. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/settings/theme.html +0 -0
  219. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/users/form.html +0 -0
  220. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/pages/users/list.html +0 -0
  221. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/_inline_edit_row.html +0 -0
  222. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/ai_chat_widget.html +0 -0
  223. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/command_palette.html +0 -0
  224. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/field_wrapper.html +0 -0
  225. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/flash_messages.html +0 -0
  226. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/head.html +0 -0
  227. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/head_minimal.html +0 -0
  228. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/inline_stacked.html +0 -0
  229. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/inline_tabular.html +0 -0
  230. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/list_table.html +0 -0
  231. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/mobile_backdrop.html +0 -0
  232. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/pagination.html +0 -0
  233. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/perm_select_widget.html +0 -0
  234. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/permission_widget.html +0 -0
  235. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/scripts.html +0 -0
  236. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/sidebar.html +0 -0
  237. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/templates/partials/topbar.html +0 -0
  238. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/types.py +0 -0
  239. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ui/__init__.py +0 -0
  240. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/ui/types.py +0 -0
  241. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/validation.py +0 -0
  242. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/__init__.py +0 -0
  243. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/audit.py +0 -0
  244. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/bulk.py +0 -0
  245. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/dashboard.py +0 -0
  246. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/delete.py +0 -0
  247. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/extra.py +0 -0
  248. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/form.py +0 -0
  249. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/list.py +0 -0
  250. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/list_context.py +0 -0
  251. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/model_saver.py +0 -0
  252. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/profile.py +0 -0
  253. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/protocols.py +0 -0
  254. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/roles.py +0 -0
  255. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/search.py +0 -0
  256. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/settings.py +0 -0
  257. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/sidebar.py +0 -0
  258. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/totp.py +0 -0
  259. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views/users.py +0 -0
  260. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/views.py +0 -0
  261. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/widgets/__init__.py +0 -0
  262. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/widgets/base.py +0 -0
  263. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/widgets/registry.py +0 -0
  264. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/fastapi_admin_kit/widgets/relation.py +0 -0
  265. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/mkdocs.yml +0 -0
  266. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/pyproject.toml +0 -0
  267. {fastapi_admin_kit-0.5.0 → fastapi_admin_kit-0.5.1}/scripts/generate_changelog.py +0 -0
  268. {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.0
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
- hashed_password=hashed,
838
+ password=hashed,
839
839
  full_name="Admin",
840
840
  is_superuser=True,
841
841
  is_active=True,
@@ -165,7 +165,7 @@ async def lifespan(app: FastAPI):
165
165
  session.add(
166
166
  User(
167
167
  email="admin@example.com",
168
- hashed_password=hashed,
168
+ password=hashed,
169
169
  full_name="Admin",
170
170
  is_superuser=True,
171
171
  is_active=True,
@@ -134,4 +134,4 @@ __all__ = [
134
134
  "configure_notifications",
135
135
  "notifications_router",
136
136
  ]
137
- __version__ = "0.5.0"
137
+ __version__ = "0.5.1"
@@ -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", "admin_user_roles")
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
- print("login user: ", user)
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
+ ...