From d9bce5cb0ed7754fb728bda597ae3a4ff98123c0 Mon Sep 17 00:00:00 2001 From: Jocelin Hounon Date: Sat, 29 Nov 2025 18:33:52 -0800 Subject: [PATCH 1/2] fix ci --- pyproject.toml | 2 ++ starlette_admin/contrib/sqla/view.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ee9fb8a5..8ef0efd8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -123,6 +123,7 @@ matrix.sqla_version.dependencies = [ { value = "SQLAlchemy[asyncio] >=2.0, <2.1", if = ["sqla2"] }, { value = "odmantic >=1.0.0,<1.1.0", if = ["sqla2"] }, { value = "SQLAlchemy[asyncio] >=1.4, <1.5", if = ["sqla14"] }, + { value = "sqlmodel >=0.0.11, <0.0.26", if = ["sqla14"] }, ] matrix.sqla_version.scripts = [ { key = "all", value = 'coverage run -m pytest tests --ignore=tests/odmantic --ignore=tests/beanie', if = ["sqla14"] }, @@ -244,6 +245,7 @@ ignore_missing_imports = true [[tool.mypy.overrides]] module = [ "starlette_admin.contrib.sqla.helpers", + "starlette_admin.contrib.sqla.converters", "starlette_admin.contrib.sqla.view", "starlette_admin.contrib.odmantic.helpers", "starlette_admin.contrib.odmantic.view", diff --git a/starlette_admin/contrib/sqla/view.py b/starlette_admin/contrib/sqla/view.py index 16ce40de..bf8cf929 100644 --- a/starlette_admin/contrib/sqla/view.py +++ b/starlette_admin/contrib/sqla/view.py @@ -602,7 +602,7 @@ def build_order_clauses( stmt = stmt.outerjoin(model_attr) sorting_attr = self.sortable_field_mapping.get(attr_key, model_attr) stmt = stmt.order_by( - not_none(sorting_attr).desc() + not_none(sorting_attr).desc() # type: ignore [attr-defined] if order.lower() == "desc" else sorting_attr ) From c2a1c373a10c5a111afee4c28ec85b46c896db06 Mon Sep 17 00:00:00 2001 From: Jocelin Hounon Date: Sat, 29 Nov 2025 18:43:51 -0800 Subject: [PATCH 2/2] upgrade dependencies --- pyproject.toml | 9 +++++---- starlette_admin/contrib/mongoengine/view.py | 4 ++-- starlette_admin/contrib/sqla/view.py | 2 +- tests/mongoengine/test_view_meta.py | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8ef0efd8..3e170b4e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,9 +47,9 @@ i18n = [ test = [ "pytest >=8.3.0, <8.4.0", "pytest-asyncio >=0.24.0, <0.25.0", - "mypy ==1.15.0", - "ruff ==0.11.9", - "black ==25.1.0", + "mypy ==1.19.0", + "ruff ==0.14.7", + "black ==25.11.0", "httpx >=0.23.3, <0.29.0", "SQLAlchemy-Utils >=0.40.0, <0.42.0", "sqlmodel >=0.0.11, <0.1.0", @@ -218,7 +218,8 @@ lint.ignore = [ "B008", # Do not perform function call `_` in argument defaults, neccessary for lazy_gettext "B905", # `zip()` without an explicit `strict=` parameter "E501", # line too long, handled by black - "N818", # Exception {name} should be named with an Error suffix + "N818", # Exception {name} should be named with an Error suffix, + "PLC0415", # `import` should be at the top-level of a file ] target-version = "py38" diff --git a/starlette_admin/contrib/mongoengine/view.py b/starlette_admin/contrib/mongoengine/view.py index f7ee5c43..06660667 100644 --- a/starlette_admin/contrib/mongoengine/view.py +++ b/starlette_admin/contrib/mongoengine/view.py @@ -22,7 +22,7 @@ resolve_deep_query, ) from starlette_admin.exceptions import FormValidationError -from starlette_admin.helpers import prettify_class_name, slugify_class_name +from starlette_admin.helpers import not_none, prettify_class_name, slugify_class_name from starlette_admin.views import BaseModelView @@ -135,7 +135,7 @@ async def _populate_obj( # noqa: C901 me_field = getattr(document, name) if isinstance(field, (FileField, ImageField)): proxy: GridFSProxy = getattr(obj, name) - value, should_be_deleted = value + value, should_be_deleted = not_none(value) if should_be_deleted: proxy.delete() elif isinstance(value, UploadFile): diff --git a/starlette_admin/contrib/sqla/view.py b/starlette_admin/contrib/sqla/view.py index bf8cf929..6e58eeac 100644 --- a/starlette_admin/contrib/sqla/view.py +++ b/starlette_admin/contrib/sqla/view.py @@ -557,7 +557,7 @@ async def _populate_obj( for field in self.get_fields_list(request, request.state.action): name, value = field.name, data.get(field.name, None) if isinstance(field, FileField): - value, should_be_deleted = value + value, should_be_deleted = not_none(value) if should_be_deleted: setattr(obj, name, None) elif (not field.multiple and value is not None) or ( diff --git a/tests/mongoengine/test_view_meta.py b/tests/mongoengine/test_view_meta.py index ba3688a9..94b2e59a 100644 --- a/tests/mongoengine/test_view_meta.py +++ b/tests/mongoengine/test_view_meta.py @@ -177,7 +177,7 @@ class CustomDocumentView(ModelView): def test_invalid_exclude_list(): with pytest.raises( - ValueError, match="Expected str or monogoengine.BaseField, got int" + ValueError, match=r"Expected str or monogoengine.BaseField, got int" ): class CustomDocumentView(ModelView):