fastapi-admin-kit 0.1.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 (164) hide show
  1. fastapi_admin_kit-0.1.0/.gitignore +74 -0
  2. fastapi_admin_kit-0.1.0/LICENSE +21 -0
  3. fastapi_admin_kit-0.1.0/PKG-INFO +210 -0
  4. fastapi_admin_kit-0.1.0/README.md +158 -0
  5. fastapi_admin_kit-0.1.0/fastapi_admin_kit/__init__.py +73 -0
  6. fastapi_admin_kit-0.1.0/fastapi_admin_kit/actions/__init__.py +63 -0
  7. fastapi_admin_kit-0.1.0/fastapi_admin_kit/actions/base.py +68 -0
  8. fastapi_admin_kit-0.1.0/fastapi_admin_kit/actions/registry.py +43 -0
  9. fastapi_admin_kit-0.1.0/fastapi_admin_kit/admin/__init__.py +17 -0
  10. fastapi_admin_kit-0.1.0/fastapi_admin_kit/admin/admin_config.py +95 -0
  11. fastapi_admin_kit-0.1.0/fastapi_admin_kit/admin/admin_database.py +138 -0
  12. fastapi_admin_kit-0.1.0/fastapi_admin_kit/admin/admin_router.py +74 -0
  13. fastapi_admin_kit-0.1.0/fastapi_admin_kit/admin/admin_template.py +203 -0
  14. fastapi_admin_kit-0.1.0/fastapi_admin_kit/admin/builtin_models.py +284 -0
  15. fastapi_admin_kit-0.1.0/fastapi_admin_kit/admin/core.py +1036 -0
  16. fastapi_admin_kit-0.1.0/fastapi_admin_kit/admin/decorators.py +70 -0
  17. fastapi_admin_kit-0.1.0/fastapi_admin_kit/admin/state.py +76 -0
  18. fastapi_admin_kit-0.1.0/fastapi_admin_kit/admin.py +728 -0
  19. fastapi_admin_kit-0.1.0/fastapi_admin_kit/api/__init__.py +44 -0
  20. fastapi_admin_kit-0.1.0/fastapi_admin_kit/api/auth.py +342 -0
  21. fastapi_admin_kit-0.1.0/fastapi_admin_kit/api/crud.py +128 -0
  22. fastapi_admin_kit-0.1.0/fastapi_admin_kit/api/deps.py +79 -0
  23. fastapi_admin_kit-0.1.0/fastapi_admin_kit/api/roles.py +128 -0
  24. fastapi_admin_kit-0.1.0/fastapi_admin_kit/api/schema_generator.py +171 -0
  25. fastapi_admin_kit-0.1.0/fastapi_admin_kit/api/schemas.py +81 -0
  26. fastapi_admin_kit-0.1.0/fastapi_admin_kit/api/search.py +132 -0
  27. fastapi_admin_kit-0.1.0/fastapi_admin_kit/audit/__init__.py +36 -0
  28. fastapi_admin_kit-0.1.0/fastapi_admin_kit/audit/context.py +62 -0
  29. fastapi_admin_kit-0.1.0/fastapi_admin_kit/audit/diff.py +77 -0
  30. fastapi_admin_kit-0.1.0/fastapi_admin_kit/audit/event_bus.py +96 -0
  31. fastapi_admin_kit-0.1.0/fastapi_admin_kit/audit/events.py +48 -0
  32. fastapi_admin_kit-0.1.0/fastapi_admin_kit/audit/listener.py +159 -0
  33. fastapi_admin_kit-0.1.0/fastapi_admin_kit/audit/logger.py +28 -0
  34. fastapi_admin_kit-0.1.0/fastapi_admin_kit/audit/middleware.py +39 -0
  35. fastapi_admin_kit-0.1.0/fastapi_admin_kit/audit/models.py +53 -0
  36. fastapi_admin_kit-0.1.0/fastapi_admin_kit/audit/sqlalchemy_logger.py +58 -0
  37. fastapi_admin_kit-0.1.0/fastapi_admin_kit/auth/__init__.py +34 -0
  38. fastapi_admin_kit-0.1.0/fastapi_admin_kit/auth/backend.py +95 -0
  39. fastapi_admin_kit-0.1.0/fastapi_admin_kit/auth/csrf.py +240 -0
  40. fastapi_admin_kit-0.1.0/fastapi_admin_kit/auth/dependencies.py +150 -0
  41. fastapi_admin_kit-0.1.0/fastapi_admin_kit/auth/identity.py +181 -0
  42. fastapi_admin_kit-0.1.0/fastapi_admin_kit/auth/models.py +246 -0
  43. fastapi_admin_kit-0.1.0/fastapi_admin_kit/auth/password.py +35 -0
  44. fastapi_admin_kit-0.1.0/fastapi_admin_kit/auth/permissions.py +205 -0
  45. fastapi_admin_kit-0.1.0/fastapi_admin_kit/auth/protocol.py +22 -0
  46. fastapi_admin_kit-0.1.0/fastapi_admin_kit/auth/ratelimit.py +88 -0
  47. fastapi_admin_kit-0.1.0/fastapi_admin_kit/auth/router.py +10 -0
  48. fastapi_admin_kit-0.1.0/fastapi_admin_kit/auth/session.py +79 -0
  49. fastapi_admin_kit-0.1.0/fastapi_admin_kit/auth/totp.py +83 -0
  50. fastapi_admin_kit-0.1.0/fastapi_admin_kit/auth/views.py +165 -0
  51. fastapi_admin_kit-0.1.0/fastapi_admin_kit/cli.py +229 -0
  52. fastapi_admin_kit-0.1.0/fastapi_admin_kit/config/__init__.py +19 -0
  53. fastapi_admin_kit-0.1.0/fastapi_admin_kit/config/audit.py +18 -0
  54. fastapi_admin_kit-0.1.0/fastapi_admin_kit/config/auth.py +54 -0
  55. fastapi_admin_kit-0.1.0/fastapi_admin_kit/config/behavior.py +27 -0
  56. fastapi_admin_kit-0.1.0/fastapi_admin_kit/config/nav.py +32 -0
  57. fastapi_admin_kit-0.1.0/fastapi_admin_kit/config/storage.py +22 -0
  58. fastapi_admin_kit-0.1.0/fastapi_admin_kit/config/theme.py +215 -0
  59. fastapi_admin_kit-0.1.0/fastapi_admin_kit/config/ui.py +147 -0
  60. fastapi_admin_kit-0.1.0/fastapi_admin_kit/dashboard/__init__.py +64 -0
  61. fastapi_admin_kit-0.1.0/fastapi_admin_kit/db.py +133 -0
  62. fastapi_admin_kit-0.1.0/fastapi_admin_kit/exceptions.py +5 -0
  63. fastapi_admin_kit-0.1.0/fastapi_admin_kit/field_types.py +81 -0
  64. fastapi_admin_kit-0.1.0/fastapi_admin_kit/filters/__init__.py +21 -0
  65. fastapi_admin_kit-0.1.0/fastapi_admin_kit/filters/base.py +170 -0
  66. fastapi_admin_kit-0.1.0/fastapi_admin_kit/filters/registry.py +68 -0
  67. fastapi_admin_kit-0.1.0/fastapi_admin_kit/flash.py +45 -0
  68. fastapi_admin_kit-0.1.0/fastapi_admin_kit/form/__init__.py +1 -0
  69. fastapi_admin_kit-0.1.0/fastapi_admin_kit/form/pipeline.py +106 -0
  70. fastapi_admin_kit-0.1.0/fastapi_admin_kit/inspection/__init__.py +117 -0
  71. fastapi_admin_kit-0.1.0/fastapi_admin_kit/inspection/registry.py +253 -0
  72. fastapi_admin_kit-0.1.0/fastapi_admin_kit/inspection.py +115 -0
  73. fastapi_admin_kit-0.1.0/fastapi_admin_kit/modeladmin.py +375 -0
  74. fastapi_admin_kit-0.1.0/fastapi_admin_kit/models/__init__.py +7 -0
  75. fastapi_admin_kit-0.1.0/fastapi_admin_kit/models/base.py +7 -0
  76. fastapi_admin_kit-0.1.0/fastapi_admin_kit/nav.py +208 -0
  77. fastapi_admin_kit-0.1.0/fastapi_admin_kit/pagination/__init__.py +14 -0
  78. fastapi_admin_kit-0.1.0/fastapi_admin_kit/pagination/base.py +40 -0
  79. fastapi_admin_kit-0.1.0/fastapi_admin_kit/pagination/cursor.py +97 -0
  80. fastapi_admin_kit-0.1.0/fastapi_admin_kit/pagination/dynamic.py +48 -0
  81. fastapi_admin_kit-0.1.0/fastapi_admin_kit/pagination/offset.py +42 -0
  82. fastapi_admin_kit-0.1.0/fastapi_admin_kit/plugins/__init__.py +1 -0
  83. fastapi_admin_kit-0.1.0/fastapi_admin_kit/py.typed +0 -0
  84. fastapi_admin_kit-0.1.0/fastapi_admin_kit/registry/__init__.py +5 -0
  85. fastapi_admin_kit-0.1.0/fastapi_admin_kit/registry/core.py +287 -0
  86. fastapi_admin_kit-0.1.0/fastapi_admin_kit/registry/validation.py +107 -0
  87. fastapi_admin_kit-0.1.0/fastapi_admin_kit/registry.py +15 -0
  88. fastapi_admin_kit-0.1.0/fastapi_admin_kit/router.py +335 -0
  89. fastapi_admin_kit-0.1.0/fastapi_admin_kit/static/css/admin.css +4736 -0
  90. fastapi_admin_kit-0.1.0/fastapi_admin_kit/static/css/presets.css +317 -0
  91. fastapi_admin_kit-0.1.0/fastapi_admin_kit/static/css/tokens.css +217 -0
  92. fastapi_admin_kit-0.1.0/fastapi_admin_kit/static/css/variables.css +74 -0
  93. fastapi_admin_kit-0.1.0/fastapi_admin_kit/static/icons/heroicons.svg +160 -0
  94. fastapi_admin_kit-0.1.0/fastapi_admin_kit/static/js/admin.js +692 -0
  95. fastapi_admin_kit-0.1.0/fastapi_admin_kit/static/js/htmx-config.js +42 -0
  96. fastapi_admin_kit-0.1.0/fastapi_admin_kit/storage/__init__.py +6 -0
  97. fastapi_admin_kit-0.1.0/fastapi_admin_kit/storage/base.py +48 -0
  98. fastapi_admin_kit-0.1.0/fastapi_admin_kit/storage/local.py +73 -0
  99. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/base.html +142 -0
  100. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/macros/form_fields.html +660 -0
  101. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/macros/icons.html +50 -0
  102. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/macros/table.html +108 -0
  103. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/macros/widgets.html +159 -0
  104. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/2fa/setup.html +122 -0
  105. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/2fa/verify.html +55 -0
  106. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/audit_detail.html +122 -0
  107. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/audit_log.html +102 -0
  108. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/dashboard.html +295 -0
  109. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/detail.html +183 -0
  110. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/form.html +119 -0
  111. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/list.html +277 -0
  112. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/login.html +85 -0
  113. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/profile/password.html +78 -0
  114. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/profile/profile.html +73 -0
  115. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/role_form.html +75 -0
  116. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/roles/form.html +117 -0
  117. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/roles/list.html +69 -0
  118. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/roles.html +77 -0
  119. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/settings/theme.html +255 -0
  120. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/users/form.html +229 -0
  121. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/pages/users/list.html +83 -0
  122. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/partials/command_palette.html +52 -0
  123. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/partials/field_wrapper.html +2 -0
  124. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/partials/flash_messages.html +39 -0
  125. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/partials/head.html +21 -0
  126. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/partials/head_minimal.html +18 -0
  127. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/partials/list_table.html +178 -0
  128. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/partials/mobile_backdrop.html +2 -0
  129. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/partials/pagination.html +82 -0
  130. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/partials/permission_widget.html +86 -0
  131. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/partials/scripts.html +13 -0
  132. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/partials/sidebar.html +94 -0
  133. fastapi_admin_kit-0.1.0/fastapi_admin_kit/templates/partials/topbar.html +95 -0
  134. fastapi_admin_kit-0.1.0/fastapi_admin_kit/types.py +145 -0
  135. fastapi_admin_kit-0.1.0/fastapi_admin_kit/validation.py +43 -0
  136. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/__init__.py +78 -0
  137. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/audit.py +134 -0
  138. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/bulk.py +28 -0
  139. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/class_views.py +1040 -0
  140. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/context.py +588 -0
  141. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/dashboard.py +162 -0
  142. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/delete.py +31 -0
  143. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/extra.py +65 -0
  144. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/factory.py +667 -0
  145. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/form.py +159 -0
  146. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/list.py +28 -0
  147. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/profile.py +219 -0
  148. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/protocols.py +54 -0
  149. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/renderers.py +634 -0
  150. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/roles.py +230 -0
  151. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/search.py +31 -0
  152. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/settings.py +31 -0
  153. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/sidebar.py +101 -0
  154. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/totp.py +249 -0
  155. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views/users.py +347 -0
  156. fastapi_admin_kit-0.1.0/fastapi_admin_kit/views.py +117 -0
  157. fastapi_admin_kit-0.1.0/fastapi_admin_kit/widgets/__init__.py +44 -0
  158. fastapi_admin_kit-0.1.0/fastapi_admin_kit/widgets/base.py +44 -0
  159. fastapi_admin_kit-0.1.0/fastapi_admin_kit/widgets/inputs.py +363 -0
  160. fastapi_admin_kit-0.1.0/fastapi_admin_kit/widgets/registry.py +110 -0
  161. fastapi_admin_kit-0.1.0/fastapi_admin_kit/widgets/relation.py +70 -0
  162. fastapi_admin_kit-0.1.0/fastapi_admin_kit/widgets/resolver.py +102 -0
  163. fastapi_admin_kit-0.1.0/mkdocs.yml +72 -0
  164. fastapi_admin_kit-0.1.0/pyproject.toml +111 -0
