From c21bfa337e48e76f244a83955f0b6359e1f8b33f Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Fri, 12 Dec 2025 09:33:43 -0500 Subject: [PATCH] INTPYTHON-852 Prevent Index system checks from running twice --- django_mongodb_backend/__init__.py | 2 -- django_mongodb_backend/checks.py | 32 ------------------------- docs/releases/6.0.x.rst | 2 +- tests/indexes_/test_checks.py | 38 ++++++++++-------------------- 4 files changed, 14 insertions(+), 60 deletions(-) delete mode 100644 django_mongodb_backend/checks.py diff --git a/django_mongodb_backend/__init__.py b/django_mongodb_backend/__init__.py index e4850c90a..ed0deadef 100644 --- a/django_mongodb_backend/__init__.py +++ b/django_mongodb_backend/__init__.py @@ -7,7 +7,6 @@ check_django_compatability() from .aggregates import register_aggregates # noqa: E402 -from .checks import register_checks # noqa: E402 from .expressions.builtins import register_expressions # noqa: E402 from .fields import register_fields # noqa: E402 from .functions import register_functions # noqa: E402 @@ -16,7 +15,6 @@ from .query import register_nodes # noqa: E402 register_aggregates() -register_checks() register_expressions() register_fields() register_functions() diff --git a/django_mongodb_backend/checks.py b/django_mongodb_backend/checks.py deleted file mode 100644 index 866afc4ba..000000000 --- a/django_mongodb_backend/checks.py +++ /dev/null @@ -1,32 +0,0 @@ -from itertools import chain - -from django.apps import apps -from django.core.checks import Tags, register -from django.db import connections, router - - -def check_indexes(app_configs, databases=None, **kwargs): # noqa: ARG001 - """ - Call Index.check() on all model indexes. - - This function will be obsolete when Django calls Index.check() after - https://code.djangoproject.com/ticket/36273. - """ - errors = [] - if app_configs is None: - models = apps.get_models() - else: - models = chain.from_iterable(app_config.get_models() for app_config in app_configs) - for model in models: - for db in databases or (): - if not router.allow_migrate_model(db, model): - continue - connection = connections[db] - for model_index in model._meta.indexes: - if hasattr(model_index, "check"): - errors.extend(model_index.check(model, connection)) - return errors - - -def register_checks(): - register(check_indexes, Tags.models) diff --git a/docs/releases/6.0.x.rst b/docs/releases/6.0.x.rst index d78c00052..6612b3bcf 100644 --- a/docs/releases/6.0.x.rst +++ b/docs/releases/6.0.x.rst @@ -15,7 +15,7 @@ New features Bug fixes --------- -- ... +- Prevented ``Index`` system checks from running twice. 6.0.0 ===== diff --git a/tests/indexes_/test_checks.py b/tests/indexes_/test_checks.py index 10b22d11f..18927258e 100644 --- a/tests/indexes_/test_checks.py +++ b/tests/indexes_/test_checks.py @@ -3,16 +3,14 @@ from django.core import checks from django.db import connection, models from django.test import TestCase -from django.test.utils import isolate_apps, override_system_checks +from django.test.utils import isolate_apps -from django_mongodb_backend.checks import check_indexes from django_mongodb_backend.fields import ArrayField, ObjectIdField from django_mongodb_backend.indexes import SearchIndex, VectorSearchIndex from django_mongodb_backend.models import EmbeddedModel -@isolate_apps("indexes_", attr_name="apps") -@override_system_checks([check_indexes]) +@isolate_apps("indexes_") @mock.patch.object(connection.features, "supports_atlas_search", False) class UnsupportedSearchIndexesTests(TestCase): def test_search_requires_atlas_search_support(self): @@ -22,9 +20,8 @@ class Article(models.Model): class Meta: indexes = [SearchIndex(fields=["title"])] - errors = checks.run_checks(app_configs=self.apps.get_app_configs(), databases={"default"}) self.assertEqual( - errors, + Article.check(databases={"default"}), [ checks.Warning( "This MongoDB server does not support SearchIndex.", @@ -46,9 +43,8 @@ class Article(models.Model): class Meta: indexes = [VectorSearchIndex(fields=["title", "vector"], similarities="cosine")] - errors = checks.run_checks(app_configs=self.apps.get_app_configs(), databases={"default"}) self.assertEqual( - errors, + Article.check(databases={"default"}), [ checks.Warning( "This MongoDB server does not support VectorSearchIndex.", @@ -63,8 +59,7 @@ class Meta: ) -@isolate_apps("indexes_", attr_name="apps") -@override_system_checks([check_indexes]) +@isolate_apps("indexes_") @mock.patch.object(connection.features, "supports_atlas_search", True) class InvalidVectorSearchIndexesTests(TestCase): def test_requires_size(self): @@ -74,9 +69,8 @@ class Article(models.Model): class Meta: indexes = [VectorSearchIndex(fields=["title_embedded"], similarities="cosine")] - errors = checks.run_checks(app_configs=self.apps.get_app_configs(), databases={"default"}) self.assertEqual( - errors, + Article.check(databases={"default"}), [ checks.Error( "VectorSearchIndex requires 'size' on field 'title_embedded'.", @@ -88,14 +82,13 @@ class Meta: def test_requires_float_inner_field(self): class Article(models.Model): - title_embedded = ArrayField(models.CharField(), size=30) + title_embedded = ArrayField(models.CharField(max_length=1), size=30) class Meta: indexes = [VectorSearchIndex(fields=["title_embedded"], similarities="cosine")] - errors = checks.run_checks(app_configs=self.apps.get_app_configs(), databases={"default"}) self.assertEqual( - errors, + Article.check(databases={"default"}), [ checks.Error( "VectorSearchIndex requires the base field of ArrayField " @@ -114,9 +107,8 @@ class Article(models.Model): class Meta: indexes = [VectorSearchIndex(fields=["data", "vector"], similarities="cosine")] - errors = checks.run_checks(app_configs=self.apps.get_app_configs(), databases={"default"}) self.assertEqual( - errors, + Article.check(databases={"default"}), [ checks.Error( "VectorSearchIndex does not support field 'data' (JSONField).", @@ -139,9 +131,8 @@ class Meta: ) ] - errors = checks.run_checks(app_configs=self.apps.get_app_configs(), databases={"default"}) self.assertEqual( - errors, + Article.check(databases={"default"}), [ checks.Error( "VectorSearchIndex requires the same number of similarities " @@ -160,8 +151,7 @@ class Article(models.Model): class Meta: indexes = [VectorSearchIndex(fields=["vector"], similarities="cosine")] - errors = checks.run_checks(app_configs=self.apps.get_app_configs(), databases={"default"}) - self.assertEqual(errors, []) + self.assertEqual(Article.check(databases={"default"}), []) def test_valid_fields(self): class Data(EmbeddedModel): @@ -193,8 +183,7 @@ class Meta: ) ] - errors = checks.run_checks(app_configs=self.apps.get_app_configs(), databases={"default"}) - self.assertEqual(errors, []) + self.assertEqual(SearchIndexTestModel.check(databases={"default"}), []) def test_requires_vector_field(self): class NoSearchVectorModel(models.Model): @@ -207,9 +196,8 @@ class Meta: ) ] - errors = checks.run_checks(app_configs=self.apps.get_app_configs(), databases={"default"}) self.assertEqual( - errors, + NoSearchVectorModel.check(databases={"default"}), [ checks.Error( "VectorSearchIndex requires at least one ArrayField to store vector data.",