From 30f1e163e0d4cefbe5e1ec1d03a438ff1cdb3f4a Mon Sep 17 00:00:00 2001 From: Nilton Pimentel Date: Sat, 23 May 2026 17:58:53 -0300 Subject: [PATCH 1/3] fix: return first PolymorphicParentModelAdmin --- src/polymorphic/admin/childadmin.py | 35 +++++++++++++---------------- src/polymorphic/tests/test_admin.py | 22 ++++++++++++++++++ 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/polymorphic/admin/childadmin.py b/src/polymorphic/admin/childadmin.py index 042c534b..7b56a0be 100644 --- a/src/polymorphic/admin/childadmin.py +++ b/src/polymorphic/admin/childadmin.py @@ -160,26 +160,21 @@ def _get_parent_admin(self): # when parent_model is in among child_models, just return super instance return super() - try: - return self.admin_site._registry[parent_model] - except KeyError: - # Admin is not registered for polymorphic_ctype model, but perhaps it's registered - # for a intermediate proxy model, between the parent_model and this model. - for klass in inspect.getmro(self.model): - if not issubclass(klass, parent_model): - continue # e.g. found a mixin. - - # Fetch admin instance for model class, see if it's a possible candidate. - model_admin = self.admin_site._registry.get(klass) - if model_admin is not None and isinstance( - model_admin, PolymorphicParentModelAdmin - ): - return model_admin # Success! - - # If we get this far without returning there is no admin available - raise ParentAdminNotRegistered( - f"No parent admin was registered for a '{parent_model}' model." - ) + # Admin may be registered for the polymorphic root model, or an intermediate + # proxy/model between the parent_model and this model. + for klass in inspect.getmro(self.model): + if not issubclass(klass, parent_model): + continue # e.g. found a mixin. + + # Fetch admin instance for model class, see if it's a possible candidate. + model_admin = self.admin_site._registry.get(klass) + if model_admin is not None and isinstance(model_admin, PolymorphicParentModelAdmin): + return model_admin # Success! + + # If we get this far without returning there is no admin available + raise ParentAdminNotRegistered( + f"No parent admin was registered for a '{parent_model}' model." + ) def response_post_save_add(self, request, obj): return self._get_parent_admin().response_post_save_add(request, obj) diff --git a/src/polymorphic/tests/test_admin.py b/src/polymorphic/tests/test_admin.py index c5011085..a7c6da9e 100644 --- a/src/polymorphic/tests/test_admin.py +++ b/src/polymorphic/tests/test_admin.py @@ -1629,6 +1629,28 @@ class Model2CAdmin(PolymorphicChildModelAdmin): parent = c_admin._get_parent_admin() assert isinstance(parent, PolymorphicParentModelAdmin) + def test_child_admin_get_parent_admin_skips_regular_root_admin(self): + """_get_parent_admin() ignores a registered root ModelAdmin when finding the polymorphic parent.""" + + @self.register(Model2A) + class Model2ARootAdmin(admin.ModelAdmin): + pass + + @self.register(Model2B) + class Model2BParentAdmin(PolymorphicParentModelAdmin): + base_model = Model2B + child_models = (Model2C,) + + @self.register(Model2C) + class Model2CAdmin(PolymorphicChildModelAdmin): + base_model = Model2B + + c_admin = self.get_admin_instance(Model2C) + parent = c_admin._get_parent_admin() + + assert parent is self.get_admin_instance(Model2B) + assert parent is not self.get_admin_instance(Model2A) + def test_child_admin_get_parent_admin_not_registered(self): """_get_parent_admin() raises ParentAdminNotRegistered when MRO has no parent admin.""" from polymorphic.admin.childadmin import ParentAdminNotRegistered From bbb8b5955d6f9af014080d49db4751b3d967eb28 Mon Sep 17 00:00:00 2001 From: Nilton Pimentel <63605485+niltonpimentel02@users.noreply.github.com> Date: Sat, 23 May 2026 19:42:22 -0300 Subject: [PATCH 2/3] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/polymorphic/admin/childadmin.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/polymorphic/admin/childadmin.py b/src/polymorphic/admin/childadmin.py index 7b56a0be..731acc10 100644 --- a/src/polymorphic/admin/childadmin.py +++ b/src/polymorphic/admin/childadmin.py @@ -160,8 +160,9 @@ def _get_parent_admin(self): # when parent_model is in among child_models, just return super instance return super() - # Admin may be registered for the polymorphic root model, or an intermediate - # proxy/model between the parent_model and this model. + # Only PolymorphicParentModelAdmin registrations are considered, whether + # they are for the polymorphic root model or an intermediate proxy/model + # between the parent_model and this model. for klass in inspect.getmro(self.model): if not issubclass(klass, parent_model): continue # e.g. found a mixin. From 5ee03f8b2bc68b178028672994b87969bbada131 Mon Sep 17 00:00:00 2001 From: Brian Kohan Date: Sun, 31 May 2026 16:56:03 -0700 Subject: [PATCH 3/3] add one additional test, update changelog, bump version --- docs/changelog/index.rst | 10 ++++++++++ pyproject.toml | 2 +- src/polymorphic/__init__.py | 2 +- src/polymorphic/tests/test_admin.py | 20 ++++++++++++++++++++ uv.lock | 26 +++++++++++++------------- 5 files changed, 45 insertions(+), 15 deletions(-) diff --git a/docs/changelog/index.rst b/docs/changelog/index.rst index e0bb3281..19c84a13 100644 --- a/docs/changelog/index.rst +++ b/docs/changelog/index.rst @@ -1,6 +1,16 @@ Changelog ========= +v4.11.5 (2026-05-31) +-------------------- + +* Fixed `PolymorphicChildModelAdmin redirects to the root model list view instead of the first + PolymorphicParentModelAdmin `_ + + - Small admin behavior change: When both the root model and an intermediate subclass have a + ``PolymorphicParentModelAdmin`` registered, post-save now redirects to the most-derived + (nearest) parent admin rather than the root's. + v4.11.4 (2026-05-28) -------------------- diff --git a/pyproject.toml b/pyproject.toml index 1844e840..592854d2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "django-polymorphic" -version = "4.11.4" +version = "4.11.5" description = "Seamless polymorphic inheritance for Django models." readme = "README.md" license = "BSD-3-Clause" diff --git a/src/polymorphic/__init__.py b/src/polymorphic/__init__.py index 8c25b76b..cba2d542 100644 --- a/src/polymorphic/__init__.py +++ b/src/polymorphic/__init__.py @@ -21,7 +21,7 @@ from typing import Final -VERSION: Final[str] = "4.11.4" +VERSION: Final[str] = "4.11.5" __title__: Final = "Django Polymorphic" __version__ = VERSION # version synonym for backwards compatibility diff --git a/src/polymorphic/tests/test_admin.py b/src/polymorphic/tests/test_admin.py index a7c6da9e..bc5429c6 100644 --- a/src/polymorphic/tests/test_admin.py +++ b/src/polymorphic/tests/test_admin.py @@ -1651,6 +1651,26 @@ class Model2CAdmin(PolymorphicChildModelAdmin): assert parent is self.get_admin_instance(Model2B) assert parent is not self.get_admin_instance(Model2A) + def test_child_admin_get_parent_admin_root_parent_admin(self): + """_get_parent_admin() still returns a PolymorphicParentModelAdmin registered on the root model.""" + + @self.register(Model2A) + class Model2ARootParentAdmin(PolymorphicParentModelAdmin): + base_model = Model2A + child_models = (Model2B, Model2C) + + @self.register(Model2C) + class Model2CAdmin(PolymorphicChildModelAdmin): + base_model = Model2A + + # parent_model for Model2C is the root Model2A; the MRO scan must reach it + # and return its PolymorphicParentModelAdmin (backwards-compatible happy path). + c_admin = self.get_admin_instance(Model2C) + parent = c_admin._get_parent_admin() + + assert parent is self.get_admin_instance(Model2A) + assert isinstance(parent, PolymorphicParentModelAdmin) + def test_child_admin_get_parent_admin_not_registered(self): """_get_parent_admin() raises ParentAdminNotRegistered when MRO has no parent admin.""" from polymorphic.admin.childadmin import ParentAdminNotRegistered diff --git a/uv.lock b/uv.lock index 8940f720..75479c0c 100644 --- a/uv.lock +++ b/uv.lock @@ -785,7 +785,7 @@ wheels = [ [[package]] name = "django-polymorphic" -version = "4.11.4" +version = "4.11.5" source = { editable = "." } dependencies = [ { name = "django", version = "4.2.30", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-18-django-polymorphic-dj42' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra != 'group-18-django-polymorphic-oracledb' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3') or (extra != 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, @@ -816,7 +816,7 @@ dev = [ { name = "furo" }, { name = "ipdb" }, { name = "ipython", version = "8.39.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, - { name = "ipython", version = "9.13.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, + { name = "ipython", version = "9.14.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, { name = "mypy" }, { name = "packaging" }, { name = "pre-commit" }, @@ -1309,7 +1309,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "decorator" }, { name = "ipython", version = "8.39.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, - { name = "ipython", version = "9.13.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, + { name = "ipython", version = "9.14.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, { name = "tomli", marker = "python_full_version < '3.11' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3d/1b/7e07e7b752017f7693a0f4d41c13e5ca29ce8cbcfdcc1fd6c4ad8c0a27a0/ipdb-0.13.13.tar.gz", hash = "sha256:e3ac6018ef05126d442af680aad863006ec19d02290561ac88b8b1c0b0cfc726", size = 17042, upload-time = "2023-03-09T15:40:57.487Z" } @@ -1344,7 +1344,7 @@ wheels = [ [[package]] name = "ipython" -version = "9.13.0" +version = "9.14.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.15'", @@ -1359,15 +1359,15 @@ dependencies = [ { name = "matplotlib-inline", marker = "python_full_version >= '3.11' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, { name = "pexpect", marker = "(python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32') or (python_full_version < '3.11' and extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (python_full_version < '3.11' and extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (python_full_version < '3.11' and extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (python_full_version < '3.11' and extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (python_full_version < '3.11' and extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (python_full_version < '3.11' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (sys_platform == 'win32' and extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (sys_platform == 'win32' and extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (sys_platform == 'win32' and extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (sys_platform == 'win32' and extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (sys_platform == 'emscripten' and extra != 'group-18-django-polymorphic-oracledb' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3') or (sys_platform == 'win32' and extra != 'group-18-django-polymorphic-oracledb' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj60' and extra != 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-oracledb') or (sys_platform == 'emscripten' and extra != 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj60' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3') or (sys_platform == 'win32' and extra == 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj60' and extra != 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-oracledb') or (sys_platform == 'win32' and extra != 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj60' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj60' and extra == 'group-18-django-polymorphic-mysqlclient14' and extra != 'group-18-django-polymorphic-mysqlclient2x' and extra == 'group-18-django-polymorphic-oracledb') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj42' and extra != 'group-18-django-polymorphic-dj52' and extra != 'group-18-django-polymorphic-mysqlclient2x' and extra == 'group-18-django-polymorphic-oracledb') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj42' and extra != 'group-18-django-polymorphic-dj52' and extra != 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-oracledb') or (sys_platform == 'win32' and extra == 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj60' and extra == 'group-18-django-polymorphic-mysqlclient14' and extra != 'group-18-django-polymorphic-mysqlclient2x' and extra == 'group-18-django-polymorphic-oracledb') or (sys_platform == 'win32' and extra == 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj42' and extra != 'group-18-django-polymorphic-dj52' and extra != 'group-18-django-polymorphic-mysqlclient2x' and extra == 'group-18-django-polymorphic-oracledb') or (sys_platform == 'win32' and extra == 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj42' and extra != 'group-18-django-polymorphic-dj52' and extra != 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-oracledb') or (sys_platform == 'emscripten' and extra != 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj42' and extra != 'group-18-django-polymorphic-dj52' and extra != 'group-18-django-polymorphic-mysqlclient2x' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3') or (sys_platform == 'emscripten' and extra != 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj42' and extra != 'group-18-django-polymorphic-dj52' and extra != 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3') or (sys_platform == 'win32' and extra != 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj42' and extra != 'group-18-django-polymorphic-dj52' and extra != 'group-18-django-polymorphic-mysqlclient2x' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3') or (sys_platform == 'win32' and extra != 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj42' and extra != 'group-18-django-polymorphic-dj52' and extra != 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, { name = "prompt-toolkit", marker = "python_full_version >= '3.11' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, - { name = "psutil", marker = "python_full_version >= '3.11' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, + { name = "psutil", marker = "(python_full_version >= '3.11' and sys_platform != 'emscripten') or (python_full_version < '3.11' and extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (python_full_version < '3.11' and extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (python_full_version < '3.11' and extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (python_full_version < '3.11' and extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (python_full_version < '3.11' and extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (python_full_version < '3.11' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (sys_platform == 'emscripten' and extra != 'group-18-django-polymorphic-oracledb' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj60' and extra != 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-oracledb') or (sys_platform == 'emscripten' and extra != 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj60' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj60' and extra == 'group-18-django-polymorphic-mysqlclient14' and extra != 'group-18-django-polymorphic-mysqlclient2x' and extra == 'group-18-django-polymorphic-oracledb') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj42' and extra != 'group-18-django-polymorphic-dj52' and extra != 'group-18-django-polymorphic-mysqlclient2x' and extra == 'group-18-django-polymorphic-oracledb') or (sys_platform == 'emscripten' and extra == 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj42' and extra != 'group-18-django-polymorphic-dj52' and extra != 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-oracledb') or (sys_platform == 'emscripten' and extra != 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj42' and extra != 'group-18-django-polymorphic-dj52' and extra != 'group-18-django-polymorphic-mysqlclient2x' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3') or (sys_platform == 'emscripten' and extra != 'group-18-django-polymorphic-cx-oracle' and extra != 'group-18-django-polymorphic-dj42' and extra != 'group-18-django-polymorphic-dj52' and extra != 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, { name = "pygments", marker = "python_full_version >= '3.11' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, { name = "stack-data", marker = "python_full_version >= '3.11' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, { name = "traitlets", marker = "python_full_version >= '3.11' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, { name = "typing-extensions", marker = "python_full_version == '3.11.*' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/87cda5842cf5c31837c06ddb588e11c3c35d8ece89b7a0108c06b8c9b00a/ipython-9.13.0.tar.gz", hash = "sha256:7e834b6afc99f020e3f05966ced34792f40267d64cb1ea9043886dab0dde5967", size = 4430549, upload-time = "2026-04-24T12:24:55.221Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/c2/c0064cf15d026501a1ef70e42efd9c3f818663089399aacc5e37a82901c1/ipython-9.14.0.tar.gz", hash = "sha256:6f27ff0f1d9ea050e0551f71568bc4b34d8aba579e8f111c5b4175f44ac6b4aa", size = 4432601, upload-time = "2026-05-29T15:13:24.611Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl", hash = "sha256:57f9d4639e20818d328d287c7b549af3d05f12486ea8f2e7f73e52a36ec4d201", size = 627274, upload-time = "2026-04-24T12:24:53.038Z" }, + { url = "https://files.pythonhosted.org/packages/14/a3/9e59340f02c1dc8f8c0a05b09244712b8609eb5439f9996e887e2b82f452/ipython-9.14.0-py3-none-any.whl", hash = "sha256:8fd984a3372c14b12790b084ba6b5cff5678c0cb063244a0034f06a51f20d6c2", size = 627457, upload-time = "2026-05-29T15:13:22.942Z" }, ] [[package]] @@ -2620,15 +2620,15 @@ wheels = [ [[package]] name = "starlette" -version = "1.2.0" +version = "1.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/bf/616a066c2760f6c2b1ae3437cc28149734d069fbb46511712beae118a68c/starlette-1.2.0.tar.gz", hash = "sha256:3c5a6b23fff42492914e93890bb80cbfea72dbf37de268eec06185d62a4ca553", size = 2668923, upload-time = "2026-05-28T11:42:50.568Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/44/ec35f1b6e83094b997da438a02c8c9b0ade2b1e84cfc48bd4656780760a6/starlette-1.2.1.tar.gz", hash = "sha256:9b9b5ebb992e67d6093741e63c2f59e4f6fff986f81163c087867bd7b924b3f6", size = 2701854, upload-time = "2026-05-31T01:07:51.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/85/492183764d5d01d4514be3730fdb8e228a80605783099551c51627578b5d/starlette-1.2.0-py3-none-any.whl", hash = "sha256:36e0c76ac59157e75dc4b3bdeafba97fb04eaf1878045f15dbef666a6f092ed7", size = 73213, upload-time = "2026-05-28T11:42:48.801Z" }, + { url = "https://files.pythonhosted.org/packages/1c/54/196d0c1db10af76baa4f64894448505d60d3cdf70ef92cbb35f46a4e4c71/starlette-1.2.1-py3-none-any.whl", hash = "sha256:4de0082d08c8f6764a85a54cf1120d6939507a19905c7768acad2a9f875d2b89", size = 73350, upload-time = "2026-05-31T01:07:50.09Z" }, ] [[package]] @@ -2773,7 +2773,7 @@ wheels = [ [[package]] name = "virtualenv" -version = "21.4.1" +version = "21.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, @@ -2782,9 +2782,9 @@ dependencies = [ { name = "python-discovery" }, { name = "typing-extensions", marker = "python_full_version < '3.11' or (extra == 'group-18-django-polymorphic-cx-oracle' and extra == 'group-18-django-polymorphic-oracledb') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj52') or (extra == 'group-18-django-polymorphic-dj42' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-dj52' and extra == 'group-18-django-polymorphic-dj60') or (extra == 'group-18-django-polymorphic-mysqlclient14' and extra == 'group-18-django-polymorphic-mysqlclient2x') or (extra == 'group-18-django-polymorphic-psycopg2' and extra == 'group-18-django-polymorphic-psycopg3')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/f0/b47ecf438211a25a97f8f0e4b23c22bc2496ebfea18dd6ec16210f09cc36/virtualenv-21.4.1.tar.gz", hash = "sha256:2ca543c713b72840ceffd94e9bdedfbd09a661defa1f7f69e5429ad4059442e2", size = 7613344, upload-time = "2026-05-28T04:12:49.905Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/0d/4e93c8e6d1001a75763f87d8f5ecda8ebc7f4aa2153dddfaf4ae8892821a/virtualenv-21.4.2.tar.gz", hash = "sha256:38e6ee0a555615c0ea9da2ac7e9998fe8dc3b911dd33ad8eaad2020957653b0c", size = 7613326, upload-time = "2026-05-31T17:01:22.827Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/dc/ac4f3a987a87e1a18556896f257c4e15c95ed157b7975347ec6b313b75ce/virtualenv-21.4.1-py3-none-any.whl", hash = "sha256:caf4ff72d1b4039057f41d8e8466e859513d67c0400d9c6b62c02c9d1ebc3e12", size = 7594078, upload-time = "2026-05-28T04:12:47.686Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c4/557dc082be035381b85fdb2b74e21d3d21b57750b74f2b47a32f3a639ff9/virtualenv-21.4.2-py3-none-any.whl", hash = "sha256:854210ca524a1a4d0d744734f4acbc721c3ffe163b85bbf5d56d14d5ae2f0fae", size = 7594079, upload-time = "2026-05-31T17:01:20.735Z" }, ] [[package]]