Skip to content

Commit 894c9e6

Browse files
committed
Add series field to widget action props. Fix examples. Add search by actions.
1 parent 3df24f4 commit 894c9e6

25 files changed

Lines changed: 3693 additions & 347 deletions

File tree

README.md

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@
66
[![Python 3.12](https://img.shields.io/badge/python-3.12-blue.svg)](https://www.python.org/downloads/release/python-3120/)
77
[![Python 3.13](https://img.shields.io/badge/python-3.13-blue.svg)](https://www.python.org/downloads/release/python-3130/)
88

9-
## Screenshots
9+
## Demo
1010

11-
![Sign-in view](https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/signin.png)
12-
![List view](https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/list.png)
13-
![Change view](https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/change.png)
11+
![FastAdmin demo](https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/demo.gif)
1412

1513
<p align="center">
1614
<a href="https://twitter.com/intent/tweet?text=Admin%20Dashboard%20For%20FastAPI&url=https://github.com/vsdudakov/fastadmin&hashtags=FastAPI,AdminDashboard">
@@ -357,6 +355,10 @@ class UserAdmin(TortoiseModelAdmin):
357355
list_display = ("id", "username", "is_superuser", "is_active")
358356
inlines = (UserAttachmentInline,)
359357

358+
formfield_overrides = {
359+
"avatar_url": (WidgetType.UploadImage, {"required": False}),
360+
}
361+
360362
actions = ("activate", "deactivate")
361363
widget_actions = ("users_chart", "users_list")
362364

@@ -374,15 +376,17 @@ class UserAdmin(TortoiseModelAdmin):
374376

375377
@widget_action(
376378
widget_action_type=WidgetActionType.ChartLine,
377-
widget_action_props=WidgetActionChartProps(x_field="x", y_field="y"),
379+
widget_action_props=WidgetActionChartProps(x_field="x", y_field="y", series_field="series"),
378380
tab="Analytics",
379381
title="Users over time",
380382
)
381383
async def users_chart(self, payload: WidgetActionInputSchema) -> WidgetActionResponseSchema:
382384
return WidgetActionResponseSchema(
383385
data=[
384-
{"x": "2026-01-01", "y": 10},
385-
{"x": "2026-01-02", "y": 15},
386+
{"x": "2026-01-01", "y": 10, "series": "Active"},
387+
{"x": "2026-01-02", "y": 15, "series": "Active"},
388+
{"x": "2026-01-01", "y": 3, "series": "Inactive"},
389+
{"x": "2026-01-02", "y": 5, "series": "Inactive"},
386390
]
387391
)
388392

@@ -455,6 +459,10 @@ class UserAdmin(DjangoModelAdmin):
455459
list_display = ("id", "username", "is_superuser", "is_active")
456460
inlines = (UserAttachmentInline,)
457461

462+
formfield_overrides = {
463+
"avatar_url": (WidgetType.UploadImage, {"required": False}),
464+
}
465+
458466
actions = ("activate", "deactivate")
459467
widget_actions = ("users_summary", "users_chart")
460468

@@ -492,7 +500,7 @@ class UserAdmin(DjangoModelAdmin):
492500

493501
@widget_action(
494502
widget_action_type=WidgetActionType.ChartLine,
495-
widget_action_props=WidgetActionChartProps(x_field="label", y_field="value"),
503+
widget_action_props=WidgetActionChartProps(x_field="label", y_field="value", series_field="series"),
496504
tab="Analytics",
497505
title="Active vs inactive users",
498506
)
@@ -501,8 +509,8 @@ class UserAdmin(DjangoModelAdmin):
501509
inactive = self.model_cls.objects.filter(is_active=False).count()
502510
return WidgetActionResponseSchema(
503511
data=[
504-
{"label": "active", "value": active},
505-
{"label": "inactive", "value": inactive},
512+
{"label": "users", "value": active, "series": "active"},
513+
{"label": "users", "value": inactive, "series": "inactive"},
506514
]
507515
)
508516
```
@@ -581,6 +589,10 @@ class UserAdmin(SqlAlchemyModelAdmin):
581589
list_display = ("id", "username", "is_superuser", "is_active")
582590
inlines = (UserAttachmentInline,)
583591

592+
formfield_overrides = {
593+
"avatar_url": (WidgetType.UploadImage, {"required": False}),
594+
}
595+
584596
actions = ("activate", "deactivate")
585597
widget_actions = ("users_chart", "users_list")
586598

@@ -604,12 +616,16 @@ class UserAdmin(SqlAlchemyModelAdmin):
604616

605617
@widget_action(
606618
widget_action_type=WidgetActionType.ChartBar,
607-
widget_action_props=WidgetActionChartProps(x_field="label", y_field="value"),
619+
widget_action_props=WidgetActionChartProps(x_field="label", y_field="value", series_field="series"),
608620
tab="Analytics",
609621
title="Users count",
610622
)
611623
async def users_chart(self, payload: WidgetActionInputSchema) -> WidgetActionResponseSchema:
612-
return WidgetActionResponseSchema(data=[{"label": "users", "value": 42}])
624+
return WidgetActionResponseSchema(
625+
data=[
626+
{"label": "users", "value": 42, "series": "all"},
627+
]
628+
)
613629

614630
@widget_action(
615631
widget_action_type=WidgetActionType.Action,
@@ -688,6 +704,10 @@ class UserAdmin(PonyORMModelAdmin):
688704
list_display = ("id", "username", "is_superuser", "is_active")
689705
inlines = (UserAttachmentInline,)
690706

707+
formfield_overrides = {
708+
"avatar_url": (WidgetType.UploadImage, {"required": False}),
709+
}
710+
691711
actions = ("activate", "deactivate")
692712
widget_actions = ("users_list", "users_chart")
693713

docs/assets/images/change.png

-201 KB
Binary file not shown.

docs/assets/images/demo.gif

1.98 MB
Loading

docs/assets/images/list.png

-157 KB
Binary file not shown.

docs/assets/images/signin.png

-58.7 KB
Binary file not shown.

docs/build.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ def read_cls_docstring(cls):
4444

4545
def get_versions():
4646
return [
47+
{
48+
"version": "0.4.3",
49+
"changes": ["Add series field to widget action props. Fix examples.", "Add search by actions."],
50+
},
4751
{
4852
"version": "0.4.2",
4953
"changes": [

0 commit comments

Comments
 (0)