fastadmin 0.2.10__tar.gz → 0.2.12__tar.gz
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.
- {fastadmin-0.2.10 → fastadmin-0.2.12}/PKG-INFO +3 -3
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/models/decorators.py +5 -1
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/models/helpers.py +24 -2
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/models/orms/ponyorm.py +8 -5
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/settings.py +0 -5
- {fastadmin-0.2.10 → fastadmin-0.2.12}/pyproject.toml +3 -3
- {fastadmin-0.2.10 → fastadmin-0.2.12}/LICENSE +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/README.md +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/__init__.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/__init__.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/exceptions.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/frameworks/__init__.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/frameworks/django/__init__.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/frameworks/django/app/__init__.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/frameworks/django/app/api.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/frameworks/django/app/urls.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/frameworks/django/app/views.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/frameworks/fastapi/__init__.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/frameworks/fastapi/api.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/frameworks/fastapi/app.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/frameworks/fastapi/views.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/frameworks/flask/__init__.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/frameworks/flask/api.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/frameworks/flask/app.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/frameworks/flask/views.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/helpers.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/schemas.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/api/service.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/models/__init__.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/models/base.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/models/orms/__init__.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/models/orms/django.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/models/orms/sqlalchemy.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/models/orms/tortoise.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/models/schemas.py +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/static/images/favicon.png +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/static/images/header-logo.svg +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/static/images/sign-in-logo.svg +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/static/index.html +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/static/index.min.css +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/static/index.min.js +0 -0
- {fastadmin-0.2.10 → fastadmin-0.2.12}/fastadmin/templates/index.html +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: fastadmin
|
3
|
-
Version: 0.2.
|
3
|
+
Version: 0.2.12
|
4
4
|
Summary: FastAdmin is an easy-to-use Admin Dashboard App for FastAPI/Flask/Django inspired by Django Admin.
|
5
5
|
Home-page: https://github.com/vsdudakov/fastadmin
|
6
6
|
License: MIT
|
@@ -27,8 +27,8 @@ Provides-Extra: flask
|
|
27
27
|
Provides-Extra: pony
|
28
28
|
Provides-Extra: sqlalchemy
|
29
29
|
Provides-Extra: tortoise-orm
|
30
|
-
Requires-Dist: asgiref (
|
31
|
-
Requires-Dist: django (==
|
30
|
+
Requires-Dist: asgiref (>=3.7.0,<4.0.0)
|
31
|
+
Requires-Dist: django (==5.*) ; extra == "django"
|
32
32
|
Requires-Dist: fastapi (==0.*) ; extra == "fastapi"
|
33
33
|
Requires-Dist: flask (==2.*) ; extra == "flask"
|
34
34
|
Requires-Dist: pony (==0.*) ; extra == "pony"
|
@@ -24,7 +24,8 @@ def action(function=None, *, description: str | None = None):
|
|
24
24
|
return decorator(function)
|
25
25
|
|
26
26
|
|
27
|
-
|
27
|
+
# TODO: make the sorter parameter a string to specify how to sort the data
|
28
|
+
def display(function=None, *, sorter: bool = False):
|
28
29
|
"""Conveniently add attributes to a display function:
|
29
30
|
|
30
31
|
Example of usage:
|
@@ -33,10 +34,13 @@ def display(function=None):
|
|
33
34
|
return obj.publish_date is not None
|
34
35
|
|
35
36
|
:param function: A function to decorate.
|
37
|
+
:param sorter: Enable sorting or not. **WARNING**: supported only for Django and Tortoise.
|
38
|
+
Function name should be like an ORM ordering param, e.g. `def user__username(self, obj)`.
|
36
39
|
"""
|
37
40
|
|
38
41
|
def decorator(func):
|
39
42
|
func.is_display = True
|
43
|
+
func.sorter = sorter
|
40
44
|
return func
|
41
45
|
|
42
46
|
if function is None:
|
@@ -15,6 +15,21 @@ from fastadmin.models.schemas import (
|
|
15
15
|
ModelSchema,
|
16
16
|
)
|
17
17
|
|
18
|
+
try:
|
19
|
+
from tortoise.models import Model as TortoiseModel
|
20
|
+
except ImportError:
|
21
|
+
|
22
|
+
class TortoiseModel: # type: ignore [no-redef]
|
23
|
+
pass
|
24
|
+
|
25
|
+
|
26
|
+
try:
|
27
|
+
from django.db.models import Model as DjangoModel
|
28
|
+
except ImportError:
|
29
|
+
|
30
|
+
class DjangoModel: # type: ignore [no-redef]
|
31
|
+
pass
|
32
|
+
|
18
33
|
|
19
34
|
def register_admin_model_class(admin_model_class: type[ModelAdmin], orm_model_classes: list[Any], **kwargs) -> None:
|
20
35
|
"""This method is used to register an admin model.
|
@@ -162,17 +177,24 @@ def generate_models_schema(
|
|
162
177
|
),
|
163
178
|
)
|
164
179
|
|
165
|
-
for
|
180
|
+
for field_name in orm_model_fields_for_serialize:
|
166
181
|
display_field_function = getattr(admin_model_obj, field_name, None)
|
167
182
|
if not display_field_function or not hasattr(display_field_function, "is_display"):
|
168
183
|
continue
|
184
|
+
if field_name not in column_fields:
|
185
|
+
continue
|
186
|
+
column_index = column_fields.index(field_name)
|
187
|
+
|
188
|
+
sorter = getattr(display_field_function, "sorter", False)
|
189
|
+
if sorter and not issubclass(orm_model_cls, TortoiseModel | DjangoModel):
|
190
|
+
raise NotImplementedError("Sorter of custom columns is supported only for Tortoise or Django")
|
169
191
|
|
170
192
|
fields_schema.append(
|
171
193
|
ModelFieldSchema(
|
172
194
|
name=field_name,
|
173
195
|
list_configuration=ListConfigurationFieldSchema(
|
174
196
|
index=column_index,
|
175
|
-
sorter=
|
197
|
+
sorter=sorter,
|
176
198
|
is_link=field_name in getattr(admin_model_obj, "list_display_links", ()),
|
177
199
|
empty_value_display=admin_model_obj.empty_value_display,
|
178
200
|
filter_widget_type=None,
|
@@ -328,9 +328,12 @@ class PonyORMMixin:
|
|
328
328
|
:params id: an id of object.
|
329
329
|
:return: None.
|
330
330
|
"""
|
331
|
-
|
332
|
-
|
333
|
-
|
331
|
+
obj = next((i for i in self.model_cls.select(**{self.get_model_pk_name(self.model_cls): id})), None)
|
332
|
+
if not obj:
|
333
|
+
return
|
334
|
+
obj.delete()
|
335
|
+
flush()
|
336
|
+
commit()
|
334
337
|
|
335
338
|
@sync_to_async
|
336
339
|
@db_session
|
@@ -365,12 +368,12 @@ class PonyORMMixin:
|
|
365
368
|
obj = next((i for i in self.model_cls.select(**{key_id: getattr(obj, key_id)})), None)
|
366
369
|
if not obj:
|
367
370
|
return
|
368
|
-
obj.
|
371
|
+
getattr(obj, field).clear()
|
369
372
|
if ids:
|
370
373
|
rel_model_cls = getattr(self.model_cls, field).py_type
|
371
374
|
rel_key_id = self.get_model_pk_name(rel_model_cls)
|
372
375
|
rel_objs = list(rel_model_cls.select(lambda o: getattr(o, rel_key_id) in ids))
|
373
|
-
obj.
|
376
|
+
getattr(obj, field).add(rel_objs)
|
374
377
|
flush()
|
375
378
|
commit()
|
376
379
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "fastadmin"
|
3
|
-
version = "0.2.
|
3
|
+
version = "0.2.12"
|
4
4
|
description = "FastAdmin is an easy-to-use Admin Dashboard App for FastAPI/Flask/Django inspired by Django Admin."
|
5
5
|
authors = ["Seva D <vsdudakov@gmail.com>"]
|
6
6
|
license = "MIT"
|
@@ -28,10 +28,10 @@ packages = [
|
|
28
28
|
[tool.poetry.dependencies]
|
29
29
|
python = "^3.10"
|
30
30
|
pyjwt = "^2.6.0"
|
31
|
-
asgiref = "3.
|
31
|
+
asgiref = "^3.7.0"
|
32
32
|
fastapi = { version = "0.*", optional = true }
|
33
33
|
flask = { version = "2.*", optional = true }
|
34
|
-
django = { version = "
|
34
|
+
django = { version = "5.*", optional = true }
|
35
35
|
tortoise-orm = { version = "0.*", optional = true }
|
36
36
|
sqlalchemy = { version = "2.*", extras = ["asyncio"], optional = true }
|
37
37
|
pony = { version = "0.*", optional = true }
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|