Skip to content

Commit e6d8bb0

Browse files
committed
Fix dashboard widgets and auto register inlines.
1 parent 751efe3 commit e6d8bb0

11 files changed

Lines changed: 106 additions & 106 deletions

File tree

docs/build.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class App:
3030
NAME = "FastAdmin"
3131
AUTHOR_NAME = "Seva D."
3232
AUTHOR_EMAIL = "[email protected]"
33+
ANTD_CHARTS_EXAMPLES = "https://ant-design-charts.antgroup.com/en/examples"
3334

3435

3536
def read_cls_docstring(cls):
@@ -38,6 +39,12 @@ def read_cls_docstring(cls):
3839

3940
def get_versions():
4041
return [
42+
{
43+
"version": "0.2.4",
44+
"changes": [
45+
"Fix dashboard widgets and auto register inlines.",
46+
],
47+
},
4148
{
4249
"version": "0.2.3",
4350
"changes": [
@@ -444,7 +451,7 @@ def get_page_context(page_url):
444451
{"type": "code-python", "content": inspect.getsource(DashboardWidgetAdmin)},
445452
{
446453
"type": "alert-warning",
447-
"content": "Note: Please see <a href='https://charts.ant.design/en/examples' target='_blank'>antd charts</a> for <code>x_field_filter_widget_props</code>.",
454+
"content": f"Note: Please see <a href='{ANTD_CHARTS_EXAMPLES}' target='_blank'>antd charts</a> for <code>x_field_filter_widget_props</code>.",
448455
},
449456
]
450457
case "#widget-chart-types":
@@ -456,7 +463,7 @@ def get_page_context(page_url):
456463
{"type": "code-python", "content": inspect.getsource(DashboardWidgetType)},
457464
{
458465
"type": "alert-warning",
459-
"content": "Note: Please see <a href='https://charts.ant.design/en/examples' target='_blank'>antd charts</a> for more details (e.g. to see how they look like).",
466+
"content": f"Note: Please see <a href='={ANTD_CHARTS_EXAMPLES}' target='_blank'>antd charts</a> for more details (e.g. to see how they look like).",
460467
},
461468
]
462469
# models

docs/code/dashboard/djangoorm.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
from datetime import datetime, timedelta, timezone
2-
from typing import Any
1+
import datetime
32

43
from django.db import connection, models
54

@@ -20,33 +19,35 @@ def __str__(self):
2019
class UsersDashboardWidgetAdmin(DashboardWidgetAdmin):
2120
title = "Users"
2221
dashboard_widget_type = DashboardWidgetType.ChartLine
22+
2323
x_field = "date"
24-
y_field = "count"
2524
x_field_filter_widget_type = WidgetType.DatePicker
26-
x_field_filter_widget_props = {"picker": "month"} # noqa: RUF012
25+
x_field_filter_widget_props: dict[str, str] = {"picker": "month"} # noqa: RUF012
2726
x_field_periods = ["day", "week", "month", "year"] # noqa: RUF012
2827

28+
y_field = "count"
29+
2930
def get_data( # type: ignore [override]
3031
self,
3132
min_x_field: str | None = None,
3233
max_x_field: str | None = None,
3334
period_x_field: str | None = None,
34-
) -> dict[str, Any]:
35+
) -> dict:
3536
def dictfetchall(cursor):
3637
columns = [col[0] for col in cursor.description]
3738
return [dict(zip(columns, row, strict=True)) for row in cursor.fetchall()]
3839

3940
with connection.cursor() as c:
4041
if not min_x_field:
41-
min_x_field_date = datetime.now(timezone.utc) - timedelta(days=360)
42+
min_x_field_date = datetime.datetime.now(tz=datetime.UTC) - datetime.timedelta(days=360)
4243
else:
43-
min_x_field_date = datetime.fromisoformat(min_x_field.replace("Z", "+00:00"))
44+
min_x_field_date = datetime.datetime.fromisoformat(min_x_field)
4445
if not max_x_field:
45-
max_x_field_date = datetime.now(timezone.utc) + timedelta(days=1)
46+
max_x_field_date = datetime.datetime.now(tz=datetime.UTC) + datetime.timedelta(days=1)
4647
else:
47-
max_x_field_date = datetime.fromisoformat(max_x_field.replace("Z", "+00:00"))
48+
max_x_field_date = datetime.datetime.fromisoformat(max_x_field)
4849

