fastapi-admin-kit 0.3.0__tar.gz → 0.3.2__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 (206) hide show
  1. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/PKG-INFO +5 -1
  2. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/__init__.py +7 -1
  3. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/admin_database.py +13 -8
  4. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/admin_template.py +3 -0
  5. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/builtin_models.py +2 -0
  6. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/core.py +20 -6
  7. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/context.py +33 -1
  8. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/events.py +2 -2
  9. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/logger.py +8 -0
  10. fastapi_admin_kit-0.3.2/fastapi_admin_kit/audit/models.py +22 -0
  11. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/sqlalchemy_logger.py +6 -0
  12. fastapi_admin_kit-0.3.2/fastapi_admin_kit/auth/models.py +45 -0
  13. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/permissions.py +15 -1
  14. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/types.py +2 -0
  15. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/backends/sqlalchemy.py +243 -4
  16. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/cli/__init__.py +1 -1
  17. fastapi_admin_kit-0.3.2/fastapi_admin_kit/cli/migrate.py +636 -0
  18. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/behavior.py +2 -0
  19. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/nav.py +2 -0
  20. fastapi_admin_kit-0.3.2/fastapi_admin_kit/export_import/__init__.py +28 -0
  21. fastapi_admin_kit-0.3.2/fastapi_admin_kit/export_import/base.py +387 -0
  22. fastapi_admin_kit-0.3.2/fastapi_admin_kit/export_import/csv.py +181 -0
  23. fastapi_admin_kit-0.3.2/fastapi_admin_kit/export_import/excel.py +193 -0
  24. fastapi_admin_kit-0.3.2/fastapi_admin_kit/export_import/registry.py +85 -0
  25. fastapi_admin_kit-0.3.2/fastapi_admin_kit/migrations/models.py +116 -0
  26. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/modeladmin.py +99 -2
  27. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/router.py +202 -0
  28. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/schemas/builtin.py +95 -0
  29. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/schemas/schema.py +3 -0
  30. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/static/js/admin.js +4 -0
  31. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/macros/icons.html +1 -0
  32. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/dashboard.html +1 -6
  33. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/form.html +10 -1
  34. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/list.html +86 -3
  35. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/list_table.html +14 -2
  36. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/sidebar.html +10 -8
  37. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/class_views.py +97 -20
  38. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/context.py +4 -0
  39. fastapi_admin_kit-0.3.2/fastapi_admin_kit/views/factory.py +629 -0
  40. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/renderers.py +139 -13
  41. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/pyproject.toml +3 -0
  42. fastapi_admin_kit-0.3.0/fastapi_admin_kit/audit/models.py +0 -51
  43. fastapi_admin_kit-0.3.0/fastapi_admin_kit/auth/models.py +0 -240
  44. fastapi_admin_kit-0.3.0/fastapi_admin_kit/cli/migrate.py +0 -266
  45. fastapi_admin_kit-0.3.0/fastapi_admin_kit/views/factory.py +0 -14
  46. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/.gitignore +0 -0
  47. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/CHANGELOG.md +0 -0
  48. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/LICENSE +0 -0
  49. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/README.md +0 -0
  50. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/actions/__init__.py +0 -0
  51. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/actions/base.py +0 -0
  52. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/actions/registry.py +0 -0
  53. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/__init__.py +0 -0
  54. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/admin_config.py +0 -0
  55. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/admin_router.py +0 -0
  56. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/decorators.py +0 -0
  57. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/admin/state.py +0 -0
  58. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/__init__.py +0 -0
  59. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/auth.py +0 -0
  60. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/crud.py +0 -0
  61. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/deps.py +0 -0
  62. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/roles.py +0 -0
  63. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/schema_generator.py +0 -0
  64. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/schemas.py +0 -0
  65. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/api/search.py +0 -0
  66. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/__init__.py +0 -0
  67. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/diff.py +0 -0
  68. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/event_bus.py +0 -0
  69. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/listener.py +0 -0
  70. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/audit/middleware.py +0 -0
  71. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/__init__.py +0 -0
  72. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/backend.py +0 -0
  73. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/csrf.py +0 -0
  74. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/dependencies.py +0 -0
  75. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/hasher.py +0 -0
  76. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/identity.py +0 -0
  77. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/mixins.py +0 -0
  78. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/password.py +0 -0
  79. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/protocol.py +0 -0
  80. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/ratelimit.py +0 -0
  81. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/router.py +0 -0
  82. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/session.py +0 -0
  83. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/totp.py +0 -0
  84. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/auth/views.py +0 -0
  85. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/backends/__init__.py +0 -0
  86. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/backends/protocols.py +0 -0
  87. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/cli/__main__.py +0 -0
  88. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/cli/helpers.py +0 -0
  89. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/cli/permissions.py +0 -0
  90. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/cli/scaffold.py +0 -0
  91. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/cli/user.py +0 -0
  92. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/__init__.py +0 -0
  93. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/audit.py +0 -0
  94. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/auth.py +0 -0
  95. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/database.py +0 -0
  96. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/storage.py +0 -0
  97. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/theme.py +0 -0
  98. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/config/ui.py +0 -0
  99. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/dashboard/__init__.py +0 -0
  100. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/db.py +0 -0
  101. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/exceptions.py +0 -0
  102. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/field_types.py +0 -0
  103. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/filters/__init__.py +0 -0
  104. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/filters/base.py +0 -0
  105. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/filters/registry.py +0 -0
  106. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/flash.py +0 -0
  107. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/form/__init__.py +0 -0
  108. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/form/pipeline.py +0 -0
  109. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/form/types.py +0 -0
  110. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/inline.py +0 -0
  111. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/inspection/__init__.py +0 -0
  112. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/inspection/registry.py +0 -0
  113. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/inspection/types.py +0 -0
  114. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/inspection.py +0 -0
  115. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/models/__init__.py +0 -0
  116. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/models/base.py +0 -0
  117. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/nav.py +0 -0
  118. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/pagination/__init__.py +0 -0
  119. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/pagination/base.py +0 -0
  120. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/pagination/cursor.py +0 -0
  121. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/pagination/dynamic.py +0 -0
  122. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/pagination/offset.py +0 -0
  123. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/plugins/__init__.py +0 -0
  124. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/py.typed +0 -0
  125. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/registry/__init__.py +0 -0
  126. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/registry/core.py +0 -0
  127. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/registry/validation.py +0 -0
  128. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/registry.py +0 -0
  129. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/schemas/__init__.py +0 -0
  130. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/search_utils.py +0 -0
  131. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/static/css/admin.css +0 -0
  132. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/static/css/presets.css +0 -0
  133. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/static/css/tokens.css +0 -0
  134. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/static/css/variables.css +0 -0
  135. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/static/icons/heroicons.svg +0 -0
  136. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/static/js/htmx-config.js +0 -0
  137. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/storage/__init__.py +0 -0
  138. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/storage/base.py +0 -0
  139. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/storage/local.py +0 -0
  140. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/base.html +0 -0
  141. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/macros/form_fields.html +0 -0
  142. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/macros/table.html +0 -0
  143. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/macros/widgets.html +0 -0
  144. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/2fa/setup.html +0 -0
  145. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/2fa/verify.html +0 -0
  146. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/403.html +0 -0
  147. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/audit_detail.html +0 -0
  148. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/audit_log.html +0 -0
  149. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/detail.html +0 -0
  150. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/login.html +0 -0
  151. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/profile/password.html +0 -0
  152. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/profile/profile.html +0 -0
  153. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/role_form.html +0 -0
  154. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/roles/form.html +0 -0
  155. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/roles/list.html +0 -0
  156. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/roles.html +0 -0
  157. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/search.html +0 -0
  158. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/settings/theme.html +0 -0
  159. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/users/form.html +0 -0
  160. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/pages/users/list.html +0 -0
  161. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/_inline_edit_row.html +0 -0
  162. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/command_palette.html +0 -0
  163. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/field_wrapper.html +0 -0
  164. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/flash_messages.html +0 -0
  165. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/head.html +0 -0
  166. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/head_minimal.html +0 -0
  167. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/inline_edit_form.html +0 -0
  168. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/inline_stacked.html +0 -0
  169. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/inline_tabular.html +0 -0
  170. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/mobile_backdrop.html +0 -0
  171. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/pagination.html +0 -0
  172. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/perm_select_widget.html +0 -0
  173. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/permission_widget.html +0 -0
  174. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/scripts.html +0 -0
  175. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/templates/partials/topbar.html +0 -0
  176. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/types.py +0 -0
  177. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/ui/__init__.py +0 -0
  178. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/ui/types.py +0 -0
  179. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/validation.py +0 -0
  180. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/__init__.py +0 -0
  181. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/audit.py +0 -0
  182. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/bulk.py +0 -0
  183. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/dashboard.py +0 -0
  184. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/delete.py +0 -0
  185. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/extra.py +0 -0
  186. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/file_handler.py +0 -0
  187. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/form.py +0 -0
  188. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/list.py +0 -0
  189. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/list_context.py +0 -0
  190. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/model_saver.py +0 -0
  191. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/profile.py +0 -0
  192. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/protocols.py +0 -0
  193. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/roles.py +0 -0
  194. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/search.py +0 -0
  195. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/settings.py +0 -0
  196. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/sidebar.py +0 -0
  197. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/totp.py +0 -0
  198. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views/users.py +0 -0
  199. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/views.py +0 -0
  200. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/widgets/__init__.py +0 -0
  201. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/widgets/base.py +0 -0
  202. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/widgets/inputs.py +0 -0
  203. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/widgets/registry.py +0 -0
  204. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/widgets/relation.py +0 -0
  205. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/fastapi_admin_kit/widgets/resolver.py +0 -0
  206. {fastapi_admin_kit-0.3.0 → fastapi_admin_kit-0.3.2}/mkdocs.yml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-admin-kit
