Skip to content

Commit 3d473a0

Browse files
author
Seva
committed
Fixed bug with datetime. Added verbose name logic for models and inlines. Updated frontend libraries.
1 parent 66e32b8 commit 3d473a0

18 files changed

Lines changed: 3233 additions & 3023 deletions

File tree

docs/build.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ def read_cls_docstring(cls):
3838

3939
def get_versions():
4040
return [
41+
{
42+
"version": "0.1.41",
43+
"changes": [
44+
"Fixed bug with datetime. Added verbose name logic for models and inlines. Updated frontend libraries.",
45+
],
46+
},
4147
{
4248
"version": "0.1.40",
4349
"changes": [

docs/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<li class="social-icons-twitter"><a data-toggle="tooltip" href="" target="_blank" title="" data-original-title="Twitter"><i class="fab fa-twitter"></i></a></li>
33
<li class="social-icons-facebook"><a data-toggle="tooltip" href="" target="_blank" title="" data-original-title="Facebook"><i class="fab fa-facebook-f"></i></a></li>
44
<li class="social-icons-dribbble"><a data-toggle="tooltip" href="" target="_blank" title="" data-original-title="Dribbble"><i class="fab fa-dribbble"></i></a></li>
5-
--> </ul> </div> </nav> </header> <div id=content role=main> <div class="app-navigation bg-light"> <ul class="nav flex-column"> <li class=nav-item> <a class=nav-link href=#introduction>Introduction</a> </li> <li class=nav-item> <a class=nav-link href=#getting_started>Getting Started</a> <ul class="nav flex-column"> <li class=nav-item> <a class=nav-link href=#installation>Installation</a> </li> <li class=nav-item> <a class=nav-link href=#quick_tutorial>Quick Tutorial</a> </li> </ul> </li> <li class=nav-item> <a class=nav-link href=#settings>Settings</a> </li> <li class=nav-item> <a class=nav-link href=#dashboard-widget-admins>Dashboard Widget Admins</a> <ul class="nav flex-column"> <li class=nav-item> <a class=nav-link href=#registering-widgets>Registering Widgets</a> </li> <li class=nav-item> <a class=nav-link href=#widget-methods-and-attributes>Methods and Attributes</a> </li> <li class=nav-item> <a class=nav-link href=#widget-chart-types>Chart Types</a> </li> </ul> </li> <li class=nav-item> <a class=nav-link href=#model-admins>Model Admins</a> <ul class="nav flex-column"> <li class=nav-item> <a class=nav-link href=#registering-models>Registering Models</a> </li> <li class=nav-item> <a class=nav-link href=#authentication>Authentication</a> </li> <li class=nav-item> <a class=nav-link href=#model-methods-and-attributes>Methods and Attributes</a> </li> <li class=nav-item> <a class=nav-link href=#model-form-field-types>Form Field Types</a> </li> </ul> </li> <li class=nav-item> <a class=nav-link href=#inline-admins>Inline Model Admins</a> <ul class="nav flex-column"> <li class=nav-item> <a class=nav-link href=#registering-inlines>Registering Inlines</a> </li> <li class=nav-item> <a class=nav-link href=#inline-methods-and-attributes>Methods and Attributes</a> </li> </ul> </li> <li class=nav-item> <a class=nav-link href=#changelog>Changelog</a> <ul class="nav flex-column"> <li class=nav-item> <a class=nav-link href=#v0_1_40>v0.1.40</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_39>v0.1.39</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_38>v0.1.38</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_37>v0.1.37</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_36>v0.1.36</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_35>v0.1.35</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_34>v0.1.34</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_33>v0.1.33</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_32>v0.1.32</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_31>v0.1.31</a> </li> </ul> </li> </ul> </div> <div class=app-content> <div class=container> <section id=index> <h1>FastAdmin | Documentation</h1> <div class=row> <div class="col-sm-6 col-lg-4"> <ul class=list-unstyled> <li><strong>Version:</strong> 0.1.40</li> <li> <strong>Author:</strong> <a href=mailto:[email protected] target=_blank> Seva D. </a> </li> </ul> </div> <div class="col-sm-6 col-lg-4"> <ul class=list-unstyled> <li> <strong class=font-weight-700>Created:</strong> 7 March 2023 </li> <li> <strong>Updated:</strong> 10 June 2023 </li> </ul> </div> </div> </section> <hr class=divider> <section id=introduction> <h2>Introduction</h2> <p class=text-4> <a href=https://github.com/vsdudakov/fastadmin target=_blank>FastAdmin</a> is an easy-to-use Admin Dashboard App for FastAPI/Django/Flask inspired by Django Admin. </p> <p class=text-4> FastAdmin was built with relations in mind and admiration for the excellent and popular Django Admin. It's engraved in its design that you may configure your admin dashboard for FastAPI/Django/Flask easiest way. </p> <p class=text-4> FastAdmin is designed to be minimalistic, functional and yet familiar. </p> </section> <hr class=small-divider> <section id=getting_started> <h2>Getting Started</h2> <p class="alert alert-info"> If you have any questions that are beyond the scope of the documentation, Please feel free to email <a href=mailto:[email protected] target=_blank>us</a>. </p> <section id=installation> <h3>Installation</h3> <p class=lead> Follow the steps below to setup FastAdmin: </p> <p class=text-4> Install the package using pip: </p> <p class="alert alert-info"> Note: For zsh and macos use: <code>pip install fastadmin[fastapi,django]</code> </p> <pre>
5+
--> </ul> </div> </nav> </header> <div id=content role=main> <div class="app-navigation bg-light"> <ul class="nav flex-column"> <li class=nav-item> <a class=nav-link href=#introduction>Introduction</a> </li> <li class=nav-item> <a class=nav-link href=#getting_started>Getting Started</a> <ul class="nav flex-column"> <li class=nav-item> <a class=nav-link href=#installation>Installation</a> </li> <li class=nav-item> <a class=nav-link href=#quick_tutorial>Quick Tutorial</a> </li> </ul> </li> <li class=nav-item> <a class=nav-link href=#settings>Settings</a> </li> <li class=nav-item> <a class=nav-link href=#dashboard-widget-admins>Dashboard Widget Admins</a> <ul class="nav flex-column"> <li class=nav-item> <a class=nav-link href=#registering-widgets>Registering Widgets</a> </li> <li class=nav-item> <a class=nav-link href=#widget-methods-and-attributes>Methods and Attributes</a> </li> <li class=nav-item> <a class=nav-link href=#widget-chart-types>Chart Types</a> </li> </ul> </li> <li class=nav-item> <a class=nav-link href=#model-admins>Model Admins</a> <ul class="nav flex-column"> <li class=nav-item> <a class=nav-link href=#registering-models>Registering Models</a> </li> <li class=nav-item> <a class=nav-link href=#authentication>Authentication</a> </li> <li class=nav-item> <a class=nav-link href=#model-methods-and-attributes>Methods and Attributes</a> </li> <li class=nav-item> <a class=nav-link href=#model-form-field-types>Form Field Types</a> </li> </ul> </li> <li class=nav-item> <a class=nav-link href=#inline-admins>Inline Model Admins</a> <ul class="nav flex-column"> <li class=nav-item> <a class=nav-link href=#registering-inlines>Registering Inlines</a> </li> <li class=nav-item> <a class=nav-link href=#inline-methods-and-attributes>Methods and Attributes</a> </li> </ul> </li> <li class=nav-item> <a class=nav-link href=#changelog>Changelog</a> <ul class="nav flex-column"> <li class=nav-item> <a class=nav-link href=#v0_1_41>v0.1.41</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_40>v0.1.40</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_39>v0.1.39</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_38>v0.1.38</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_37>v0.1.37</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_36>v0.1.36</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_35>v0.1.35</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_34>v0.1.34</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_33>v0.1.33</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_32>v0.1.32</a> </li> <li class=nav-item> <a class=nav-link href=#v0_1_31>v0.1.31</a> </li> </ul> </li> </ul> </div> <div class=app-content> <div class=container> <section id=index> <h1>FastAdmin | Documentation</h1> <div class=row> <div class="col-sm-6 col-lg-4"> <ul class=list-unstyled> <li><strong>Version:</strong> 0.1.41</li> <li> <strong>Author:</strong> <a href=mailto:[email protected] target=_blank> Seva D. </a> </li> </ul> </div> <div class="col-sm-6 col-lg-4"> <ul class=list-unstyled> <li> <strong class=font-weight-700>Created:</strong> 7 March 2023 </li> <li> <strong>Updated:</strong> 10 June 2023 </li> </ul> </div> </div> </section> <hr class=divider> <section id=introduction> <h2>Introduction</h2> <p class=text-4> <a href=https://github.com/vsdudakov/fastadmin target=_blank>FastAdmin</a> is an easy-to-use Admin Dashboard App for FastAPI/Django/Flask inspired by Django Admin. </p> <p class=text-4> FastAdmin was built with relations in mind and admiration for the excellent and popular Django Admin. It's engraved in its design that you may configure your admin dashboard for FastAPI/Django/Flask easiest way. </p> <p class=text-4> FastAdmin is designed to be minimalistic, functional and yet familiar. </p> </section> <hr class=small-divider> <section id=getting_started> <h2>Getting Started</h2> <p class="alert alert-info"> If you have any questions that are beyond the scope of the documentation, Please feel free to email <a href=mailto:[email protected] target=_blank>us</a>. </p> <section id=installation> <h3>Installation</h3> <p class=lead> Follow the steps below to setup FastAdmin: </p> <p class=text-4> Install the package using pip: </p> <p class="alert alert-info"> Note: For zsh and macos use: <code>pip install fastadmin[fastapi,django]</code> </p> <pre>
66
<code class=language-bash>
77

88
pip install fastadmin[fastapi,django] # for fastapi with django orm
@@ -1264,7 +1264,7 @@
12641264
min_num: int = 1
12651265

12661266
</code>
1267-
</pre> </section> </section> <hr class=small-divider> <section id=changelog> <h2>Changelog</h2> <p class="alert alert-info"> See what's new added, changed, fixed, improved or updated in the latest versions. </p> <section id=v0_1_40> <h3>v0.1.40</h3> <p class=text-4> Added RUFF linter. Cleaned up code. Removed pydantic dependency. </p> </section> <section id=v0_1_39> <h3>v0.1.39</h3> <p class=text-4> Bug fixes. </p> </section> <section id=v0_1_38> <h3>v0.1.38</h3> <p class=text-4> Bug fixes. </p> </section> <section id=v0_1_37> <h3>v0.1.37</h3> <p class=text-4> Bug fixes. </p> </section> <section id=v0_1_36> <h3>v0.1.36</h3> <p class=text-4> Added autogeneration of documentation and examples. </p> </section> <section id=v0_1_35> <h3>v0.1.35</h3> <p class=text-4> Added DashboardWidgetAdmin class and charts for dashboard. </p> </section> <section id=v0_1_34> <h3>v0.1.34</h3> <p class=text-4> Added SlugInput, EmailInput, PhoneInput, UrlInput, JsonTextArea widget types. </p> </section> <section id=v0_1_33> <h3>v0.1.33</h3> <p class=text-4> Added list_display_widths parameter. </p> </section> <section id=v0_1_32> <h3>v0.1.32</h3> <p class=text-4> Added Upload widget type. </p> </section> <section id=v0_1_31> <h3>v0.1.31</h3> <p class=text-4> Added PasswordInput widget type. </p> </section> </section> <hr class=small-divider> </div> </div> </div> <footer id=footer class="section bg-dark footer-text-light"> <div class=container> <!--
1267+
</pre> </section> </section> <hr class=small-divider> <section id=changelog> <h2>Changelog</h2> <p class="alert alert-info"> See what's new added, changed, fixed, improved or updated in the latest versions. </p> <section id=v0_1_41> <h3>v0.1.41</h3> <p class=text-4> Fixed bug with datetime. Added verbose name logic for models and inlines. Updated frontend libraries. </p> </section> <section id=v0_1_40> <h3>v0.1.40</h3> <p class=text-4> Added RUFF linter. Cleaned up code. Removed pydantic dependency. </p> </section> <section id=v0_1_39> <h3>v0.1.39</h3> <p class=text-4> Bug fixes. </p> </section> <section id=v0_1_38> <h3>v0.1.38</h3> <p class=text-4> Bug fixes. </p> </section> <section id=v0_1_37> <h3>v0.1.37</h3> <p class=text-4> Bug fixes. </p> </section> <section id=v0_1_36> <h3>v0.1.36</h3> <p class=text-4> Added autogeneration of documentation and examples. </p> </section> <section id=v0_1_35> <h3>v0.1.35</h3> <p class=text-4> Added DashboardWidgetAdmin class and charts for dashboard. </p> </section> <section id=v0_1_34> <h3>v0.1.34</h3> <p class=text-4> Added SlugInput, EmailInput, PhoneInput, UrlInput, JsonTextArea widget types. </p> </section> <section id=v0_1_33> <h3>v0.1.33</h3> <p class=text-4> Added list_display_widths parameter. </p> </section> <section id=v0_1_32> <h3>v0.1.32</h3> <p class=text-4> Added Upload widget type. </p> </section> <section id=v0_1_31> <h3>v0.1.31</h3> <p class=text-4> Added PasswordInput widget type. </p> </section> </section> <hr class=small-divider> </div> </div> </div> <footer id=footer class="section bg-dark footer-text-light"> <div class=container> <!--
12681268
<ul class="social-icons social-icons-lg social-icons-muted justify-content-center mb-3">
12691269
<li><a data-toggle="tooltip" href="https://twitter.com/harnishdesign/" target="_blank" title="" data-original-title="Twitter"><i class="fab fa-twitter"></i></a></li>
12701270
<li><a data-toggle="tooltip" href="http://www.facebook.com/harnishdesign/" target="_blank" title="" data-original-title="Facebook"><i class="fab fa-facebook-f"></i></a></li>

fastadmin/api/service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ async def get_user_id_from_session_id(session_id: str | None) -> UUID | int | No
7979
if not session_expired_at:
8080
return None
8181

82-
if datetime.fromisoformat(session_expired_at) < datetime.now(timezone.utc):
82+
if datetime.fromisoformat(session_expired_at).replace(tzinfo=timezone.utc) < datetime.now(timezone.utc):
8383
return None
8484

8585
user_id = token_payload.get("user_id")

fastadmin/models/helpers.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@ def generate_models_schema(
231231
preserve_filters=admin_model_obj.preserve_filters,
232232
list_max_show_all=admin_model_obj.list_max_show_all,
233233
show_full_result_count=admin_model_obj.show_full_result_count,
234+
verbose_name=admin_model_obj.verbose_name,
235+
verbose_name_plural=admin_model_obj.verbose_name_plural,
234236
# specific model fields
235237
fieldsets=admin_model_obj.fieldsets,
236238
save_on_top=admin_model_obj.save_on_top,
@@ -271,12 +273,12 @@ def generate_models_schema(
271273
preserve_filters=admin_model_obj.preserve_filters,
272274
list_max_show_all=admin_model_obj.list_max_show_all,
273275
show_full_result_count=admin_model_obj.show_full_result_count,
276+
verbose_name=admin_model_obj.verbose_name,
277+
verbose_name_plural=admin_model_obj.verbose_name_plural,
274278
# specific inline model fields
275279
fk_name=fk_name,
276280
max_num=admin_model_obj.max_num,
277281
min_num=admin_model_obj.min_num,
278-
verbose_name=admin_model_obj.verbose_name,
279-
verbose_name_plural=admin_model_obj.verbose_name_plural,
280282
),
281283
)
282284
return models_schemas

fastadmin/models/schemas.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ class BaseModelSchema:
120120
preserve_filters: bool | None
121121
list_max_show_all: int | None
122122
show_full_result_count: bool | None
123+
verbose_name: str | None
124+
verbose_name_plural: str | None
123125

124126

125127
@dataclass
@@ -129,8 +131,6 @@ class InlineModelSchema(BaseModelSchema):
129131
fk_name: str
130132
max_num: int | None
131133
min_num: int | None
132-
verbose_name: str | None
133-
verbose_name_plural: str | None
134134

135135

136136
@dataclass

fastadmin/static/js/main.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/src/components/async-select/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { useTranslation } from 'react-i18next';
2121
import { getFetcher, postFetcher } from 'fetchers/fetchers';
2222
import { FormContainer } from 'components/form-container';
2323
import { handleError } from 'helpers/forms';
24-
import { getTitleFromModelClass } from 'helpers/title';
24+
import { getTitleFromModel } from 'helpers/title';
2525
import { EModelPermission, IModel } from 'interfaces/configuration';
2626
import { ConfigurationContext } from 'providers/ConfigurationProvider';
2727

@@ -103,7 +103,7 @@ export const AsyncSelect: React.FC<IAsyncSelect> = ({
103103
<Modal
104104
width={600}
105105
open={openAdd}
106-
title={_t(`Add ${getTitleFromModelClass(parentModel)}`)}
106+
title={_t(`Add ${modelConfiguration && getTitleFromModel(modelConfiguration)}`)}
107107
onCancel={onCloseAdd}
108108
footer={null}
109109
>
@@ -131,7 +131,7 @@ export const AsyncSelect: React.FC<IAsyncSelect> = ({
131131
)}
132132
</Modal>
133133
<Space.Compact style={{ width: '100%' }}>
134-
<Tooltip title={_t(`Add ${getTitleFromModelClass(parentModel)}`)}>
134+
<Tooltip title={_t(`Add ${modelConfiguration && getTitleFromModel(modelConfiguration)}`)}>
135135
<Button onClick={onOpenAdd}>
136136
<PlusCircleOutlined />
137137
</Button>

frontend/src/components/crud-container/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { SignInUserContext } from 'providers/SignInUserProvider';
2323
import { postFetcher } from 'fetchers/fetchers';
2424
import { IModel } from 'interfaces/configuration';
2525
import { useIsMobile } from 'hooks/useIsMobile';
26-
import { getTitleFromModelClass } from 'helpers/title';
26+
import { getTitleFromModel } from 'helpers/title';
2727

2828
const { Header, Sider } = Layout;
2929
const { Title } = Typography;
@@ -108,7 +108,7 @@ export const CrudContainer: React.FC<ICrudContainer> = ({
108108
.map((m: IModel) => {
109109
return {
110110
key: m.name,
111-
label: getTitleFromModelClass(m.name),
111+
label: getTitleFromModel(m),
112112
};
113113
}),
114114
];

frontend/src/components/form-container/index.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
IInlineModel,
1212
} from 'interfaces/configuration';
1313
import { getWidgetCls } from 'helpers/widgets';
14-
import { getTitleFromFieldName, getTitleFromModelClass } from 'helpers/title';
14+
import { getTitleFromFieldName, getTitleFromModel } from 'helpers/title';
1515
import { InlineWidget } from 'components/inline-widget';
1616
import { isJson, isSlug } from 'helpers/transform';
1717

@@ -214,13 +214,7 @@ export const FormContainer: React.FC<IFormContainer> = ({
214214
}
215215
return (modelConfiguration?.inlines || []).map((inline: IInlineModel) => {
216216
return (
217-
<Form.Item
218-
label={
219-
inline.verbose_name_plural ||
220-
`${inline.verbose_name || getTitleFromModelClass(inline.name)}s`
221-
}
222-
key={inline.name}
223-
>
217+
<Form.Item label={getTitleFromModel(inline, true)} key={inline.name}>
224218
<InlineWidget modelConfiguration={inline} parentId={id} />
225219
</Form.Item>
226220
);

frontend/src/components/inline-widget/index.tsx

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { transformDataFromServer, transformFiltersToServer } from 'helpers/trans
1414
import { deleteFetcher, getFetcher, patchFetcher, postFetcher } from 'fetchers/fetchers';
1515
import { ConfigurationContext } from 'providers/ConfigurationProvider';
1616
import { EModelPermission, IInlineModel, IModelAction } from 'interfaces/configuration';
17-
import { getTitleFromModelClass } from 'helpers/title';
17+
import { getTitleFromModel } from 'helpers/title';
1818
import { ExportBtn } from 'components/export-btn';
1919
import { FormContainer } from 'components/form-container';
2020

@@ -375,10 +375,7 @@ export const InlineWidget: React.FC<IInlineWidget> = ({ modelConfiguration, pare
375375
<Modal
376376
width="100%"
377377
open={openList}
378-
title={
379-
modelConfiguration.verbose_name_plural ||
380-
`${modelConfiguration.verbose_name || getTitleFromModelClass(modelConfiguration.name)}s`
381-
}
378+
title={getTitleFromModel(modelConfiguration, true)}
382379
onCancel={onCloseList}
383380
footer={null}
384381
>
@@ -415,7 +412,7 @@ export const InlineWidget: React.FC<IInlineWidget> = ({ modelConfiguration, pare
415412
<Modal
416413
width={600}
417414
open={openAdd}
418-
title={`Add ${getTitleFromModelClass(modelConfiguration.name)}`}
415+
title={`Add ${getTitleFromModel(modelConfiguration)}`}
419416
onCancel={onCloseAdd}
420417
footer={null}
421418
>
@@ -445,7 +442,7 @@ export const InlineWidget: React.FC<IInlineWidget> = ({ modelConfiguration, pare
445442
<Modal
446443
width={600}
447444
open={!!openChange}
448-
title={`Change ${getTitleFromModelClass(modelConfiguration.name)} ${openChange}`}
445+
title={`Change ${getTitleFromModel(modelConfiguration)} ${openChange}`}
449446
onCancel={onCloseChange}
450447
footer={null}
451448
>

0 commit comments

Comments
 (0)