49-
if not period_x_field or period_x_field not in self.x_field_periods:
50+
if not period_x_field or period_x_field not in (self.x_field_periods or []):
5051
period_x_field = "month"
5152

5253
c.execute(
@@ -63,7 +64,7 @@ def dictfetchall(cursor):
6364
results = dictfetchall(c)
6465
return {
6566
"results": results,
66-
"min_x_field": min_x_field_date.isoformat().replace("+00:00", "Z"),
67-
"max_x_field": max_x_field_date.isoformat().replace("+00:00", "Z"),
67+
"min_x_field": min_x_field_date.isoformat(),
68+
"max_x_field": max_x_field_date.isoformat(),
6869
"period_x_field": period_x_field,
6970
}

docs/code/dashboard/tortoise.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
from datetime import datetime, timedelta, timezone
2-
from typing import Any
1+
import datetime
32

43
from tortoise import Tortoise, fields
54
from tortoise.models import Model
@@ -21,12 +20,14 @@ def __str__(self):
2120
class UsersDashboardWidgetAdmin(DashboardWidgetAdmin):
2221
title = "Users"
2322
dashboard_widget_type = DashboardWidgetType.ChartLine
23+
2424
x_field = "date"
25-
y_field = "count"
2625
x_field_filter_widget_type = WidgetType.DatePicker
27-
x_field_filter_widget_props: dict[str, Any] = {"picker": "month"} # noqa: RUF012
26+
x_field_filter_widget_props: dict[str, str] = {"picker": "month"} # noqa: RUF012
2827
x_field_periods = ["day", "week", "month", "year"] # noqa: RUF012
2928

29+
y_field = "count"
30+
3031
async def get_data(
3132
self,
3233
min_x_field: str | None = None,
@@ -36,13 +37,13 @@ async def get_data(
3637
conn = Tortoise.get_connection("default")
3738

3839
if not min_x_field:
39-
min_x_field_date = datetime.now(timezone.utc) - timedelta(days=360)
40+
min_x_field_date = datetime.datetime.now(tz=datetime.UTC) - datetime.timedelta(days=360)
4041
else:
41-
min_x_field_date = datetime.fromisoformat(min_x_field.replace("Z", "+00:00"))
42+
min_x_field_date = datetime.datetime.fromisoformat(min_x_field)
4243
if not max_x_field:
43-
max_x_field_date = datetime.now(timezone.utc) + timedelta(days=1)
44+
max_x_field_date = datetime.datetime.now(tz=datetime.UTC) + datetime.timedelta(days=1)
4445
else:
45-
max_x_field_date = datetime.fromisoformat(max_x_field.replace("Z", "+00:00"))
46+
max_x_field_date = datetime.datetime.fromisoformat(max_x_field)
4647

4748
if not period_x_field or period_x_field not in (self.x_field_periods or []):
4849
period_x_field = "month"
@@ -60,7 +61,7 @@ async def get_data(
6061
)
6162
return {
6263
"results": results,
63-
"min_x_field": min_x_field_date.isoformat().replace("+00:00", "Z"),
64-
"max_x_field": max_x_field_date.isoformat().replace("+00:00", "Z"),
64+
"min_x_field": min_x_field_date.isoformat(),
65+
"max_x_field": max_x_field_date.isoformat(),
6566
"period_x_field": period_x_field,
6667
}

docs/code/inlines/tortoise.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,6 @@ def __str__(self):
2525
return self.message
2626

2727

28-
@register(InlineUser)
29-
class InlineUserAdmin(TortoiseModelAdmin):
30-
# we have to register model for inline usage
31-
pass
32-
33-
3428
class UserMessageAdminInline(TortoiseInlineModelAdmin):
3529
model = InlineUserMessage
3630
list_display = ("user", "message")

0 commit comments

Comments
 (0)