fastapi-admin-kit 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fastapi_admin_kit/__init__.py +73 -0
- fastapi_admin_kit/actions/__init__.py +63 -0
- fastapi_admin_kit/actions/base.py +68 -0
- fastapi_admin_kit/actions/registry.py +43 -0
- fastapi_admin_kit/admin/__init__.py +17 -0
- fastapi_admin_kit/admin/admin_config.py +95 -0
- fastapi_admin_kit/admin/admin_database.py +138 -0
- fastapi_admin_kit/admin/admin_router.py +74 -0
- fastapi_admin_kit/admin/admin_template.py +203 -0
- fastapi_admin_kit/admin/builtin_models.py +284 -0
- fastapi_admin_kit/admin/core.py +1036 -0
- fastapi_admin_kit/admin/decorators.py +70 -0
- fastapi_admin_kit/admin/state.py +76 -0
- fastapi_admin_kit/admin.py +728 -0
- fastapi_admin_kit/api/__init__.py +44 -0
- fastapi_admin_kit/api/auth.py +342 -0
- fastapi_admin_kit/api/crud.py +128 -0
- fastapi_admin_kit/api/deps.py +79 -0
- fastapi_admin_kit/api/roles.py +128 -0
- fastapi_admin_kit/api/schema_generator.py +171 -0
- fastapi_admin_kit/api/schemas.py +81 -0
- fastapi_admin_kit/api/search.py +132 -0
- fastapi_admin_kit/audit/__init__.py +36 -0
- fastapi_admin_kit/audit/context.py +62 -0
- fastapi_admin_kit/audit/diff.py +77 -0
- fastapi_admin_kit/audit/event_bus.py +96 -0
- fastapi_admin_kit/audit/events.py +48 -0
- fastapi_admin_kit/audit/listener.py +159 -0
- fastapi_admin_kit/audit/logger.py +28 -0
- fastapi_admin_kit/audit/middleware.py +39 -0
- fastapi_admin_kit/audit/models.py +53 -0
- fastapi_admin_kit/audit/sqlalchemy_logger.py +58 -0
- fastapi_admin_kit/auth/__init__.py +34 -0
- fastapi_admin_kit/auth/backend.py +95 -0
- fastapi_admin_kit/auth/csrf.py +240 -0
- fastapi_admin_kit/auth/dependencies.py +150 -0
- fastapi_admin_kit/auth/identity.py +181 -0
- fastapi_admin_kit/auth/models.py +246 -0
- fastapi_admin_kit/auth/password.py +35 -0
- fastapi_admin_kit/auth/permissions.py +205 -0
- fastapi_admin_kit/auth/protocol.py +22 -0
- fastapi_admin_kit/auth/ratelimit.py +88 -0
- fastapi_admin_kit/auth/router.py +10 -0
- fastapi_admin_kit/auth/session.py +79 -0
- fastapi_admin_kit/auth/totp.py +83 -0
- fastapi_admin_kit/auth/views.py +165 -0
- fastapi_admin_kit/cli.py +229 -0
- fastapi_admin_kit/config/__init__.py +19 -0
- fastapi_admin_kit/config/audit.py +18 -0
- fastapi_admin_kit/config/auth.py +54 -0
- fastapi_admin_kit/config/behavior.py +27 -0
- fastapi_admin_kit/config/nav.py +32 -0
- fastapi_admin_kit/config/storage.py +22 -0
- fastapi_admin_kit/config/theme.py +215 -0
- fastapi_admin_kit/config/ui.py +147 -0
- fastapi_admin_kit/dashboard/__init__.py +64 -0
- fastapi_admin_kit/db.py +133 -0
- fastapi_admin_kit/exceptions.py +5 -0
- fastapi_admin_kit/field_types.py +81 -0
- fastapi_admin_kit/filters/__init__.py +21 -0
- fastapi_admin_kit/filters/base.py +170 -0
- fastapi_admin_kit/filters/registry.py +68 -0
- fastapi_admin_kit/flash.py +45 -0
- fastapi_admin_kit/form/__init__.py +1 -0
- fastapi_admin_kit/form/pipeline.py +106 -0
- fastapi_admin_kit/inspection/__init__.py +117 -0
- fastapi_admin_kit/inspection/registry.py +253 -0
- fastapi_admin_kit/inspection.py +115 -0
- fastapi_admin_kit/modeladmin.py +375 -0
- fastapi_admin_kit/models/__init__.py +7 -0
- fastapi_admin_kit/models/base.py +7 -0
- fastapi_admin_kit/nav.py +208 -0
- fastapi_admin_kit/pagination/__init__.py +14 -0
- fastapi_admin_kit/pagination/base.py +40 -0
- fastapi_admin_kit/pagination/cursor.py +97 -0
- fastapi_admin_kit/pagination/dynamic.py +48 -0
- fastapi_admin_kit/pagination/offset.py +42 -0
- fastapi_admin_kit/plugins/__init__.py +1 -0
- fastapi_admin_kit/py.typed +0 -0
- fastapi_admin_kit/registry/__init__.py +5 -0
- fastapi_admin_kit/registry/core.py +287 -0
- fastapi_admin_kit/registry/validation.py +107 -0
- fastapi_admin_kit/registry.py +15 -0
- fastapi_admin_kit/router.py +335 -0
- fastapi_admin_kit/static/css/admin.css +4736 -0
- fastapi_admin_kit/static/css/presets.css +317 -0
- fastapi_admin_kit/static/css/tokens.css +217 -0
- fastapi_admin_kit/static/css/variables.css +74 -0
- fastapi_admin_kit/static/icons/heroicons.svg +160 -0
- fastapi_admin_kit/static/js/admin.js +692 -0
- fastapi_admin_kit/static/js/htmx-config.js +42 -0
- fastapi_admin_kit/storage/__init__.py +6 -0
- fastapi_admin_kit/storage/base.py +48 -0
- fastapi_admin_kit/storage/local.py +73 -0
- fastapi_admin_kit/templates/base.html +142 -0
- fastapi_admin_kit/templates/macros/form_fields.html +660 -0
- fastapi_admin_kit/templates/macros/icons.html +50 -0
- fastapi_admin_kit/templates/macros/table.html +108 -0
- fastapi_admin_kit/templates/macros/widgets.html +159 -0
- fastapi_admin_kit/templates/pages/2fa/setup.html +122 -0
- fastapi_admin_kit/templates/pages/2fa/verify.html +55 -0
- fastapi_admin_kit/templates/pages/audit_detail.html +122 -0
- fastapi_admin_kit/templates/pages/audit_log.html +102 -0
- fastapi_admin_kit/templates/pages/dashboard.html +295 -0
- fastapi_admin_kit/templates/pages/detail.html +183 -0
- fastapi_admin_kit/templates/pages/form.html +119 -0
- fastapi_admin_kit/templates/pages/list.html +277 -0
- fastapi_admin_kit/templates/pages/login.html +85 -0
- fastapi_admin_kit/templates/pages/profile/password.html +78 -0
- fastapi_admin_kit/templates/pages/profile/profile.html +73 -0
- fastapi_admin_kit/templates/pages/role_form.html +75 -0
- fastapi_admin_kit/templates/pages/roles/form.html +117 -0
- fastapi_admin_kit/templates/pages/roles/list.html +69 -0
- fastapi_admin_kit/templates/pages/roles.html +77 -0
- fastapi_admin_kit/templates/pages/settings/theme.html +255 -0
- fastapi_admin_kit/templates/pages/users/form.html +229 -0
- fastapi_admin_kit/templates/pages/users/list.html +83 -0
- fastapi_admin_kit/templates/partials/command_palette.html +52 -0
- fastapi_admin_kit/templates/partials/field_wrapper.html +2 -0
- fastapi_admin_kit/templates/partials/flash_messages.html +39 -0
- fastapi_admin_kit/templates/partials/head.html +21 -0
- fastapi_admin_kit/templates/partials/head_minimal.html +18 -0
- fastapi_admin_kit/templates/partials/list_table.html +178 -0
- fastapi_admin_kit/templates/partials/mobile_backdrop.html +2 -0
- fastapi_admin_kit/templates/partials/pagination.html +82 -0
- fastapi_admin_kit/templates/partials/permission_widget.html +86 -0
- fastapi_admin_kit/templates/partials/scripts.html +13 -0
- fastapi_admin_kit/templates/partials/sidebar.html +94 -0
- fastapi_admin_kit/templates/partials/topbar.html +95 -0
- fastapi_admin_kit/types.py +145 -0
- fastapi_admin_kit/validation.py +43 -0
- fastapi_admin_kit/views/__init__.py +78 -0
- fastapi_admin_kit/views/audit.py +134 -0
- fastapi_admin_kit/views/bulk.py +28 -0
- fastapi_admin_kit/views/class_views.py +1040 -0
- fastapi_admin_kit/views/context.py +588 -0
- fastapi_admin_kit/views/dashboard.py +162 -0
- fastapi_admin_kit/views/delete.py +31 -0
- fastapi_admin_kit/views/extra.py +65 -0
- fastapi_admin_kit/views/factory.py +667 -0
- fastapi_admin_kit/views/form.py +159 -0
- fastapi_admin_kit/views/list.py +28 -0
- fastapi_admin_kit/views/profile.py +219 -0
- fastapi_admin_kit/views/protocols.py +54 -0
- fastapi_admin_kit/views/renderers.py +634 -0
- fastapi_admin_kit/views/roles.py +230 -0
- fastapi_admin_kit/views/search.py +31 -0
- fastapi_admin_kit/views/settings.py +31 -0
- fastapi_admin_kit/views/sidebar.py +101 -0
- fastapi_admin_kit/views/totp.py +249 -0
- fastapi_admin_kit/views/users.py +347 -0
- fastapi_admin_kit/views.py +117 -0
- fastapi_admin_kit/widgets/__init__.py +44 -0
- fastapi_admin_kit/widgets/base.py +44 -0
- fastapi_admin_kit/widgets/inputs.py +363 -0
- fastapi_admin_kit/widgets/registry.py +110 -0
- fastapi_admin_kit/widgets/relation.py +70 -0
- fastapi_admin_kit/widgets/resolver.py +102 -0
- fastapi_admin_kit-0.1.0.dist-info/METADATA +210 -0
- fastapi_admin_kit-0.1.0.dist-info/RECORD +163 -0
- fastapi_admin_kit-0.1.0.dist-info/WHEEL +4 -0
- fastapi_admin_kit-0.1.0.dist-info/entry_points.txt +3 -0
- fastapi_admin_kit-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""Decorators for ModelAdmin customization."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Callable
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class ColumnOptions:
|
|
11
|
+
"""Metadata for @column() decorator."""
|
|
12
|
+
|
|
13
|
+
header: str = ""
|
|
14
|
+
boolean: bool = False
|
|
15
|
+
order: str | None = None
|
|
16
|
+
format: str | None = None
|
|
17
|
+
empty_value: str = "-"
|
|
18
|
+
template: str | None = None
|
|
19
|
+
admin_order_field: str | None = None
|
|
20
|
+
css_class: str = ""
|
|
21
|
+
width: str | None = None
|
|
22
|
+
exportable: bool = True
|
|
23
|
+
icon: str = ""
|
|
24
|
+
|
|
25
|
+
def __call__(self, func: Callable) -> Callable:
|
|
26
|
+
if not self.header:
|
|
27
|
+
self.header = func.__name__.replace("_", " ").title()
|
|
28
|
+
func._column_options = self
|
|
29
|
+
return func
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def column(
|
|
33
|
+
header: str = "",
|
|
34
|
+
boolean: bool = False,
|
|
35
|
+
order: str | None = None,
|
|
36
|
+
format: str | None = None,
|
|
37
|
+
empty_value: str = "-",
|
|
38
|
+
template: str | None = None,
|
|
39
|
+
admin_order_field: str | None = None,
|
|
40
|
+
css_class: str = "",
|
|
41
|
+
width: str | None = None,
|
|
42
|
+
exportable: bool = True,
|
|
43
|
+
icon: str = "",
|
|
44
|
+
) -> ColumnOptions:
|
|
45
|
+
"""Decorator to mark a method as a custom column display.
|
|
46
|
+
|
|
47
|
+
Usage::
|
|
48
|
+
|
|
49
|
+
from fastapi_admin_kit import column
|
|
50
|
+
|
|
51
|
+
class ProductAdmin(ModelAdmin):
|
|
52
|
+
list_display = ["name", "price_display"]
|
|
53
|
+
|
|
54
|
+
@column(header="Price", format="${:,.2f}", icon="attach_money")
|
|
55
|
+
def price_display(self, obj):
|
|
56
|
+
return obj.price
|
|
57
|
+
"""
|
|
58
|
+
return ColumnOptions(
|
|
59
|
+
header=header,
|
|
60
|
+
boolean=boolean,
|
|
61
|
+
order=order,
|
|
62
|
+
format=format,
|
|
63
|
+
empty_value=empty_value,
|
|
64
|
+
template=template,
|
|
65
|
+
admin_order_field=admin_order_field,
|
|
66
|
+
css_class=css_class,
|
|
67
|
+
width=width,
|
|
68
|
+
exportable=exportable,
|
|
69
|
+
icon=icon,
|
|
70
|
+
)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""Typed AdminState — replaces untyped app.state attributes."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass, field
|
|
6
|
+
from typing import TYPE_CHECKING, Any
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from jinja2 import Environment
|
|
10
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
11
|
+
|
|
12
|
+
from fastapi_admin_kit.admin.core import Admin
|
|
13
|
+
from fastapi_admin_kit.auth.backend import AuthBackend
|
|
14
|
+
from fastapi_admin_kit.auth.session import SignedCookieSessionBackend
|
|
15
|
+
from fastapi_admin_kit.registry import AdminRegistry
|
|
16
|
+
from fastapi_admin_kit.storage.base import StorageBackend
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass
|
|
20
|
+
class AdminState:
|
|
21
|
+
"""Typed container for admin state stored on ``app.state.admin_state``.
|
|
22
|
+
|
|
23
|
+
Replaces the previous pattern of storing a dozen untyped attributes
|
|
24
|
+
directly on ``app.state``.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
engine: Any = None
|
|
28
|
+
session_backend: SignedCookieSessionBackend | None = None
|
|
29
|
+
auth_backend: AuthBackend | None = None
|
|
30
|
+
storage: StorageBackend | None = None
|
|
31
|
+
registry: AdminRegistry | None = None
|
|
32
|
+
db_session: AsyncSession | None = None
|
|
33
|
+
config: dict[str, Any] = field(default_factory=dict)
|
|
34
|
+
jinja_env: Environment | None = None
|
|
35
|
+
admin_instance: Admin | None = None
|
|
36
|
+
# Unified signing-key source — used by signed-cookie sessions, CSRF, and JWT.
|
|
37
|
+
secret_key: str = ""
|
|
38
|
+
session_samesite: str = "strict"
|
|
39
|
+
|
|
40
|
+
@classmethod
|
|
41
|
+
def from_request(cls, request: Any) -> AdminState:
|
|
42
|
+
"""Get AdminState from a FastAPI Request object.
|
|
43
|
+
|
|
44
|
+
Tries the typed ``app.state.admin_state`` first, then falls back
|
|
45
|
+
to building from legacy individual attributes.
|
|
46
|
+
"""
|
|
47
|
+
state = getattr(request.app.state, "admin_state", None)
|
|
48
|
+
if isinstance(state, AdminState):
|
|
49
|
+
return state
|
|
50
|
+
return cls.from_app_state(request.app.state)
|
|
51
|
+
|
|
52
|
+
@classmethod
|
|
53
|
+
def from_app_state(cls, app_state: Any) -> AdminState:
|
|
54
|
+
"""Build an AdminState from a Starlette ``app.state`` object.
|
|
55
|
+
|
|
56
|
+
Supports both the new typed format (``app.state.admin_state``) and
|
|
57
|
+
legacy untyped attributes for backward compatibility.
|
|
58
|
+
"""
|
|
59
|
+
# If already stored as typed object, return it directly
|
|
60
|
+
typed = getattr(app_state, "admin_state", None)
|
|
61
|
+
if isinstance(typed, AdminState):
|
|
62
|
+
return typed
|
|
63
|
+
|
|
64
|
+
# Legacy: build from individual attributes
|
|
65
|
+
return cls(
|
|
66
|
+
engine=getattr(app_state, "admin_engine", None),
|
|
67
|
+
session_backend=getattr(app_state, "admin_session_backend", None),
|
|
68
|
+
auth_backend=getattr(app_state, "admin_auth_backend", None),
|
|
69
|
+
storage=getattr(app_state, "admin_storage", None),
|
|
70
|
+
registry=getattr(app_state, "admin_registry", None),
|
|
71
|
+
db_session=getattr(app_state, "admin_db_session", None),
|
|
72
|
+
config=getattr(app_state, "admin_config", {}),
|
|
73
|
+
jinja_env=getattr(app_state, "admin_jinja_env", None),
|
|
74
|
+
admin_instance=getattr(app_state, "admin", None),
|
|
75
|
+
secret_key=getattr(app_state, "admin_secret_key", ""),
|
|
76
|
+
)
|