mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[2.0.x] Refs #28876 -- Fixed incorrect class-based model index name generation for models with quoted db_table.
Thanks Simon Charette and Tim Graham for the review and Carlos E. C.
Leite for the report.
Backport of f79d9a322c from master
			
			
This commit is contained in:
		| @@ -1,5 +1,6 @@ | |||||||
| import hashlib | import hashlib | ||||||
|  |  | ||||||
|  | from django.db.backends.utils import split_identifier | ||||||
| from django.utils.encoding import force_bytes | from django.utils.encoding import force_bytes | ||||||
|  |  | ||||||
| __all__ = ['Index'] | __all__ = ['Index'] | ||||||
| @@ -90,7 +91,7 @@ class Index: | |||||||
|         (8 chars) and unique hash + suffix (10 chars). Each part is made to |         (8 chars) and unique hash + suffix (10 chars). Each part is made to | ||||||
|         fit its size by truncating the excess length. |         fit its size by truncating the excess length. | ||||||
|         """ |         """ | ||||||
|         table_name = model._meta.db_table |         _, table_name = split_identifier(model._meta.db_table) | ||||||
|         column_names = [model._meta.get_field(field_name).column for field_name, order in self.fields_orders] |         column_names = [model._meta.get_field(field_name).column for field_name, order in self.fields_orders] | ||||||
|         column_names_with_order = [ |         column_names_with_order = [ | ||||||
|             (('-%s' if order else '%s') % column_name) |             (('-%s' if order else '%s') % column_name) | ||||||
|   | |||||||
| @@ -11,3 +11,6 @@ Bugfixes | |||||||
|  |  | ||||||
| * Fixed a regression in Django 1.11 that added newlines between ``MultiWidget``'s | * Fixed a regression in Django 1.11 that added newlines between ``MultiWidget``'s | ||||||
|   subwidgets (:ticket:`28890`). |   subwidgets (:ticket:`28890`). | ||||||
|  |  | ||||||
|  | * Fixed incorrect class-based model index name generation for models with | ||||||
|  |   quoted ``db_table`` (:ticket:`28876`). | ||||||
|   | |||||||
| @@ -11,3 +11,6 @@ Bugfixes | |||||||
|  |  | ||||||
| * Fixed a regression in Django 1.11 that added newlines between ``MultiWidget``'s | * Fixed a regression in Django 1.11 that added newlines between ``MultiWidget``'s | ||||||
|   subwidgets (:ticket:`28890`). |   subwidgets (:ticket:`28890`). | ||||||
|  |  | ||||||
|  | * Fixed incorrect class-based model index name generation for models with | ||||||
|  |   quoted ``db_table`` (:ticket:`28876`). | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| from django.conf import settings | from django.conf import settings | ||||||
| from django.db import connection, models | from django.db import connection, models | ||||||
| from django.test import SimpleTestCase, skipUnlessDBFeature | from django.test import SimpleTestCase, skipUnlessDBFeature | ||||||
|  | from django.test.utils import isolate_apps | ||||||
|  |  | ||||||
| from .models import Book, ChildModel1, ChildModel2 | from .models import Book, ChildModel1, ChildModel2 | ||||||
|  |  | ||||||
| @@ -70,6 +71,18 @@ class IndexesTests(SimpleTestCase): | |||||||
|         with self.assertRaisesMessage(AssertionError, msg): |         with self.assertRaisesMessage(AssertionError, msg): | ||||||
|             long_field_index.set_name_with_model(Book) |             long_field_index.set_name_with_model(Book) | ||||||
|  |  | ||||||
|  |     @isolate_apps('model_indexes') | ||||||
|  |     def test_name_auto_generation_with_quoted_db_table(self): | ||||||
|  |         class QuotedDbTable(models.Model): | ||||||
|  |             name = models.CharField(max_length=50) | ||||||
|  |  | ||||||
|  |             class Meta: | ||||||
|  |                 db_table = '"t_quoted"' | ||||||
|  |  | ||||||
|  |         index = models.Index(fields=['name']) | ||||||
|  |         index.set_name_with_model(QuotedDbTable) | ||||||
|  |         self.assertEqual(index.name, 't_quoted_name_e4ed1b_idx') | ||||||
|  |  | ||||||
|     def test_deconstruction(self): |     def test_deconstruction(self): | ||||||
|         index = models.Index(fields=['title'], db_tablespace='idx_tbls') |         index = models.Index(fields=['title'], db_tablespace='idx_tbls') | ||||||
|         index.set_name_with_model(Book) |         index.set_name_with_model(Book) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user