Ticket #9969: 9969-admin-bugs-with-nested-choices-r10283.diff

File 9969-admin-bugs-with-nested-choices-r10283.diff, 6.2 KB (added by ramiro, 6 years ago)

Patch updated to apply cleanly to trunk as of r10283

  • django/contrib/admin/filterspecs.py

    diff -r f44ec14ec084 django/contrib/admin/filterspecs.py
    a b  
    9090        yield {'selected': self.lookup_val is None,
    9191               'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
    9292               'display': _('All')}
    93         for k, v in self.field.choices:
     93        for k, v in self.field.flatchoices:
    9494            yield {'selected': smart_unicode(k) == self.lookup_val,
    9595                    'query_string': cl.get_query_string({self.lookup_kwarg: k}),
    9696                    'display': v}
  • django/contrib/admin/templatetags/admin_list.py

    diff -r f44ec14ec084 django/contrib/admin/templatetags/admin_list.py
    a b  
    205205                    result_repr = EMPTY_CHANGELIST_VALUE
    206206            # Fields with choices are special: Use the representation
    207207            # of the choice.
    208             elif f.choices:
    209                 result_repr = dict(f.choices).get(field_val, EMPTY_CHANGELIST_VALUE)
     208            elif f.flatchoices:
     209                result_repr = dict(f.flatchoices).get(field_val, EMPTY_CHANGELIST_VALUE)
    210210            else:
    211211                result_repr = escape(field_val)
    212212        if force_unicode(result_repr) == '':
  • tests/regressiontests/admin_views/customadmin.py

    diff -r f44ec14ec084 tests/regressiontests/admin_views/customadmin.py
    a b  
    2828site.register(models.Article, models.ArticleAdmin)
    2929site.register(models.Section, inlines=[models.ArticleInline])
    3030site.register(models.Thing, models.ThingAdmin)
     31site.register(models.Fabric, models.FabricAdmin)
  • new file tests/regressiontests/admin_views/fixtures/admin-views-fabrics.xml

    diff -r f44ec14ec084 tests/regressiontests/admin_views/fixtures/admin-views-fabrics.xml
    - +  
     1<?xml version="1.0" encoding="utf-8"?>
     2<django-objects version="1.0">
     3  <object pk="1" model="admin_views.fabric">
     4    <field type="CharField" name="surface">x</field>
     5  </object>
     6  <object pk="2" model="admin_views.fabric">
     7    <field type="CharField" name="surface">y</field>
     8  </object>
     9  <object pk="3" model="admin_views.fabric">
     10    <field type="CharField" name="surface">plain</field>
     11  </object>
     12</django-objects>
  • tests/regressiontests/admin_views/models.py

    diff -r f44ec14ec084 tests/regressiontests/admin_views/models.py
    a b  
    134134
    135135class ThingAdmin(admin.ModelAdmin):
    136136    list_filter = ('color',)
     137
     138class Fabric(models.Model):
     139    NG_CHOICES = (
     140        ('Textured', (
     141                ('x', 'Horizontal'),
     142                ('y', 'Vertical'),
     143            )
     144        ),
     145        ('plain', 'Smooth'),
     146    )
     147    surface = models.CharField(max_length=20, choices=NG_CHOICES)
     148
     149class FabricAdmin(admin.ModelAdmin):
     150    list_display = ('surface',)
     151    list_filter = ('surface',)
    137152
    138153class Person(models.Model):
    139154    GENDER_CHOICES = (
     
    274289admin.site.register(ExternalSubscriber, ExternalSubscriberAdmin)
    275290admin.site.register(Podcast, PodcastAdmin)
    276291admin.site.register(Parent, ParentAdmin)
     292admin.site.register(Fabric, FabricAdmin)
    277293
    278294# We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2.
    279295# That way we cover all four cases:
  • tests/regressiontests/admin_views/tests.py

    diff -r f44ec14ec084 tests/regressiontests/admin_views/tests.py
    a b  
    2121    from sets import Set as set
    2222
    2323class AdminViewBasicTest(TestCase):
    24     fixtures = ['admin-views-users.xml', 'admin-views-colors.xml']
     24    fixtures = ['admin-views-users.xml', 'admin-views-colors.xml', 'admin-views-fabrics.xml']
    2525
    2626    # Store the bit of the URL where the admin is registered as a class
    2727    # variable. That way we can test a second AdminSite just by subclassing
     
    181181        self.assertRedirects(response, '/test_admin/%s/admin_views/thing/?e=1' % self.urlbit)
    182182        response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit, {'color__id__exact': 'StringNotInteger!'})
    183183        self.assertRedirects(response, '/test_admin/%s/admin_views/thing/?e=1' % self.urlbit)
     184
     185    def testNamedGroupFieldChoicesChangeList(self):
     186        """
     187        Ensures the admin changelist shows correct values in the relevant column
     188        for rows corresponding to instances of a model in which a named group
     189        has been used in the choices option of a field.
     190        """
     191        response = self.client.get('/test_admin/%s/admin_views/fabric/' % self.urlbit)
     192        self.failUnlessEqual(response.status_code, 200)
     193        self.failUnless(
     194            '<a href="1/">Horizontal</a>' in response.content and
     195            '<a href="2/">Vertical</a>' in response.content,
     196            "Changelist table isn't showing the right human-readable values set by a model field 'choices' option named group."
     197        )
     198
     199    def testNamedGroupFieldChoicesFilter(self):
     200        """
     201        Ensures the filter UI shows correctly when at least one named group has
     202        been used in the choices option of a model field.
     203        """
     204        response = self.client.get('/test_admin/%s/admin_views/fabric/' % self.urlbit)
     205        self.failUnlessEqual(response.status_code, 200)
     206        self.failUnless(
     207            '<div id="changelist-filter">' in response.content,
     208            "Expected filter not found in changelist view."
     209        )
     210        self.failUnless(
     211            '<a href="?surface__exact=x">Horizontal</a>' in response.content and
     212            '<a href="?surface__exact=y">Vertical</a>' in response.content,
     213            "Changelist filter isn't showing options contained inside a model field 'choices' option named group."
     214        )
    184215
    185216class CustomModelAdminTest(AdminViewBasicTest):
    186217    urlbit = "admin2"
Back to Top