3
- Version: 0.3.0
3
+ Version: 0.3.2
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/
@@ -31,6 +31,8 @@ Requires-Dist: jinja2>=3.1.0
31
31
  Requires-Dist: pre-commit>=4.6.0
32
32
  Requires-Dist: python-multipart>=0.0.9
33
33
  Requires-Dist: sqlalchemy>=2.0.0
34
+ Provides-Extra: alembic
35
+ Requires-Dist: alembic>=1.13.0; extra == 'alembic'
34
36
  Provides-Extra: dev
35
37
  Requires-Dist: hatch>=1.13.0; extra == 'dev'
36
38
  Requires-Dist: httpx>=0.27.0; extra == 'dev'
@@ -44,6 +46,8 @@ Provides-Extra: docs
44
46
  Requires-Dist: mkdocs-material>=9.5.0; extra == 'docs'
45
47
  Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
46
48
  Requires-Dist: mkdocstrings[python]>=0.25.0; extra == 'docs'
49
+ Provides-Extra: excel
50
+ Requires-Dist: openpyxl>=3.1.0; extra == 'excel'
47
51
  Provides-Extra: full
48
52
  Requires-Dist: pyjwt>=2.13.0; extra == 'full'
49
53
  Requires-Dist: uvicorn>=0.30.0; extra == 'full'
