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