Skip to content

Commit d4b3b34

Browse files
committed
Fix comments
1 parent 08e6518 commit d4b3b34

4 files changed

Lines changed: 68 additions & 8 deletions

File tree

fastadmin/api/service.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -505,8 +505,9 @@ async def get_configuration(
505505
session_id: str | None,
506506
request: Any | None = None,
507507
) -> ConfigurationSchema:
508-
current_user_id = await get_user_id_from_session_id(session_id)
509-
if not current_user_id:
508+
try:
509+
current_user_id, current_user = await self._get_authenticated_user(session_id)
510+
except AdminApiException:
510511
return ConfigurationSchema(
511512
site_name=settings.ADMIN_SITE_NAME,
512513
site_sign_in_logo=settings.ADMIN_SITE_SIGN_IN_LOGO,
@@ -521,12 +522,6 @@ async def get_configuration(
521522
dashboard_widgets=[],
522523
)
523524

524-
admin_user_model = get_admin_model(settings.ADMIN_USER_MODEL)
525-
current_user = (
526-
await admin_user_model.get_obj(current_user_id)
527-
if admin_user_model and hasattr(admin_user_model, "get_obj")
528-
else None
529-
)
530525
admin_models = cast(dict[Any, ModelAdmin | InlineModelAdmin], get_admin_models())
531526
models = cast(
532527
Sequence[ModelSchema],

fastadmin/models/base.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,9 @@ async def save_model(self, id: UUID | int | str | None, payload: dict) -> dict |
722722

723723

724724
class DashboardWidgetAdmin:
725+
_request_context: ContextVar[Any | None]
726+
_user_context: ContextVar[Any | None]
727+
725728
title: str
726729
dashboard_widget_type: DashboardWidgetType
727730
x_field: str
@@ -731,6 +734,25 @@ class DashboardWidgetAdmin:
731734
x_field_filter_widget_props: dict[str, Any] | None = None
732735
x_field_periods: list[str] | None = None
733736

737+
def __init__(self) -> None:
738+
self._request_context = ContextVar(f"fastadmin_dashboard_request_context_{id(self)}", default=None)
739+
self._user_context = ContextVar(f"fastadmin_dashboard_user_context_{id(self)}", default=None)
740+
741+
@property
742+
def request(self) -> Any | None:
743+
"""Current request object for this async context."""
744+
return self._request_context.get()
745+
746+
@property
747+
def user(self) -> Any | None:
748+
"""Current authenticated user object for this async context."""
749+
return self._user_context.get()
750+
751+
def set_context(self, request: Any | None = None, user: Any | None = None) -> None:
752+
"""Set request/user context for the current async task."""
753+
self._request_context.set(request)
754+
self._user_context.set(user)
755+
734756
async def get_data(
735757
self,
736758
min_x_field: str | None = None,

tests/api/test_service.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,36 @@ def get_data(self, min_x_field=None, max_x_field=None, period_x_field=None):
6868
assert result["results"] == [{"x": "A", "y": 1}]
6969

7070

71+
async def test_dashboard_widget_binds_request_and_user_context(monkeypatch):
72+
monkeypatch.setattr("fastadmin.api.service.get_user_id_from_session_id", AsyncMock(return_value=1))
73+
current_user = {"id": 1, "username": "admin"}
74+
monkeypatch.setattr(
75+
"fastadmin.api.service.get_admin_model",
76+
lambda _model: SimpleNamespace(get_obj=AsyncMock(return_value=current_user)),
77+
)
78+
79+
class SyncWidget:
80+
def __init__(self):
81+
self.request = None
82+
self.user = None
83+
84+
def set_context(self, request=None, user=None):
85+
self.request = request
86+
self.user = user
87+
88+
def get_data(self, min_x_field=None, max_x_field=None, period_x_field=None):
89+
return {"results": [{"x": "A", "y": 1}]}
90+
91+
widget = SyncWidget()
92+
monkeypatch.setitem(admin_dashboard_widgets, "SyncWidgetContext", widget)
93+
94+
request = object()
95+
result = await ApiService().dashboard_widget("sid", "SyncWidgetContext", request=request)
96+
assert result["results"] == [{"x": "A", "y": 1}]
97+
assert widget.request is request
98+
assert widget.user == current_user
99+
100+
71101
async def test_list_skips_excluded_filter_fields(monkeypatch):
72102
monkeypatch.setattr("fastadmin.api.service.get_user_id_from_session_id", AsyncMock(return_value=1))
73103
admin_model = SimpleNamespace(

tests/models/test_base.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,19 @@ class Model:
6666
assert admin.user == user
6767

6868

69+
def test_dashboard_widget_admin_request_and_user_context():
70+
widget = DashboardWidgetAdmin()
71+
assert widget.request is None
72+
assert widget.user is None
73+
74+
request = {"path": "/api/dashboard-widget/TestWidget"}
75+
user = {"id": 1, "username": "admin"}
76+
widget.set_context(request=request, user=user)
77+
78+
assert widget.request == request
79+
assert widget.user == user
80+
81+
6982
async def test_export_wrong_format(mocker):
7083
class Model:
7184
pass

0 commit comments

Comments
 (0)