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.
Files changed (46) hide show
  1. {fastadmin-0.2.15 → fastadmin-0.2.17}/PKG-INFO +1 -1
  2. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/service.py +2 -0
  3. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/orms/sqlalchemy.py +28 -8
  4. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/schemas.py +1 -0
  5. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/settings.py +3 -0
  6. fastadmin-0.2.17/fastadmin/static/assets/worker-C151k0-L.js +13 -0
  7. fastadmin-0.2.17/fastadmin/static/assets/worker-MF2p-l5_.js +13 -0
  8. fastadmin-0.2.17/fastadmin/static/index.min.js +865 -0
  9. {fastadmin-0.2.15 → fastadmin-0.2.17}/pyproject.toml +1 -1
  10. fastadmin-0.2.15/fastadmin/static/index.min.js +0 -864
  11. {fastadmin-0.2.15 → fastadmin-0.2.17}/LICENSE +0 -0
  12. {fastadmin-0.2.15 → fastadmin-0.2.17}/README.md +0 -0
  13. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/__init__.py +0 -0
  14. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/__init__.py +0 -0
  15. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/exceptions.py +0 -0
  16. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/__init__.py +0 -0
  17. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/django/__init__.py +0 -0
  18. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/django/app/__init__.py +0 -0
  19. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/django/app/api.py +0 -0
  20. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/django/app/urls.py +0 -0
  21. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/django/app/views.py +0 -0
  22. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/fastapi/__init__.py +0 -0
  23. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/fastapi/api.py +0 -0
  24. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/fastapi/app.py +0 -0
  25. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/fastapi/views.py +0 -0
  26. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/flask/__init__.py +0 -0
  27. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/flask/api.py +0 -0
  28. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/flask/app.py +0 -0
  29. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/frameworks/flask/views.py +0 -0
  30. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/helpers.py +0 -0
  31. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/api/schemas.py +0 -0
  32. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/__init__.py +0 -0
  33. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/base.py +0 -0
  34. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/decorators.py +0 -0
  35. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/helpers.py +0 -0
  36. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/orms/__init__.py +0 -0
  37. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/orms/django.py +0 -0
  38. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/orms/ponyorm.py +0 -0
  39. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/models/orms/tortoise.py +0 -0
  40. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/static/assets/worker-D3TWcJOI.js +0 -0
  41. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/static/images/favicon.png +0 -0
  42. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/static/images/header-logo.svg +0 -0
  43. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/static/images/sign-in-logo.svg +0 -0
  44. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/static/index.html +0 -0
  45. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/static/index.min.css +0 -0
  46. {fastadmin-0.2.15 → fastadmin-0.2.17}/fastadmin/templates/index.html +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastadmin
3
- Version: 0.2.15
3
+ Version: 0.2.17
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
@@ -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(getattr(self.model_cls, field) >= value)
273
+ q.append(model_field >= value)
267
274
  case "gte":
268
- q.append(getattr(self.model_cls, field) <= value)
275
+ q.append(model_field <= value)
269
276
  case "lt":
270
- q.append(getattr(self.model_cls, field) > value)
277
+ q.append(model_field > value)
271
278
  case "gt":
272
- q.append(getattr(self.model_cls, field) < value)
279
+ q.append(model_field < value)
273
280
  case "exact":
274
- q.append(getattr(self.model_cls, field) == value)
281
+ q.append(model_field == value)
275
282
  case "contains":
276
- q.append(getattr(self.model_cls, field).like(f"%{value}%"))
283
+ q.append(model_field.like(f"%{value}%"))
277
284
  case "icontains":
278
- q.append(getattr(self.model_cls, field).ilike(f"%{value}%"))
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:
@@ -172,6 +172,7 @@ class ConfigurationSchema:
172
172
  username_field: str
173
173
  date_format: str
174
174
  datetime_format: str
175
+ disable_crop_image: bool
175
176
  models: Sequence[ModelSchema]
176
177
  dashboard_widgets: Sequence[DashboardWidgetSchema]
177
178
 
@@ -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()