fastadmin 0.2.15__tar.gz → 0.2.17__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.15 → fastadmin-0.2.17}/PKG-INFO +1 -1
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/service.py +2 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/orms/sqlalchemy.py +28 -8
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/schemas.py +1 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/settings.py +3 -0
- fastadmin-0.2.17/fastadmin/static/assets/worker-C151k0-L.js +13 -0
- fastadmin-0.2.17/fastadmin/static/assets/worker-MF2p-l5_.js +13 -0
- fastadmin-0.2.17/fastadmin/static/index.min.js +865 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/pyproject.toml +1 -1
- fastadmin-0.2.15/fastadmin/static/index.min.js +0 -864
- {fastadmin-0.2.15 → fastadmin-0.2.17}/LICENSE +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/README.md +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/__init__.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/__init__.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/exceptions.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/__init__.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/django/__init__.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/django/app/__init__.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/django/app/api.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/django/app/urls.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/django/app/views.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/fastapi/__init__.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/fastapi/api.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/fastapi/app.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/fastapi/views.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/flask/__init__.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/flask/api.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/flask/app.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/flask/views.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/helpers.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/schemas.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/__init__.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/base.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/decorators.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/helpers.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/orms/__init__.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/orms/django.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/orms/ponyorm.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/orms/tortoise.py +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/static/assets/worker-D3TWcJOI.js +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/static/images/favicon.png +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/static/images/header-logo.svg +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/static/images/sign-in-logo.svg +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/static/index.html +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/static/index.min.css +0 -0
- {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/templates/index.html +0 -0
@@ -460,6 +460,7 @@ class ApiService:
|
|
460
460
|
username_field=settings.ADMIN_USER_MODEL_USERNAME_FIELD,
|
461
461
|
date_format=settings.ADMIN_DATE_FORMAT,
|
462
462
|
datetime_format=settings.ADMIN_DATETIME_FORMAT,
|
463
|
+
disable_crop_image=settings.ADMIN_DISABLE_CROP_IMAGE,
|
463
464
|
models=[],
|
464
465
|
dashboard_widgets=[],
|
465
466
|
)
|
@@ -476,6 +477,7 @@ class ApiService:
|
|
476
477
|
username_field=settings.ADMIN_USER_MODEL_USERNAME_FIELD,
|
477
478
|
date_format=settings.ADMIN_DATE_FORMAT,
|
478
479
|
datetime_format=settings.ADMIN_DATETIME_FORMAT,
|
480
|
+
disable_crop_image=settings.ADMIN_DISABLE_CROP_IMAGE,
|
479
481
|
models=models,
|
480
482
|
dashboard_widgets=dashboard_widgets,
|
481
483
|
) # type: ignore [call-arg]
|
@@ -1,7 +1,8 @@
|
|
1
|
+
import contextlib
|
1
2
|
from typing import Any
|
2
3
|
from uuid import UUID
|
3
4
|
|
4
|
-
from sqlalchemy import and_, func, inspect, or_, select, text
|
5
|
+
from sqlalchemy import BIGINT, Integer, and_, func, inspect, or_, select, text
|
5
6
|
from sqlalchemy.orm import selectinload
|
6
7
|
|
7
8
|
from fastadmin.models.base import InlineModelAdmin, ModelAdmin
|
@@ -261,21 +262,27 @@ class SqlAlchemyMixin:
|
|
261
262
|
for field_with_condition, value in filters.items():
|
262
263
|
field = field_with_condition[0]
|
263
264
|
condition = field_with_condition[1]
|
265
|
+
model_field = getattr(self.model_cls, field)
|
266
|
+
|
267
|
+
if isinstance(model_field.expression.type, BIGINT | Integer):
|
268
|
+
with contextlib.suppress(ValueError):
|
269
|
+
value = int(value)
|
270
|
+
|
264
271
|
match condition:
|
265
272
|
case "lte":
|
266
|
-
q.append(
|
273
|
+
q.append(model_field >= value)
|
267
274
|
case "gte":
|
268
|
-
q.append(
|
275
|
+
q.append(model_field <= value)
|
269
276
|
case "lt":
|
270
|
-
q.append(
|
277
|
+
q.append(model_field > value)
|
271
278
|
case "gt":
|
272
|
-
q.append(
|
279
|
+
q.append(model_field < value)
|
273
280
|
case "exact":
|
274
|
-
q.append(
|
281
|
+
q.append(model_field == value)
|
275
282
|
case "contains":
|
276
|
-
q.append(
|
283
|
+
q.append(model_field.like(f"%{value}%"))
|
277
284
|
case "icontains":
|
278
|
-
q.append(
|
285
|
+
q.append(model_field.ilike(f"%{value}%"))
|
279
286
|
qs = qs.filter(and_(*q))
|
280
287
|
|
281
288
|
if search and self.search_fields:
|
@@ -313,6 +320,13 @@ class SqlAlchemyMixin:
|
|
313
320
|
async with sessionmaker() as session:
|
314
321
|
return await session.get(self.model_cls, id)
|
315
322
|
|
323
|
+
def _get_foreign_key_fields(self) -> list[str]:
|
324
|
+
"""Returns a list of foreign key fields for the model.
|
325
|
+
|
326
|
+
:return: List of foreign key field names.
|
327
|
+
"""
|
328
|
+
return [column.name for column in self.model_cls.__table__.columns if column.foreign_keys]
|
329
|
+
|
316
330
|
async def orm_save_obj(self, id: UUID | Any | None, payload: dict) -> Any:
|
317
331
|
"""This method is used to save orm/db model object.
|
318
332
|
|
@@ -320,6 +334,12 @@ class SqlAlchemyMixin:
|
|
320
334
|
:params payload: a dict of payload.
|
321
335
|
:return: An object.
|
322
336
|
"""
|
337
|
+
for fk_field_name in self._get_foreign_key_fields():
|
338
|
+
if fk_field_name in payload and isinstance(payload[fk_field_name], str):
|
339
|
+
with contextlib.suppress(ValueError):
|
340
|
+
# convert string to int for foreign key fields for postgresql alchemy
|
341
|
+
payload[fk_field_name] = int(payload[fk_field_name])
|
342
|
+
|
323
343
|
sessionmaker = self.get_sessionmaker()
|
324
344
|
async with sessionmaker() as session:
|
325
345
|
if id:
|
@@ -50,5 +50,8 @@ class Settings:
|
|
50
50
|
# or attackers could use it to generate their own signed values.
|
51
51
|
ADMIN_SECRET_KEY: str = os.getenv("ADMIN_SECRET_KEY")
|
52
52
|
|
53
|
+
# This value disables the crop image feature in FastAdmin.
|
54
|
+
ADMIN_DISABLE_CROP_IMAGE: bool = os.getenv("ADMIN_DISABLE_CROP_IMAGE", False)
|
55
|
+
|
53
56
|
|
54
57
|
settings = Settings()
|