mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	Refs #33872 -- Removed django.contrib.postgres.fields.CIText/CICharField/CIEmailField/CITextField.
Per deprecation timeline.
This commit is contained in:
		| @@ -368,13 +368,6 @@ class Tests(TestCase): | ||||
|         for lookup in lookups: | ||||
|             with self.subTest(lookup=lookup): | ||||
|                 self.assertIn("::text", do.lookup_cast(lookup)) | ||||
|         # RemovedInDjango51Warning. | ||||
|         for lookup in lookups: | ||||
|             for field_type in ("CICharField", "CIEmailField", "CITextField"): | ||||
|                 with self.subTest(lookup=lookup, field_type=field_type): | ||||
|                     self.assertIn( | ||||
|                         "::citext", do.lookup_cast(lookup, internal_type=field_type) | ||||
|                     ) | ||||
|  | ||||
|     def test_correct_extraction_psycopg_version(self): | ||||
|         from django.db.backends.postgresql.base import Database, psycopg_version | ||||
|   | ||||
| @@ -104,46 +104,42 @@ class DeprecatedFieldsTests(SimpleTestCase): | ||||
|         self.assertEqual( | ||||
|             PostgresCIFieldsModel.check(), | ||||
|             [ | ||||
|                 checks.Warning( | ||||
|                     "django.contrib.postgres.fields.CICharField is deprecated. Support " | ||||
|                     "for it (except in historical migrations) will be removed in " | ||||
|                     "Django 5.1.", | ||||
|                 checks.Error( | ||||
|                     "django.contrib.postgres.fields.CICharField is removed except for " | ||||
|                     "support in historical migrations.", | ||||
|                     hint=( | ||||
|                         'Use CharField(db_collation="…") with a case-insensitive ' | ||||
|                         "non-deterministic collation instead." | ||||
|                     ), | ||||
|                     obj=PostgresCIFieldsModel._meta.get_field("ci_char"), | ||||
|                     id="fields.W905", | ||||
|                     id="fields.E905", | ||||
|                 ), | ||||
|                 checks.Warning( | ||||
|                     "django.contrib.postgres.fields.CIEmailField is deprecated. " | ||||
|                     "Support for it (except in historical migrations) will be removed " | ||||
|                     "in Django 5.1.", | ||||
|                 checks.Error( | ||||
|                     "django.contrib.postgres.fields.CIEmailField is removed except for " | ||||
|                     "support in historical migrations.", | ||||
|                     hint=( | ||||
|                         'Use EmailField(db_collation="…") with a case-insensitive ' | ||||
|                         "non-deterministic collation instead." | ||||
|                     ), | ||||
|                     obj=PostgresCIFieldsModel._meta.get_field("ci_email"), | ||||
|                     id="fields.W906", | ||||
|                     id="fields.E906", | ||||
|                 ), | ||||
|                 checks.Warning( | ||||
|                     "django.contrib.postgres.fields.CITextField is deprecated. Support " | ||||
|                     "for it (except in historical migrations) will be removed in " | ||||
|                     "Django 5.1.", | ||||
|                 checks.Error( | ||||
|                     "django.contrib.postgres.fields.CITextField is removed except for " | ||||
|                     "support in historical migrations.", | ||||
|                     hint=( | ||||
|                         'Use TextField(db_collation="…") with a case-insensitive ' | ||||
|                         "non-deterministic collation instead." | ||||
|                     ), | ||||
|                     obj=PostgresCIFieldsModel._meta.get_field("ci_text"), | ||||
|                     id="fields.W907", | ||||
|                     id="fields.E907", | ||||
|                 ), | ||||
|                 checks.Warning( | ||||
|                     "Base field for array has warnings:\n" | ||||
|                     "    django.contrib.postgres.fields.CITextField is deprecated. " | ||||
|                     "Support for it (except in historical migrations) will be removed " | ||||
|                     "in Django 5.1. (fields.W907)", | ||||
|                 checks.Error( | ||||
|                     "Base field for array has errors:\n" | ||||
|                     "    django.contrib.postgres.fields.CITextField is removed except " | ||||
|                     "for support in historical migrations. (fields.E907)", | ||||
|                     obj=PostgresCIFieldsModel._meta.get_field("array_ci_text"), | ||||
|                     id="postgres.W004", | ||||
|                     id="postgres.E001", | ||||
|                 ), | ||||
|             ], | ||||
|         ) | ||||
|   | ||||
| @@ -7,9 +7,6 @@ import enum | ||||
| from django.db import models | ||||
|  | ||||
| try: | ||||
|     from django.contrib.postgres.fields import CICharField  # RemovedInDjango51Warning. | ||||
|     from django.contrib.postgres.fields import CIEmailField  # RemovedInDjango51Warning. | ||||
|     from django.contrib.postgres.fields import CITextField  # RemovedInDjango51Warning. | ||||
|     from django.contrib.postgres.fields import ( | ||||
|         ArrayField, | ||||
|         BigIntegerRangeField, | ||||
| @@ -47,9 +44,6 @@ except ImportError: | ||||
|  | ||||
|     ArrayField = DummyArrayField | ||||
|     BigIntegerRangeField = models.Field | ||||
|     CICharField = models.Field  # RemovedInDjango51Warning. | ||||
|     CIEmailField = models.Field  # RemovedInDjango51Warning. | ||||
|     CITextField = models.Field  # RemovedInDjango51Warning. | ||||
|     DateRangeField = models.Field | ||||
|     DateTimeRangeField = DummyContinuousRangeField | ||||
|     DecimalRangeField = DummyContinuousRangeField | ||||
|   | ||||
| @@ -3,9 +3,6 @@ from django.db import migrations, models | ||||
| from ..fields import ( | ||||
|     ArrayField, | ||||
|     BigIntegerRangeField, | ||||
|     CICharField, | ||||
|     CIEmailField, | ||||
|     CITextField, | ||||
|     DateRangeField, | ||||
|     DateTimeRangeField, | ||||
|     DecimalRangeField, | ||||
| @@ -290,23 +287,6 @@ class Migration(migrations.Migration): | ||||
|             options=None, | ||||
|             bases=None, | ||||
|         ), | ||||
|         # RemovedInDjango51Warning. | ||||
|         migrations.CreateModel( | ||||
|             name="CITestModel", | ||||
|             fields=[ | ||||
|                 ( | ||||
|                     "name", | ||||
|                     CICharField(primary_key=True, serialize=False, max_length=255), | ||||
|                 ), | ||||
|                 ("email", CIEmailField()), | ||||
|                 ("description", CITextField()), | ||||
|                 ("array_field", ArrayField(CITextField(), null=True)), | ||||
|             ], | ||||
|             options={ | ||||
|                 "required_db_vendor": "postgresql", | ||||
|             }, | ||||
|             bases=None, | ||||
|         ), | ||||
|         migrations.CreateModel( | ||||
|             name="Line", | ||||
|             fields=[ | ||||
|   | ||||
| @@ -3,9 +3,6 @@ from django.db import models | ||||
| from .fields import ( | ||||
|     ArrayField, | ||||
|     BigIntegerRangeField, | ||||
|     CICharField, | ||||
|     CIEmailField, | ||||
|     CITextField, | ||||
|     DateRangeField, | ||||
|     DateTimeRangeField, | ||||
|     DecimalRangeField, | ||||
| @@ -119,14 +116,6 @@ class Character(models.Model): | ||||
|     name = models.CharField(max_length=255) | ||||
|  | ||||
|  | ||||
| # RemovedInDjango51Warning. | ||||
| class CITestModel(PostgreSQLModel): | ||||
|     name = CICharField(primary_key=True, max_length=255) | ||||
|     email = CIEmailField() | ||||
|     description = CITextField() | ||||
|     array_field = ArrayField(CITextField(), null=True) | ||||
|  | ||||
|  | ||||
| class Line(PostgreSQLModel): | ||||
|     scene = models.ForeignKey("Scene", models.CASCADE) | ||||
|     character = models.ForeignKey("Character", models.CASCADE) | ||||
|   | ||||
| @@ -1,91 +0,0 @@ | ||||
| # RemovedInDjango51Warning. | ||||
| """ | ||||
| The citext PostgreSQL extension supports indexing of case-insensitive text | ||||
| strings and thus eliminates the need for operations such as iexact and other | ||||
| modifiers to enforce use of an index. | ||||
| """ | ||||
| from django.db import IntegrityError | ||||
| from django.utils.deprecation import RemovedInDjango51Warning | ||||
|  | ||||
| from . import PostgreSQLTestCase | ||||
| from .models import CITestModel | ||||
|  | ||||
|  | ||||
| class CITextTestCase(PostgreSQLTestCase): | ||||
|     case_sensitive_lookups = ("contains", "startswith", "endswith", "regex") | ||||
|  | ||||
|     @classmethod | ||||
|     def setUpTestData(cls): | ||||
|         cls.john = CITestModel.objects.create( | ||||
|             name="JoHn", | ||||
|             email="joHn@johN.com", | ||||
|             description="Average Joe named JoHn", | ||||
|             array_field=["JoE", "jOhn"], | ||||
|         ) | ||||
|  | ||||
|     def test_equal_lowercase(self): | ||||
|         """ | ||||
|         citext removes the need for iexact as the index is case-insensitive. | ||||
|         """ | ||||
|         self.assertEqual( | ||||
|             CITestModel.objects.filter(name=self.john.name.lower()).count(), 1 | ||||
|         ) | ||||
|         self.assertEqual( | ||||
|             CITestModel.objects.filter(email=self.john.email.lower()).count(), 1 | ||||
|         ) | ||||
|         self.assertEqual( | ||||
|             CITestModel.objects.filter( | ||||
|                 description=self.john.description.lower() | ||||
|             ).count(), | ||||
|             1, | ||||
|         ) | ||||
|  | ||||
|     def test_fail_citext_primary_key(self): | ||||
|         """ | ||||
|         Creating an entry for a citext field used as a primary key which | ||||
|         clashes with an existing value isn't allowed. | ||||
|         """ | ||||
|         with self.assertRaises(IntegrityError): | ||||
|             CITestModel.objects.create(name="John") | ||||
|  | ||||
|     def test_array_field(self): | ||||
|         instance = CITestModel.objects.get() | ||||
|         self.assertEqual(instance.array_field, self.john.array_field) | ||||
|         self.assertTrue( | ||||
|             CITestModel.objects.filter(array_field__contains=["joe"]).exists() | ||||
|         ) | ||||
|  | ||||
|     def test_lookups_name_char(self): | ||||
|         for lookup in self.case_sensitive_lookups: | ||||
|             with self.subTest(lookup=lookup): | ||||
|                 query = {"name__{}".format(lookup): "john"} | ||||
|                 self.assertSequenceEqual( | ||||
|                     CITestModel.objects.filter(**query), [self.john] | ||||
|                 ) | ||||
|  | ||||
|     def test_lookups_description_text(self): | ||||
|         for lookup, string in zip( | ||||
|             self.case_sensitive_lookups, ("average", "average joe", "john", "Joe.named") | ||||
|         ): | ||||
|             with self.subTest(lookup=lookup, string=string): | ||||
|                 query = {"description__{}".format(lookup): string} | ||||
|                 self.assertSequenceEqual( | ||||
|                     CITestModel.objects.filter(**query), [self.john] | ||||
|                 ) | ||||
|  | ||||
|     def test_lookups_email(self): | ||||
|         for lookup, string in zip( | ||||
|             self.case_sensitive_lookups, ("john", "john", "john.com", "john.com") | ||||
|         ): | ||||
|             with self.subTest(lookup=lookup, string=string): | ||||
|                 query = {"email__{}".format(lookup): string} | ||||
|                 self.assertSequenceEqual( | ||||
|                     CITestModel.objects.filter(**query), [self.john] | ||||
|                 ) | ||||
|  | ||||
|     def test_citext_deprecated(self): | ||||
|         from django.contrib.postgres.fields import CIText | ||||
|  | ||||
|         msg = "django.contrib.postgres.fields.CIText mixin is deprecated." | ||||
|         with self.assertRaisesMessage(RemovedInDjango51Warning, msg): | ||||
|             CIText() | ||||
| @@ -245,13 +245,6 @@ def setup_collect_tests(start_at, start_after, test_labels=None): | ||||
|     settings.LOGGING = log_config | ||||
|     settings.SILENCED_SYSTEM_CHECKS = [ | ||||
|         "fields.W342",  # ForeignKey(unique=True) -> OneToOneField | ||||
|         # django.contrib.postgres.fields.CICharField deprecated. | ||||
|         "fields.W905", | ||||
|         "postgres.W004", | ||||
|         # django.contrib.postgres.fields.CIEmailField deprecated. | ||||
|         "fields.W906", | ||||
|         # django.contrib.postgres.fields.CITextField deprecated. | ||||
|         "fields.W907", | ||||
|     ] | ||||
|  | ||||
|     # Load all the ALWAYS_INSTALLED_APPS. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user