@@ -0,0 +1,74 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ *.egg-info/
20
+ .installed.cfg
21
+ *.egg
22
+ *.whl
23
+ *.tar.gz
24
+ MANIFEST
25
+ pip-log.txt
26
+ pip-delete-this-directory.txt
27
+
28
+ # Virtual environments
29
+ .venv/
30
+ venv/
31
+ ENV/
32
+ env/
33
+ .env
34
+ .env.local
35
+ .env.*.local
36
+
37
+ # IDE
38
+ .vscode/
39
+ .idea/
40
+ *.swp
41
+ *.swo
42
+ *~
43
+ .DS_Store
44
+ *.sublime-project
45
+ *.sublime-workspace
46
+
47
+ # Database
48
+ *.db
49
+ *.sqlite
50
+ *.sqlite3
51
+ alembic_version
52
+
53
+ # Testing
54
+ .pytest_cache/
55
+ .coverage
56
+ htmlcov/
57
+ .tox/
58
+
59
+ # Build tools
60
+ .ruff_cache/
61
+ .mypy_cache/
62
+ .dmypy.json
63
+ dmypy.json
64
+
65
+ # uv
66
+ uv.lock
67
+
68
+ # MkDocs
69
+ site/
70
+
71
+ # OS
72
+ .DS_Store
73
+ Thumbs.db
74
+ *.log
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Borhan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,210 @@
1
+ Metadata-Version: 2.4
2
+ Name: fastapi-admin-kit
3
+ Version: 0.1.0
4
+ Summary: Drop-in admin panel for FastAPI + SQLAlchemy + SQLModel apps
5
+ Project-URL: Homepage, https://github.com/borhanst/fastapi-admin-kit
6
+ Project-URL: Documentation, https://borhanst.github.io/fastapi-admin-kit/
7
+ Project-URL: Repository, https://github.com/borhanst/fastapi-admin-kit
8
+ Project-URL: Changelog, https://github.com/borhanst/fastapi-admin-kit/releases
9
+ Author-email: Borhan <mdborhan.st@gmail.com>
10
+ License: MIT
11
+ License-File: LICENSE
12
+ Keywords: admin,admin-panel,async,crud,dashboard,fastapi,rbac,sqlalchemy,sqlmodel
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Framework :: AsyncIO
15
+ Classifier: Framework :: FastAPI
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: License :: OSI Approved :: MIT License
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
23
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
+ Classifier: Typing :: Typed
25
+ Requires-Python: >=3.11
26
+ Requires-Dist: aiosqlite>=0.20.0
27
+ Requires-Dist: bcrypt>=4.0.0
28
+ Requires-Dist: fastapi>=0.136.3
29
+ Requires-Dist: itsdangerous>=2.2.0
30
+ Requires-Dist: jinja2>=3.1.0
31
+ Requires-Dist: pyjwt>=2.13.0
32
+ Requires-Dist: python-multipart>=0.0.9
33
+ Requires-Dist: sqlalchemy>=2.0.0
34
+ Requires-Dist: uvicorn>=0.49.0
35
+ Provides-Extra: dev
36
+ Requires-Dist: hatch>=1.13.0; extra == 'dev'
37
+ Requires-Dist: httpx>=0.27.0; extra == 'dev'
38
+ Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
39
+ Requires-Dist: pytest>=8.0.0; extra == 'dev'
40
+ Requires-Dist: ruff>=0.5.0; extra == 'dev'
41
+ Provides-Extra: docs
42
+ Requires-Dist: mkdocs-material>=9.5.0; extra == 'docs'
43
+ Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
44
+ Requires-Dist: mkdocstrings[python]>=0.25.0; extra == 'docs'
45
+ Provides-Extra: mysql
46
+ Requires-Dist: aiomysql>=0.2.0; extra == 'mysql'
47
+ Provides-Extra: postgres
48
+ Requires-Dist: asyncpg>=0.29.0; extra == 'postgres'
49
+ Provides-Extra: sqlmodel
50
+ Requires-Dist: sqlmodel>=0.0.39; extra == 'sqlmodel'
51
+ Description-Content-Type: text/markdown
52
+
53
+ # FastAPI Admin Kit
54
+
55
+ [![PyPI version](https://img.shields.io/pypi/v/fastapi-admin-kit.svg)](https://pypi.org/project/fastapi-admin-kit/)
56
+ [![Python versions](https://img.shields.io/pypi/pyversions/fastapi-admin-kit.svg)](https://pypi.org/project/fastapi-admin-kit/)
57
+ [![License](https://img.shields.io/pypi/l/fastapi-admin-kit.svg)](https://github.com/borhanst/fastapi-admin-kit/blob/main/LICENSE)
58
+
59
+ A drop-in admin panel for FastAPI + SQLAlchemy apps, inspired by Django Unfold.
60
+
61
+ 📖 **[Documentation](https://borhanst.github.io/fastapi-admin-kit/)** | 🚀 **[Quick Start](#quick-start)** | 📦 **[PyPI](https://pypi.org/project/fastapi-admin-kit/)**
62
+
63
+ ## Features
64
+
65
+ - Zero-config auto-discovery of SQLAlchemy models
66
+ - Built-in authentication, RBAC, and audit logging
67
+ - Modern UI with Tailwind CSS, HTMX, and Alpine.js
68
+ - Fully customizable widgets, themes, and templates
69
+ - CLI for user management (`fastapi-admin-kit` / `fak` — create superusers, list users, change passwords)
70
+ - Async-first with support for PostgreSQL, MySQL, and SQLite
71
+
72
+ ## Installation
73
+
74
+ ```bash
75
+ pip install fastapi-admin-kit
76
+ ```
77
+
78
+ For database-specific async drivers:
79
+
80
+ ```bash
81
+ pip install fastapi-admin-kit[postgres] # PostgreSQL via asyncpg
82
+ pip install fastapi-admin-kit[mysql] # MySQL via aiomysql
83
+ ```
84
+
85
+ ## Quick Start
86
+
87
+ ```python
88
+ from contextlib import asynccontextmanager
89
+ from fastapi import FastAPI
90
+ from sqlalchemy import Column, Float, Integer, String
91
+ from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
92
+ from sqlalchemy.orm import DeclarativeBase, sessionmaker
93
+
94
+ from fastapi_admin_kit import Admin
95
+ from fastapi_admin_kit.auth.backend import BuiltinAuthBackend
96
+
97
+
98
+ class Base(DeclarativeBase):
99
+ pass
100
+
101
+
102
+ class Product(Base):
103
+ __tablename__ = "products"
104
+ id = Column(Integer, primary_key=True)
105
+ name = Column(String(100), nullable=False)
106
+ price = Column(Float, nullable=False)
107
+
108
+
109
+ DATABASE_URL = "sqlite+aiosqlite:///./app.db"
110
+ SECRET_KEY = "change-me-to-a-random-secret-key-in-production"
111
+
112
+ engine = create_async_engine(DATABASE_URL)
113
+ async_session = sessionmaker(engine, class_=AsyncSession)
114
+
115
+
116
+ @asynccontextmanager
117
+ async def lifespan(app: FastAPI):
118
+ async with engine.begin() as conn:
119
+ await conn.run_sync(Base.metadata.create_all)
120
+ yield
121
+ await engine.dispose()
122
+
123
+
124
+ app = FastAPI(lifespan=lifespan)
125
+ admin = Admin(
126
+ app=app,
127
+ engine=engine,
128
+ base=Base,
129
+ secret_key=SECRET_KEY,
130
+ auth_backend=BuiltinAuthBackend(),
131
+ )
132
+ admin.register(Product)
133
+ ```
134
+
135
+ ## CLI Usage
136
+
137
+ Both the full name and the short alias work interchangeably:
138
+
139
+ ```bash
140
+ # Create a superuser
141
+ fastapi-admin-kit create-superuser -e admin@example.com -p mypassword
142
+ fak create-superuser -e admin@example.com -p mypassword # short alias
143
+
144
+ # List all admin users
145
+ fastapi-admin-kit users
146
+ fak users
147
+
148
+ # Change a user's password
149
+ fastapi-admin-kit changepassword -e admin@example.com -p newpassword
150
+ fak changepassword -e admin@example.com -p newpassword
151
+ ```
152
+
153
+ All commands accept `-d DATABASE_URL` or read the `DATABASE_URL` environment variable.
154
+
155
+ ## Configuration
156
+
157
+ ### Environment Variables
158
+
159
+ | Variable | Description | Default |
160
+ |---|---|---|
161
+ | `DATABASE_URL` | Async database connection string | `sqlite+aiosqlite:///./app.db` |
162
+ | `SECRET_KEY` | Signing key for sessions/CSRF/JWT (min 32 chars) | Required in production |
163
+
164
+ ### Admin Options
165
+
166
+ ```python
167
+ admin = Admin(
168
+ app=app,
169
+ engine=engine,
170
+ base=Base,
171
+ secret_key=SECRET_KEY,
172
+ title="My Admin", # Admin panel title
173
+ admin_path="/admin", # URL prefix
174
+ dark_mode_default=False, # Dark mode on by default
175
+ # Theme
176
+ theme=ThemeConfig(preset="modern", primary_color="#6366F1"),
177
+ # Auth
178
+ auth_backend=BuiltinAuthBackend(),
179
+ # Environment badge
180
+ environment_label="Production",
181
+ environment_color="danger",
182
+ )
183
+ ```
184
+
185
+ ### Database Support
186
+
187
+ - **SQLite** (default, built-in via `aiosqlite`)
188
+ - **PostgreSQL**: `pip install fastapi-admin-kit[postgres]` + set `DATABASE_URL=postgresql+asyncpg://...`
189
+ - **MySQL**: `pip install fastapi-admin-kit[mysql]` + set `DATABASE_URL=mysql+aiomysql://...`
190
+
191
+ ## Development
192
+
193
+ ```bash
194
+ # Install with dev dependencies
195
+ pip install -e ".[dev]"
196
+
197
+ # Run tests
198
+ pytest
199
+
200
+ # Lint
201
+ ruff check fastapi_admin_kit/
202
+
203
+ # Build distribution
204
+ pip install hatch
205
+ hatch build
206
+ ```
207
+
208
+ ## License
209
+
210
+ MIT
@@ -0,0 +1,158 @@
1
+ # FastAPI Admin Kit
2
+
3
+ [![PyPI version](https://img.shields.io/pypi/v/fastapi-admin-kit.svg)](https://pypi.org/project/fastapi-admin-kit/)
4
+ [![Python versions](https://img.shields.io/pypi/pyversions/fastapi-admin-kit.svg)](https://pypi.org/project/fastapi-admin-kit/)
5
+ [![License](https://img.shields.io/pypi/l/fastapi-admin-kit.svg)](https://github.com/borhanst/fastapi-admin-kit/blob/main/LICENSE)
6
+
7
+ A drop-in admin panel for FastAPI + SQLAlchemy apps, inspired by Django Unfold.
8
+
9
+ 📖 **[Documentation](https://borhanst.github.io/fastapi-admin-kit/)** | 🚀 **[Quick Start](#quick-start)** | 📦 **[PyPI](https://pypi.org/project/fastapi-admin-kit/)**
10
+
11
+ ## Features
12
+
13
+ - Zero-config auto-discovery of SQLAlchemy models
14
+ - Built-in authentication, RBAC, and audit logging
15
+ - Modern UI with Tailwind CSS, HTMX, and Alpine.js
16
+ - Fully customizable widgets, themes, and templates
17
+ - CLI for user management (`fastapi-admin-kit` / `fak` — create superusers, list users, change passwords)
18
+ - Async-first with support for PostgreSQL, MySQL, and SQLite
19
+
20
+ ## Installation
21
+
22
+ ```bash
23
+ pip install fastapi-admin-kit
24
+ ```
25
+
26
+ For database-specific async drivers:
27
+
28
+ ```bash
29
+ pip install fastapi-admin-kit[postgres] # PostgreSQL via asyncpg
30
+ pip install fastapi-admin-kit[mysql] # MySQL via aiomysql
31
+ ```
32
+
33
+ ## Quick Start
34
+
35
+ ```python
36
+ from contextlib import asynccontextmanager
37
+ from fastapi import FastAPI
38
+ from sqlalchemy import Column, Float, Integer, String
39
+ from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
40
+ from sqlalchemy.orm import DeclarativeBase, sessionmaker
41
+
42
+ from fastapi_admin_kit import Admin
43
+ from fastapi_admin_kit.auth.backend import BuiltinAuthBackend
44
+
45
+
46
+ class Base(DeclarativeBase):
47
+ pass
48
+
49
+
50
+ class Product(Base):
51
+ __tablename__ = "products"
52
+ id = Column(Integer, primary_key=True)
53
+ name = Column(String(100), nullable=False)
54
+ price = Column(Float, nullable=False)
55
+
56
+
57
+ DATABASE_URL = "sqlite+aiosqlite:///./app.db"
58
+ SECRET_KEY = "change-me-to-a-random-secret-key-in-production"
59
+
60
+ engine = create_async_engine(DATABASE_URL)
61
+ async_session = sessionmaker(engine, class_=AsyncSession)
62
+
63
+
64
+ @asynccontextmanager
65
+ async def lifespan(app: FastAPI):
66
+ async with engine.begin() as conn:
67
+ await conn.run_sync(Base.metadata.create_all)
68
+ yield
69
+ await engine.dispose()
70
+
71
+
72
+ app = FastAPI(lifespan=lifespan)
73
+ admin = Admin(
74
+ app=app,
75
+ engine=engine,
76
+ base=Base,
77
+ secret_key=SECRET_KEY,
78
+ auth_backend=BuiltinAuthBackend(),
79
+ )
80
+ admin.register(Product)
81
+ ```
82
+
83
+ ## CLI Usage
84
+
85
+ Both the full name and the short alias work interchangeably:
86
+
87
+ ```bash
88
+ # Create a superuser
89
+ fastapi-admin-kit create-superuser -e admin@example.com -p mypassword
90
+ fak create-superuser -e admin@example.com -p mypassword # short alias
91
+
92
+ # List all admin users
93
+ fastapi-admin-kit users
94
+ fak users
95
+
96
+ # Change a user's password
97
+ fastapi-admin-kit changepassword -e admin@example.com -p newpassword
98
+ fak changepassword -e admin@example.com -p newpassword
99
+ ```
100
+
101
+ All commands accept `-d DATABASE_URL` or read the `DATABASE_URL` environment variable.
102
+
103
+ ## Configuration
104
+
105
+ ### Environment Variables
106
+
107
+ | Variable | Description | Default |
108
+ |---|---|---|
109
+ | `DATABASE_URL` | Async database connection string | `sqlite+aiosqlite:///./app.db` |
110
+ | `SECRET_KEY` | Signing key for sessions/CSRF/JWT (min 32 chars) | Required in production |
111
+
112
+ ### Admin Options
113
+
114
+ ```python
115
+ admin = Admin(
116
+ app=app,
117
+ engine=engine,
118
+ base=Base,
119
+ secret_key=SECRET_KEY,
120
+ title="My Admin", # Admin panel title
121
+ admin_path="/admin", # URL prefix
122
+ dark_mode_default=False, # Dark mode on by default
123
+ # Theme
124
+ theme=ThemeConfig(preset="modern", primary_color="#6366F1"),
125
+ # Auth
126
+ auth_backend=BuiltinAuthBackend(),
127
+ # Environment badge
128
+ environment_label="Production",
129
+ environment_color="danger",
130
+ )
131
+ ```
132
+
133
+ ### Database Support
134
+
135
+ - **SQLite** (default, built-in via `aiosqlite`)
136
+ - **PostgreSQL**: `pip install fastapi-admin-kit[postgres]` + set `DATABASE_URL=postgresql+asyncpg://...`
137
+ - **MySQL**: `pip install fastapi-admin-kit[mysql]` + set `DATABASE_URL=mysql+aiomysql://...`
138
+
139
+ ## Development
140
+
141
+ ```bash
142
+ # Install with dev dependencies
143
+ pip install -e ".[dev]"
144
+
145
+ # Run tests
146
+ pytest
147
+
148
+ # Lint
149
+ ruff check fastapi_admin_kit/
150
+
151
+ # Build distribution
152
+ pip install hatch
153
+ hatch build
154
+ ```
155
+
156
+ ## License
157
+
158
+ MIT
@@ -0,0 +1,73 @@
1
+ """FastAPI Admin Kit — Drop-in admin panel for FastAPI + SQLAlchemy apps."""
2
+
3
+ from fastapi_admin_kit.admin import Admin
4
+ from fastapi_admin_kit.admin.decorators import column
5
+ from fastapi_admin_kit.exceptions import ConfigError
6
+ from fastapi_admin_kit.nav import (
7
+ BuiltNavGroup,
8
+ BuiltNavItem,
9
+ DefaultSidebarBuilder,
10
+ NavGroupConfig,
11
+ NavItemConfig,
12
+ SidebarBuilder,
13
+ )
14
+ from fastapi_admin_kit.registry import AdminRegistry, RegisteredModel
15
+ from fastapi_admin_kit.types import (
16
+ ColumnMeta,
17
+ ExtraField,
18
+ FieldMeta,
19
+ FieldRenderContext,
20
+ FieldsetContext,
21
+ FieldsetSpec,
22
+ FormContext,
23
+ PermissionSet,
24
+ RelationMeta,
25
+ SeedRole,
26
+ )
27
+ from fastapi_admin_kit.views import (
28
+ AdminExtra,
29
+ BaseView,
30
+ BulkView,
31
+ CreateView,
32
+ DeleteView,
33
+ EditView,
34
+ ListView,
35
+ ModelAdmin,
36
+ SearchView,
37
+ )
38
+
39
+ __all__ = [
40
+ "Admin",
41
+ "AdminRegistry",
42
+ "ConfigError",
43
+ "RegisteredModel",
44
+ "ModelAdmin",
45
+ "column",
46
+ "BuiltNavGroup",
47
+ "BuiltNavItem",
48
+ "DefaultSidebarBuilder",
49
+ "NavGroupConfig",
50
+ "NavItemConfig",
51
+ "SidebarBuilder",
52
+ "ColumnMeta",
53
+ "RelationMeta",
54
+ "FieldMeta",
55
+ "PermissionSet",
56
+ "SeedRole",
57
+ "ExtraField",
58
+ "FieldRenderContext",
59
+ "FieldsetContext",
60
+ "FieldsetSpec",
61
+ "FormContext",
62
+ # View classes
63
+ "BaseView",
64
+ "ListView",
65
+ "CreateView",
66
+ "EditView",
67
+ "DeleteView",
68
+ "BulkView",
69
+ "SearchView",
70
+ # Per-model assets
71
+ "AdminExtra",
72
+ ]
73
+ __version__ = "0.1.0"
@@ -0,0 +1,63 @@
1
+ """Bulk actions for list views."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Callable
6
+ from typing import Any
7
+
8
+ from fastapi_admin_kit.actions.base import Action, ModelAction
9
+ from fastapi_admin_kit.actions.registry import ActionRegistry
10
+
11
+ __all__ = ["Action", "ModelAction", "ActionRegistry", "action"]
12
+
13
+
14
+ def action(
15
+ name: str = "",
16
+ label: str = "",
17
+ confirmation_message: str = "",
18
+ icon: str | None = None,
19
+ variant: str = "default",
20
+ permissions: list[str] | None = None,
21
+ location: str = "list",
22
+ description: str = "",
23
+ ) -> Callable:
24
+ """Decorator to register an action on a ModelAdmin class.
25
+
26
+ Usage::
27
+
28
+ @admin.register(Product)
29
+ class ProductAdmin(ModelAdmin):
30
+ @action(
31
+ description="Export selected products",
32
+ icon="arrow-down-tray",
33
+ variant="primary",
34
+ )
35
+ async def export_products(self, objects, request):
36
+ ...
37
+ """
38
+
39
+ def decorator(fn: Callable) -> Callable:
40
+ action_name = name or fn.__name__
41
+ action_label = label or action_name.replace("_", " ").title()
42
+
43
+ class DecoratedAction(Action):
44
+ def __init__(self) -> None:
45
+ super().__init__(
46
+ name=action_name,
47
+ label=action_label,
48
+ confirmation_message=confirmation_message,
49
+ icon=icon,
50
+ variant=variant,
51
+ permissions=permissions or [],
52
+ location=location,
53
+ description=description,
54
+ )
55
+
56
+ async def execute(self, objects: list[Any], request: Any) -> None:
57
+ await fn(self, objects, request)
58
+
59
+ fn._admin_action = DecoratedAction
60
+ fn._admin_action_name = action_name
61
+ return fn
62
+
63
+ return decorator
@@ -0,0 +1,68 @@
1
+ """Action ABCs."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from abc import ABC, abstractmethod
6
+ from typing import Any
7
+
8
+ from fastapi import Request
9
+
10
+
11
+ class Action(ABC):
12
+ """Abstract base class for admin actions.
13
+
14
+ Supports list-level, row-level, detail-level, and submit-line actions
15
+ with Unfold-style icon, variant, and permission configuration.
16
+ """
17
+
18
+ def __init__(
19
+ self,
20
+ name: str,
21
+ label: str = "",
22
+ confirmation_message: str = "",
23
+ icon: str | None = None,
24
+ variant: str = "default",
25
+ permissions: list[str] | None = None,
26
+ location: str = "list",
27
+ description: str = "",
28
+ ) -> None:
29
+ self.name = name
30
+ self.label = label or name.replace("_", " ").title()
31
+ self.confirmation_message = confirmation_message
32
+ self.icon = icon
33
+ self.variant = variant # default, primary, danger, success, warning
34
+ self.permissions = permissions or []
35
+ self.location = location # list, row, detail, submit_line
36
+ self.description = description
37
+
38
+ @abstractmethod
39
+ async def execute(
40
+ self, objects: list[Any], request: Request | None
41
+ ) -> None:
42
+ """Run the action against the selected objects."""
43
+ ...
44
+
45
+ def get_confirmation_message(self) -> str:
46
+ return self.confirmation_message or f"Run {self.label}?"
47
+
48
+ def has_permission(self, user: Any) -> bool:
49
+ """Check if the user has permission to run this action."""
50
+ if not self.permissions:
51
+ return True
52
+ if getattr(user, "is_superuser", False):
53
+ return True
54
+ user_perms = getattr(user, "permissions", []) or []
55
+ return any(p in user_perms for p in self.permissions)
56
+
57
+
58
+ class ModelAction(Action):
59
+ """Action that operates on a single model instance (row/detail actions)."""
60
+
61
+ async def execute_single(
62
+ self, obj: Any, request: Request | None
63
+ ) -> None:
64
+ """Run the action on a single object.
65
+
66
+ Override this instead of execute for single-object actions.
67
+ """
68
+ await self.execute([obj], request)