@@ -5,6 +5,7 @@ from fastapi_admin_kit.admin.decorators import column
5
5
  from fastapi_admin_kit.auth.mixins import AuthModelMixin
6
6
  from fastapi_admin_kit.config import DatabaseConfig, DatabaseType
7
7
  from fastapi_admin_kit.exceptions import ConfigError
8
+ from fastapi_admin_kit.export_import import CSVExport, CSVImport, ExportBase, ImportBase
8
9
  from fastapi_admin_kit.inline import InlineModelAdmin, StackedInline, TabularInline
9
10
  from fastapi_admin_kit.nav import (
10
11
  BuiltNavGroup,
@@ -81,5 +82,10 @@ __all__ = [
81
82
  "SearchView",
82
83
  # Per-model assets
83
84
  "AdminExtra",
85
+ # Export/Import
86
+ "ExportBase",
87
+ "ImportBase",
88
+ "CSVExport",
89
+ "CSVImport",
84
90
  ]
85
- __version__ = "0.3.0"
91
+ __version__ = "0.3.2"
@@ -33,10 +33,12 @@ class AdminDatabase:
33
33
  engine: Any | None = None,
34
34
  base: Any | None = None,
35
35
  database_config: DatabaseConfig | None = None,
36
+ use_alembic: bool = False,
36
37
  ):
