mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[1.11.x] Refs #26610 -- Added CIText mixin and CIChar/Email/TextField.
Backport of fb5bd38e3b from master
			
			
This commit is contained in:
		| @@ -6,9 +6,9 @@ from django.db import models | ||||
|  | ||||
| try: | ||||
|     from django.contrib.postgres.fields import ( | ||||
|         ArrayField, BigIntegerRangeField, CITextField, DateRangeField, | ||||
|         DateTimeRangeField, FloatRangeField, HStoreField, IntegerRangeField, | ||||
|         JSONField, | ||||
|         ArrayField, BigIntegerRangeField, CICharField, CIEmailField, | ||||
|         CITextField, DateRangeField, DateTimeRangeField, FloatRangeField, | ||||
|         HStoreField, IntegerRangeField, JSONField, | ||||
|     ) | ||||
|     from django.contrib.postgres.search import SearchVectorField | ||||
| except ImportError: | ||||
| @@ -30,6 +30,8 @@ except ImportError: | ||||
|  | ||||
|     ArrayField = DummyArrayField | ||||
|     BigIntegerRangeField = models.Field | ||||
|     CICharField = models.Field | ||||
|     CIEmailField = models.Field | ||||
|     CITextField = models.Field | ||||
|     DateRangeField = models.Field | ||||
|     DateTimeRangeField = models.Field | ||||
|   | ||||
| @@ -5,9 +5,9 @@ from django.core.serializers.json import DjangoJSONEncoder | ||||
| from django.db import migrations, models | ||||
|  | ||||
| from ..fields import ( | ||||
|     ArrayField, BigIntegerRangeField, CITextField, DateRangeField, | ||||
|     DateTimeRangeField, FloatRangeField, HStoreField, IntegerRangeField, | ||||
|     JSONField, SearchVectorField, | ||||
|     ArrayField, BigIntegerRangeField, CICharField, CIEmailField, CITextField, | ||||
|     DateRangeField, DateTimeRangeField, FloatRangeField, HStoreField, | ||||
|     IntegerRangeField, JSONField, SearchVectorField, | ||||
| ) | ||||
| from ..models import TagField | ||||
|  | ||||
| @@ -139,9 +139,11 @@ class Migration(migrations.Migration): | ||||
|             bases=None, | ||||
|         ), | ||||
|         migrations.CreateModel( | ||||
|             name='CITextTestModel', | ||||
|             name='CITestModel', | ||||
|             fields=[ | ||||
|                 ('name', CITextField(primary_key=True, max_length=255)), | ||||
|                 ('name', CICharField(primary_key=True, max_length=255)), | ||||
|                 ('email', CIEmailField()), | ||||
|                 ('description', CITextField()), | ||||
|             ], | ||||
|             options={ | ||||
|                 'required_db_vendor': 'postgresql', | ||||
|   | ||||
| @@ -2,9 +2,9 @@ from django.core.serializers.json import DjangoJSONEncoder | ||||
| from django.db import models | ||||
|  | ||||
| from .fields import ( | ||||
|     ArrayField, BigIntegerRangeField, CITextField, DateRangeField, | ||||
|     DateTimeRangeField, FloatRangeField, HStoreField, IntegerRangeField, | ||||
|     JSONField, SearchVectorField, | ||||
|     ArrayField, BigIntegerRangeField, CICharField, CIEmailField, CITextField, | ||||
|     DateRangeField, DateTimeRangeField, FloatRangeField, HStoreField, | ||||
|     IntegerRangeField, JSONField, SearchVectorField, | ||||
| ) | ||||
|  | ||||
|  | ||||
| @@ -101,8 +101,10 @@ class Character(models.Model): | ||||
|         return self.name | ||||
|  | ||||
|  | ||||
| class CITextTestModel(PostgreSQLModel): | ||||
|     name = CITextField(primary_key=True, max_length=255) | ||||
| class CITestModel(PostgreSQLModel): | ||||
|     name = CICharField(primary_key=True, max_length=255) | ||||
|     email = CIEmailField() | ||||
|     description = CITextField() | ||||
|  | ||||
|     def __str__(self): | ||||
|         return self.name | ||||
|   | ||||
| @@ -6,25 +6,31 @@ modifiers to enforce use of an index. | ||||
| from django.db import IntegrityError | ||||
|  | ||||
| from . import PostgreSQLTestCase | ||||
| from .models import CITextTestModel | ||||
| from .models import CITestModel | ||||
|  | ||||
|  | ||||
| class CITextTestCase(PostgreSQLTestCase): | ||||
|  | ||||
|     @classmethod | ||||
|     def setUpTestData(cls): | ||||
|         CITextTestModel.objects.create(name='JoHn') | ||||
|         cls.john = CITestModel.objects.create( | ||||
|             name='JoHn', | ||||
|             email='joHn@johN.com', | ||||
|             description='Average Joe named JoHn', | ||||
|         ) | ||||
|  | ||||
|     def test_equal_lowercase(self): | ||||
|         """ | ||||
|         citext removes the need for iexact as the index is case-insensitive. | ||||
|         """ | ||||
|         self.assertEqual(CITextTestModel.objects.filter(name='john').count(), 1) | ||||
|         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_case(self): | ||||
|     def test_fail_citext_primary_key(self): | ||||
|         """ | ||||
|         Creating an entry for a citext-field which clashes with an existing | ||||
|         value isn't allowed. | ||||
|         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): | ||||
|             CITextTestModel.objects.create(name='John') | ||||
|             CITestModel.objects.create(name='John') | ||||
|   | ||||
		Reference in New Issue
	
	Block a user