fastadmin 0.2.16__py3-none-any.whl → 0.2.18__py3-none-any.whl
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/models/orms/sqlalchemy.py +32 -8
- fastadmin/static/assets/worker-MF2p-l5_.js +13 -0
- fastadmin/static/index.min.js +215 -215
- {fastadmin-0.2.16.dist-info → fastadmin-0.2.18.dist-info}/METADATA +1 -1
- {fastadmin-0.2.16.dist-info → fastadmin-0.2.18.dist-info}/RECORD +7 -6
- {fastadmin-0.2.16.dist-info → fastadmin-0.2.18.dist-info}/LICENSE +0 -0
- {fastadmin-0.2.16.dist-info → fastadmin-0.2.18.dist-info}/WHEEL +0 -0
@@ -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, TypeError):
|
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, TypeError):
|
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:
|
@@ -394,6 +414,10 @@ class SqlAlchemyMixin:
|
|
394
414
|
)
|
395
415
|
await session.execute(qs)
|
396
416
|
for rel_id in ids:
|
417
|
+
with contextlib.suppress(ValueError, TypeError):
|
418
|
+
rel_id = int(rel_id)
|
419
|
+
with contextlib.suppress(ValueError, TypeError):
|
420
|
+
obj_id = int(obj_id)
|
397
421
|
values.append(
|
398
422
|
{
|
399
423
|
rel_field_name: rel_id,
|