37
38
  self.engine = engine
38
39
  self.base = base
39
40
  self.database_config = database_config
41
+ self.use_alembic = use_alembic
40
42
  self._backend = SqlAlchemyDatabaseBackend(
41
43
  admin_database=self, database_config=database_config
42
44
  )
@@ -48,16 +50,19 @@ class AdminDatabase:
48
50
  return self.engine
49
51
 
50
52
  async def _create_tables(self) -> None:
51
- """Create all admin database tables (async-safe)."""
52
- from sqlalchemy.ext.asyncio import AsyncEngine
53
+ """Create all admin database tables (async-safe).
53
54
 
54
- from fastapi_admin_kit.audit import (
55
- models as _audit_models, # noqa: F401
56
- )
55
+ If ``use_alembic=True`` (production mode), this method does nothing
56
+ and expects Alembic to manage the schema via migrations.
57
+ """
58
+ if self.use_alembic:
59
+ logger.info("use_alembic=True: skipping create_all; schema managed by Alembic")
60
+ return
61
+
62
+ from sqlalchemy.ext.asyncio import AsyncEngine
57
63
 
58
64
  # Import models to register them with metadata
59
- from fastapi_admin_kit.auth import models as _auth_models # noqa: F401
60
- from fastapi_admin_kit.models.base import Base as AdminBase
65
+ from fastapi_admin_kit.migrations.models import Base as AdminBase
61
66
 
62
67
  if isinstance(self.engine, AsyncEngine):
63
68
  # Async engine - use run_sync
@@ -166,7 +171,7 @@ class AdminDatabase:
166
171
  from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession
167
172
  from sqlalchemy.orm import Session, sessionmaker
168
173
 
169
- from fastapi_admin_kit.auth.models import Permission, Role
174
+ from fastapi_admin_kit.migrations.models import Permission, Role
170
175
 
171
176
  is_async = isinstance(self.engine, AsyncEngine)
172
177
 
@@ -22,6 +22,7 @@ class AdminTemplate:
22
22
  dark_mode_default: bool = False,
23
23
  dashboard_permission: str | None = None,
24
24
  settings_permission: str | None = None,
25
+ sidebar_bottom_links: list[dict[str, str]] | None = None,
25
26
  ):
26
27
  self.title = title
27
28
  self.logo_url = logo_url
@@ -31,6 +32,7 @@ class AdminTemplate:
31
32
  self.dark_mode_default = dark_mode_default
32
33
  self.dashboard_permission = dashboard_permission
33
34
  self.settings_permission = settings_permission
35
+ self.sidebar_bottom_links: list[dict[str, str]] = sidebar_bottom_links or []
34
36
  self._nav_groups_built: list = []
35
37
 
36
38
  def _init_jinja(self, app: Any) -> None:
@@ -221,6 +223,7 @@ class AdminTemplate:
221
223
  "current_user": user_for_template,
222
224
  "dashboard_visible": dashboard_visible,
223
225
  "settings_visible": settings_visible,
226
+ "sidebar_bottom_links": self.sidebar_bottom_links,
224
227
  }
225
228
 
226
229
  async def apply_sidebar_context(self, request: Any, user: Any, context: dict) -> dict:
@@ -170,6 +170,8 @@ class UserAdmin(ModelAdmin):
170
170
  class RoleAdmin(ModelAdmin):
171
171
  tag = "admin"
172
172
  icon = "shield-check"
173
+ verbose_name = "Admin Role"
174
+ verbose_name_plural = "Admin Roles"
173
175
  list_display = ["id", "name", "description"]
174
176
  search_fields = ["name"]
175
177
  exclude = ["users"]
@@ -180,6 +180,7 @@ class Admin:
180
180
  mobile_sidebar: str = "overlay",
181
181
  dashboard_permission: str | None = None,
182
182
  settings_permission: str | None = None,
183
+ sidebar_bottom_links: list[dict[str, str]] | None = None,
183
184
  ):
184
185
  self.registry = AdminRegistry()
185
186
  self._app: FastAPI | None = app
@@ -261,11 +262,17 @@ class Admin:
261
262
  require_tags=require_tags,
