|
17 | 17 | ) |
18 | 18 | from django.contrib.auth.models import User |
19 | 19 | from django.contrib.messages.storage.cookie import CookieStorage |
20 | | -from django.db import DatabaseError, connection, models |
| 20 | +from django.db import DatabaseError, connection |
21 | 21 | from django.db.models import F, Field, IntegerField |
22 | 22 | from django.db.models.functions import Upper |
23 | 23 | from django.db.models.lookups import Contains, Exact |
24 | 24 | from django.template import Context, Template, TemplateSyntaxError |
25 | 25 | from django.test import TestCase, override_settings, skipUnlessDBFeature |
26 | 26 | from django.test.client import RequestFactory |
27 | | -from django.test.utils import CaptureQueriesContext, isolate_apps, register_lookup |
| 27 | +from django.test.utils import CaptureQueriesContext, register_lookup |
28 | 28 | from django.urls import reverse |
29 | 29 | from django.utils import formats |
30 | 30 |
|
@@ -1582,176 +1582,6 @@ def check_results_order(ascending=False): |
1582 | 1582 | OrderedObjectAdmin.ordering = ["id", "bool"] |
1583 | 1583 | check_results_order(ascending=True) |
1584 | 1584 |
|
1585 | | - @isolate_apps("admin_changelist") |
1586 | | - def test_total_ordering_optimization(self): |
1587 | | - class Related(models.Model): |
1588 | | - unique_field = models.BooleanField(unique=True) |
1589 | | - |
1590 | | - class Meta: |
1591 | | - ordering = ("unique_field",) |
1592 | | - |
1593 | | - class Model(models.Model): |
1594 | | - unique_field = models.BooleanField(unique=True) |
1595 | | - unique_nullable_field = models.BooleanField(unique=True, null=True) |
1596 | | - related = models.ForeignKey(Related, models.CASCADE) |
1597 | | - other_related = models.ForeignKey(Related, models.CASCADE) |
1598 | | - related_unique = models.OneToOneField(Related, models.CASCADE) |
1599 | | - field = models.BooleanField() |
1600 | | - other_field = models.BooleanField() |
1601 | | - null_field = models.BooleanField(null=True) |
1602 | | - |
1603 | | - class Meta: |
1604 | | - unique_together = { |
1605 | | - ("field", "other_field"), |
1606 | | - ("field", "null_field"), |
1607 | | - ("related", "other_related_id"), |
1608 | | - } |
1609 | | - |
1610 | | - class ModelAdmin(admin.ModelAdmin): |
1611 | | - def get_queryset(self, request): |
1612 | | - return Model.objects.none() |
1613 | | - |
1614 | | - request = self._mocked_authenticated_request("/", self.superuser) |
1615 | | - site = admin.AdminSite(name="admin") |
1616 | | - model_admin = ModelAdmin(Model, site) |
1617 | | - change_list = model_admin.get_changelist_instance(request) |
1618 | | - tests = ( |
1619 | | - ([], ["-pk"]), |
1620 | | - # Unique non-nullable field. |
1621 | | - (["unique_field"], ["unique_field"]), |
1622 | | - (["-unique_field"], ["-unique_field"]), |
1623 | | - # Unique nullable field. |
1624 | | - (["unique_nullable_field"], ["unique_nullable_field", "-pk"]), |
1625 | | - # Field. |
1626 | | - (["field"], ["field", "-pk"]), |
1627 | | - # Related field introspection is not implemented. |
1628 | | - (["related__unique_field"], ["related__unique_field", "-pk"]), |
1629 | | - # Related attname unique. |
1630 | | - (["related_unique_id"], ["related_unique_id"]), |
1631 | | - # Related ordering introspection is not implemented. |
1632 | | - (["related_unique"], ["related_unique", "-pk"]), |
1633 | | - # Composite unique. |
1634 | | - (["field", "-other_field"], ["field", "-other_field"]), |
1635 | | - # Composite unique nullable. |
1636 | | - (["-field", "null_field"], ["-field", "null_field", "-pk"]), |
1637 | | - # Composite unique and nullable. |
1638 | | - ( |
1639 | | - ["-field", "null_field", "other_field"], |
1640 | | - ["-field", "null_field", "other_field"], |
1641 | | - ), |
1642 | | - # Composite unique attnames. |
1643 | | - (["related_id", "-other_related_id"], ["related_id", "-other_related_id"]), |
1644 | | - # Composite unique names. |
1645 | | - (["related", "-other_related_id"], ["related", "-other_related_id", "-pk"]), |
1646 | | - ) |
1647 | | - # F() objects composite unique. |
1648 | | - total_ordering = [F("field"), F("other_field").desc(nulls_last=True)] |
1649 | | - # F() objects composite unique nullable. |
1650 | | - non_total_ordering = [F("field"), F("null_field").desc(nulls_last=True)] |
1651 | | - tests += ( |
1652 | | - (total_ordering, total_ordering), |
1653 | | - (non_total_ordering, non_total_ordering + ["-pk"]), |
1654 | | - ) |
1655 | | - for ordering, expected in tests: |
1656 | | - with self.subTest(ordering=ordering): |
1657 | | - self.assertEqual( |
1658 | | - change_list._get_deterministic_ordering(ordering), expected |
1659 | | - ) |
1660 | | - |
1661 | | - @isolate_apps("admin_changelist") |
1662 | | - def test_total_ordering_optimization_meta_constraints(self): |
1663 | | - class Related(models.Model): |
1664 | | - unique_field = models.BooleanField(unique=True) |
1665 | | - |
1666 | | - class Meta: |
1667 | | - ordering = ("unique_field",) |
1668 | | - |
1669 | | - class Model(models.Model): |
1670 | | - field_1 = models.BooleanField() |
1671 | | - field_2 = models.BooleanField() |
1672 | | - field_3 = models.BooleanField() |
1673 | | - field_4 = models.BooleanField() |
1674 | | - field_5 = models.BooleanField() |
1675 | | - field_6 = models.BooleanField() |
1676 | | - nullable_1 = models.BooleanField(null=True) |
1677 | | - nullable_2 = models.BooleanField(null=True) |
1678 | | - related_1 = models.ForeignKey(Related, models.CASCADE) |
1679 | | - related_2 = models.ForeignKey(Related, models.CASCADE) |
1680 | | - related_3 = models.ForeignKey(Related, models.CASCADE) |
1681 | | - related_4 = models.ForeignKey(Related, models.CASCADE) |
1682 | | - |
1683 | | - class Meta: |
1684 | | - constraints = [ |
1685 | | - *[ |
1686 | | - models.UniqueConstraint(fields=fields, name="".join(fields)) |
1687 | | - for fields in ( |
1688 | | - ["field_1"], |
1689 | | - ["nullable_1"], |
1690 | | - ["related_1"], |
1691 | | - ["related_2_id"], |
1692 | | - ["field_2", "field_3"], |
1693 | | - ["field_2", "nullable_2"], |
1694 | | - ["field_2", "related_3"], |
1695 | | - ["field_3", "related_4_id"], |
1696 | | - ) |
1697 | | - ], |
1698 | | - models.CheckConstraint(condition=models.Q(id__gt=0), name="foo"), |
1699 | | - models.UniqueConstraint( |
1700 | | - fields=["field_5"], |
1701 | | - condition=models.Q(id__gt=10), |
1702 | | - name="total_ordering_1", |
1703 | | - ), |
1704 | | - models.UniqueConstraint( |
1705 | | - fields=["field_6"], |
1706 | | - condition=models.Q(), |
1707 | | - name="total_ordering", |
1708 | | - ), |
1709 | | - ] |
1710 | | - |
1711 | | - class ModelAdmin(admin.ModelAdmin): |
1712 | | - def get_queryset(self, request): |
1713 | | - return Model.objects.none() |
1714 | | - |
1715 | | - request = self._mocked_authenticated_request("/", self.superuser) |
1716 | | - site = admin.AdminSite(name="admin") |
1717 | | - model_admin = ModelAdmin(Model, site) |
1718 | | - change_list = model_admin.get_changelist_instance(request) |
1719 | | - tests = ( |
1720 | | - # Unique non-nullable field. |
1721 | | - (["field_1"], ["field_1"]), |
1722 | | - # Unique nullable field. |
1723 | | - (["nullable_1"], ["nullable_1", "-pk"]), |
1724 | | - # Related attname unique. |
1725 | | - (["related_1_id"], ["related_1_id"]), |
1726 | | - (["related_2_id"], ["related_2_id"]), |
1727 | | - # Related ordering introspection is not implemented. |
1728 | | - (["related_1"], ["related_1", "-pk"]), |
1729 | | - # Composite unique. |
1730 | | - (["-field_2", "field_3"], ["-field_2", "field_3"]), |
1731 | | - # Composite unique nullable. |
1732 | | - (["field_2", "-nullable_2"], ["field_2", "-nullable_2", "-pk"]), |
1733 | | - # Composite unique and nullable. |
1734 | | - ( |
1735 | | - ["field_2", "-nullable_2", "field_3"], |
1736 | | - ["field_2", "-nullable_2", "field_3"], |
1737 | | - ), |
1738 | | - # Composite field and related field name. |
1739 | | - (["field_2", "-related_3"], ["field_2", "-related_3", "-pk"]), |
1740 | | - (["field_3", "related_4"], ["field_3", "related_4", "-pk"]), |
1741 | | - # Composite field and related field attname. |
1742 | | - (["field_2", "related_3_id"], ["field_2", "related_3_id"]), |
1743 | | - (["field_3", "-related_4_id"], ["field_3", "-related_4_id"]), |
1744 | | - # Partial unique constraint is ignored. |
1745 | | - (["field_5"], ["field_5", "-pk"]), |
1746 | | - # Unique constraint with an empty condition. |
1747 | | - (["field_6"], ["field_6"]), |
1748 | | - ) |
1749 | | - for ordering, expected in tests: |
1750 | | - with self.subTest(ordering=ordering): |
1751 | | - self.assertEqual( |
1752 | | - change_list._get_deterministic_ordering(ordering), expected |
1753 | | - ) |
1754 | | - |
1755 | 1585 | def test_dynamic_list_filter(self): |
1756 | 1586 | """ |
1757 | 1587 | Regression tests for ticket #17646: dynamic list_filter support. |
|
0 commit comments