diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/regressiontests/admin_inlines/models.py | 40 | ||||
| -rw-r--r-- | tests/regressiontests/admin_inlines/tests.py | 19 | ||||
| -rw-r--r-- | tests/regressiontests/admin_validation/models.py | 8 | ||||
| -rw-r--r-- | tests/regressiontests/admin_validation/tests.py | 16 |
4 files changed, 78 insertions, 5 deletions
diff --git a/tests/regressiontests/admin_inlines/models.py b/tests/regressiontests/admin_inlines/models.py index bb299f32b8..ee0abd1d3d 100644 --- a/tests/regressiontests/admin_inlines/models.py +++ b/tests/regressiontests/admin_inlines/models.py @@ -151,3 +151,43 @@ class TitleInline(admin.TabularInline): extra = 1 admin.site.register(TitleCollection, inlines=[TitleInline]) + +# Models for #15424 + +class Poll(models.Model): + name = models.CharField(max_length=40) + +class Question(models.Model): + poll = models.ForeignKey(Poll) + +class QuestionInline(admin.TabularInline): + model = Question + readonly_fields=['call_me'] + + def call_me(self, obj): + return 'Callable in QuestionInline' + +class PollAdmin(admin.ModelAdmin): + inlines = [QuestionInline] + + def call_me(self, obj): + return 'Callable in PollAdmin' + +class Novel(models.Model): + name = models.CharField(max_length=40) + +class Chapter(models.Model): + novel = models.ForeignKey(Novel) + +class ChapterInline(admin.TabularInline): + model = Chapter + readonly_fields=['call_me'] + + def call_me(self, obj): + return 'Callable in ChapterInline' + +class NovelAdmin(admin.ModelAdmin): + inlines = [ChapterInline] + +admin.site.register(Poll, PollAdmin) +admin.site.register(Novel, NovelAdmin) diff --git a/tests/regressiontests/admin_inlines/tests.py b/tests/regressiontests/admin_inlines/tests.py index 915c6fac8d..067b3c5eaf 100644 --- a/tests/regressiontests/admin_inlines/tests.py +++ b/tests/regressiontests/admin_inlines/tests.py @@ -84,6 +84,25 @@ class TestInline(TestCase): # Here colspan is "4": two fields (title1 and title2), one hidden field and the delete checkbock. self.assertContains(response, '<tr><td colspan="4"><ul class="errorlist"><li>The two titles must be the same</li></ul></td></tr>') + def test_no_parent_callable_lookup(self): + """Admin inline `readonly_field` shouldn't invoke parent ModelAdmin callable""" + # Identically named callable isn't present in the parent ModelAdmin, + # rendering of the add view shouldn't explode + response = self.client.get('/test_admin/admin/admin_inlines/novel/add/') + self.assertEqual(response.status_code, 200) + # View should have the child inlines section + self.assertContains(response, '<div class="inline-group" id="chapter_set-group">') + + def test_callable_lookup(self): + """Admin inline should invoke local callable when its name is listed in readonly_fields""" + response = self.client.get('/test_admin/admin/admin_inlines/poll/add/') + self.assertEqual(response.status_code, 200) + # Add parent object view should have the child inlines section + self.assertContains(response, '<div class="inline-group" id="question_set-group">') + # The right callabe should be used for the inline readonly_fields + # column cells + self.assertContains(response, '<p>Callable in QuestionInline</p>') + class TestInlineMedia(TestCase): fixtures = ['admin-views-users.xml'] diff --git a/tests/regressiontests/admin_validation/models.py b/tests/regressiontests/admin_validation/models.py index 24387cc363..5e080a9232 100644 --- a/tests/regressiontests/admin_validation/models.py +++ b/tests/regressiontests/admin_validation/models.py @@ -45,3 +45,11 @@ class Book(models.Model): class AuthorsBooks(models.Model): author = models.ForeignKey(Author) book = models.ForeignKey(Book) + + +class State(models.Model): + name = models.CharField(max_length=15) + + +class City(models.Model): + state = models.ForeignKey(State) diff --git a/tests/regressiontests/admin_validation/tests.py b/tests/regressiontests/admin_validation/tests.py index 1872ca55e2..6fbdc8040e 100644 --- a/tests/regressiontests/admin_validation/tests.py +++ b/tests/regressiontests/admin_validation/tests.py @@ -4,7 +4,7 @@ from django.contrib.admin.validation import validate, validate_inline, \ ImproperlyConfigured from django.test import TestCase -from models import Song, Book, Album, TwoAlbumFKAndAnE +from models import Song, Book, Album, TwoAlbumFKAndAnE, State, City class SongForm(forms.ModelForm): pass @@ -162,6 +162,16 @@ class ValidationTestCase(TestCase): validate, SongAdmin, Song) + def test_nonexistant_field_on_inline(self): + class CityInline(admin.TabularInline): + model = City + readonly_fields=['i_dont_exist'] # Missing attribute + + self.assertRaisesMessage(ImproperlyConfigured, + "CityInline.readonly_fields[0], 'i_dont_exist' is not a callable or an attribute of 'CityInline' or found in the model 'City'.", + validate_inline, + CityInline, None, State) + def test_extra(self): class SongAdmin(admin.ModelAdmin): def awesome_song(self, instance): @@ -241,7 +251,3 @@ class ValidationTestCase(TestCase): fields = ['title', 'extra_data'] validate(FieldsOnFormOnlyAdmin, Song) - - - - |