262
263
  dashboard_permission=dashboard_permission,
263
264
  settings_permission=settings_permission,
265
+ sidebar_bottom_links=sidebar_bottom_links,
264
266
  ),
265
267
  )
266
268
 
267
269
  if database is None:
268
- database = AdminDatabase(engine=engine, base=base, database_config=database_config)
270
+ database = AdminDatabase(
271
+ engine=engine,
272
+ base=base,
273
+ database_config=database_config,
274
+ use_alembic=config.behavior.use_alembic,
275
+ )
269
276
 
270
277
  if router is None:
271
278
  router = AdminRouter(
@@ -283,6 +290,7 @@ class Admin:
283
290
  dark_mode_default=config.ui.dark_mode_default,
284
291
  dashboard_permission=config.nav.dashboard_permission,
285
292
  settings_permission=config.nav.settings_permission,
293
+ sidebar_bottom_links=config.nav.sidebar_bottom_links,
286
294
  )
287
295
 
288
296
  self.config = config
@@ -538,7 +546,8 @@ class Admin:
538
546
  # 8.2 Apply skip_models — mark listed models to hide from admin
539
547
  skip_models = self.config.behavior.skip_models
540
548
  # Built-in internal models are always hidden from admin
541
- default_skip = {"RefreshToken", "UserPermission", "UserTOTP"}
549
+ # Note: model class names match table names (e.g., admin_refresh_tokens)
550
+ default_skip = {"admin_refresh_tokens", "admin_user_permissions", "admin_user_totp"}
542
551
  all_skip = default_skip | skip_models
543
552
  skip_lower = {s.lower() for s in all_skip}
544
553
  for registered in self.registry.all():
@@ -555,7 +564,9 @@ class Admin:
555
564
  from fastapi_admin_kit.db import create_session_factory
556
565
 
557
566
  session_factory = create_session_factory(engine)
558
- from fastapi_admin_kit.backends.sqlalchemy import SqlAlchemyAuditBackend
567
+ from fastapi_admin_kit.backends.sqlalchemy import (
568
+ SqlAlchemyAuditBackend,
569
+ )
559
570
 
560
571
  audit_backend = SqlAlchemyAuditBackend()
561
572
  audit_backend.attach_listeners(session_factory, self.registry)
@@ -736,7 +747,9 @@ class Admin:
736
747
  # Unified signing-key source for sessions, CSRF, and JWT (see AdminState).
737
748
  app.state.admin_secret_key = state.secret_key
738
749
  # Multi-ORM backend: store composed backend and derive individual adapters
739
- from fastapi_admin_kit.backends.sqlalchemy import SqlAlchemySessionAdapter
750
+ from fastapi_admin_kit.backends.sqlalchemy import (
751
+ SqlAlchemySessionAdapter,
752
+ )
740
753
 
741
754
  app.state.admin_backend = self.backend
742
755
  app.state.admin_session_backend_class = SqlAlchemySessionAdapter
@@ -848,6 +861,7 @@ class Admin:
848
861
  "bars-": "menu",
849
862
  "bars-3": "menu",
850
863
  "arrow-down-tray": "download",
864
+ "arrow-up-tray": "upload",
851
865
  "arrow-path": "refresh",
852
866
  "paper-airplane": "send",
853
867
  "exclamation-triangle": "warning",
@@ -983,8 +997,8 @@ class Admin:
983
997
  RoleAdmin,
984
998
  UserAdmin,
985
999
  )
986
- from fastapi_admin_kit.audit.models import AuditLog
987
- from fastapi_admin_kit.auth.models import (
1000
+ from fastapi_admin_kit.migrations.models import (
1001
+ AuditLog,
988
1002
  LoginAttempt,
989
1003
  Permission,
990
1004
  Role,
@@ -3,7 +3,10 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from contextvars import ContextVar
6
- from typing import Any
6
+ from typing import TYPE_CHECKING, Any
7
+
8
+ if TYPE_CHECKING:
9
+ from fastapi_admin_kit.audit.events import AuditEvent
7
10
 
8
11
  # Context variable to store audit context (user, IP, user_agent, etc.)
9
12
  _current_audit_context: ContextVar[dict] = ContextVar("_current_audit_context", default={})
@@ -60,3 +63,32 @@ class AuditContext:
60
63
  def clear_context(self) -> None:
61
64
  """Clear the audit context."""
62
65
  clear_audit_context()
66
+
67
+
68
+ async def log_audit_event(request: Any, event: AuditEvent) -> None:
69
+ """Persist an AuditEvent directly to the database.
70
+
71
+ Used for EXPORT/IMPORT events that don't go through the SQLAlchemy
72
+ before_flush listener.
73
+ """
74
+ from fastapi_admin_kit.audit.models import AuditLog
75
+ from fastapi_admin_kit.db import get_db_session
76
+
77
+ session = get_db_session(request)
78
+ ctx = get_audit_context()
79
+
80
+ entry = AuditLog(
81
+ action=event.event_type,
82
+ model_name=event.model_name,
83
+ table_name=event.table_name,
84
+ object_id=event.object_id,
85
+ object_repr=event.object_repr,
86
+ changes=event.changes,
87
+ full_snapshot=event.full_snapshot,
88
+ user_id=event.user_id or ctx.get("user_id"),
89
+ user_email=event.user_email or ctx.get("user_email"),
90
+ ip_address=event.ip_address or ctx.get("ip_address"),
91
+ user_agent=event.user_agent or ctx.get("user_agent"),
92
+ )
93
+ session.add(entry)
94
+ await session.flush()
@@ -9,13 +9,13 @@ from typing import Any
9
9
 
10
10
  @dataclass
11
11
  class AuditEvent:
12
- """Represents a single audit event (CREATE, UPDATE, or DELETE).
12
+ """Represents a single audit event (CREATE, UPDATE, DELETE, EXPORT, or IMPORT).
13
13
 
14
14
  This is a pure data structure with no side effects, making it
15
15
  easy to test and serialize.
16
16
  """
17
17
 
18
- event_type: str # "CREATE" | "UPDATE" | "DELETE"
18
+ event_type: str # "CREATE" | "UPDATE" | "DELETE" | "EXPORT" | "IMPORT"
19
19
  model_name: str
20
20
  table_name: str
21
21
  object_id: str
@@ -26,3 +26,11 @@ class AuditLogger(ABC):
26
26
  @abstractmethod
27
27
  def log_delete(self, event: AuditEvent) -> None:
28
28
  """Persist a DELETE audit event."""
29
+
30
+ @abstractmethod
31
+ def log_export(self, event: AuditEvent) -> None:
32
+ """Persist an EXPORT audit event."""
33
+
34
+ @abstractmethod
35
+ def log_import(self, event: AuditEvent) -> None:
36
+ """Persist an IMPORT audit event."""
@@ -0,0 +1,22 @@
1
+ """SQLAlchemy model for the admin audit log.
2
+
3
+ .. deprecated:: 2.1.0
4
+ This module is deprecated. Use ``fastapi_admin_kit.migrations.models`` instead,
5
+ which materializes models from schemas for both runtime and Alembic migrations.
6
+ This module will be removed in v3.0.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import warnings
12
+
13
+ from fastapi_admin_kit.migrations.models import AuditLog
14
+
15
+ warnings.warn(
16
+ "fastapi_admin_kit.audit.models is deprecated and will be removed in v3.0. "
17
+ "Use fastapi_admin_kit.migrations.models instead.",
18
+ DeprecationWarning,
19
+ stacklevel=2,
20
+ )
21
+
22
+ __all__ = ["AuditLog"]
@@ -32,6 +32,12 @@ class SqlAlchemyAuditLogger(AuditLogger):
32
32
  def log_delete(self, event: AuditEvent) -> None:
33
33
  self._buffer(event)
34
34
 
35
+ def log_export(self, event: AuditEvent) -> None:
36
+ self._buffer(event)
37
+
38
+ def log_import(self, event: AuditEvent) -> None:
39
+ self._buffer(event)
40
+
35
41
  def _buffer(self, event: AuditEvent) -> None:
36
42
  entry = AuditLog(
37
43
  user_id=event.user_id,
@@ -0,0 +1,45 @@
1
+ """SQLAlchemy models for admin auth: roles, users, permissions.
2
+
3
+ .. deprecated:: 2.1.0
4
+ This module is deprecated. Use ``fastapi_admin_kit.migrations.models`` instead,
5
+ which materializes models from schemas for both runtime and Alembic migrations.
6
+ This module will be removed in v3.0.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import warnings
12
+
13
+ from fastapi_admin_kit.auth.mixins import AuthModelMixin
14
+ from fastapi_admin_kit.migrations.models import (
15
+ LoginAttempt,
16
+ Permission,
17
+ RefreshToken,
18
+ Role,
19
+ User,
20
+ UserPermission,
21
+ UserTOTP,
22
+ admin_role_permissions,
23
+ admin_user_roles,
24
+ )
25
+
26
+ warnings.warn(
27
+ "fastapi_admin_kit.auth.models is deprecated and will be removed in v3.0. "
28
+ "Use fastapi_admin_kit.migrations.models instead.",
29
+ DeprecationWarning,
30
+ stacklevel=2,
31
+ )
32
+
33
+ # Re-export the mixin
34
+ __all__ = [
35
+ "AuthModelMixin",
36
+ "User",
37
+ "Role",
38
+ "Permission",
39
+ "UserPermission",
40
+ "RefreshToken",
41
+ "UserTOTP",
42
+ "LoginAttempt",
43
+ "admin_user_roles",
44
+ "admin_role_permissions",
45
+ ]
@@ -82,6 +82,10 @@ class PermissionChecker:
82
82
  ps.can_edit = True
83
83
  if perm.can_delete:
84
84
  ps.can_delete = True
85
+ if perm.can_export:
86
+ ps.can_export = True
87
+ if perm.can_import:
88
+ ps.can_import = True
85
89
 
86
90
  return self._role_cache
87
91
 
@@ -116,6 +120,10 @@ class PermissionChecker:
116
120
  ps.can_edit = True
117
121
  if perm.can_delete:
118
122
  ps.can_delete = True
123
+ if perm.can_export:
124
+ ps.can_export = True
125
+ if perm.can_import:
126
+ ps.can_import = True
119
127
 
120
128
  return self._direct_cache
121
129
 
@@ -137,7 +145,7 @@ class PermissionChecker:
137
145
  async def has_permission(self, table_name: str, action: str) -> bool:
138
146
  """Return True if the current user may perform *action* on *table_name*.
139
147
 
140
- Actions: ``"view"`` | ``"create"`` | ``"edit"`` | ``"delete"``
148
+ Actions: ``"view"`` | ``"create"`` | ``"edit"`` | ``"delete"`` | ``"export"`` | ``"import"``
141
149
 
142
150
  Superusers always return True. Results are cached per-request.
143
151
  """
@@ -191,6 +199,8 @@ class PermissionChecker:
191
199
  can_create=True,
192
200
  can_edit=True,
193
201
  can_delete=True,
202
+ can_export=True,
203
+ can_import=True,
194
204
  )
195
205
  # Check if cache has been populated for this table
196
206
  cache_populated = any(key[0] == table_name for key in self._cache)
@@ -207,6 +217,8 @@ class PermissionChecker:
207
217
  can_create=self._cache.get((table_name, "create"), False),
208
218
  can_edit=self._cache.get((table_name, "edit"), False),
209
219
  can_delete=self._cache.get((table_name, "delete"), False),
220
+ can_export=self._cache.get((table_name, "export"), False),
221
+ can_import=self._cache.get((table_name, "import"), False),
210
222
  )
211
223
 
212
224
  async def load_permissions(self, table_name: str) -> PermissionSet:
@@ -218,4 +230,6 @@ class PermissionChecker:
218
230
  await self.has_permission(table_name, "create")
219
231
  await self.has_permission(table_name, "edit")
220
232
  await self.has_permission(table_name, "delete")
233
+ await self.has_permission(table_name, "export")
234
+ await self.has_permission(table_name, "import")
221
235
  return self.permission_set(table_name)
@@ -13,6 +13,8 @@ class PermissionSet:
13
13
  can_create: bool = False
14
14
  can_edit: bool = False
15
15
  can_delete: bool = False
16
+ can_export: bool = False
17
+ can_import: bool = False
16
18
 
17
19
 
18
20
  @dataclass