django/tests/modeladmin/test_has_add_permission_obj...

112 lines
3.2 KiB
Python

from datetime import date
from django.contrib.admin.options import ModelAdmin, TabularInline
from django.contrib.admin.sites import AdminSite
from django.test import TestCase
from django.utils.deprecation import RemovedInDjango30Warning
from .models import Band, Song
from .test_checks import CheckTestCase
class HasAddPermissionObjTests(CheckTestCase):
def test_model_admin_inherited_valid(self):
class BandAdmin(ModelAdmin):
pass
self.assertIsValid(BandAdmin, Band)
def test_model_admin_valid(self):
class BandAdmin(ModelAdmin):
def has_add_permission(self, request):
return super().has_add_permission(request)
self.assertIsValid(BandAdmin, Band)
def test_inline_admin_inherited_valid(self):
class SongInlineAdmin(TabularInline):
model = Song
class BandAdmin(ModelAdmin):
inlines = [SongInlineAdmin]
self.assertIsValid(BandAdmin, Band)
def test_inline_admin_valid(self):
class SongInlineAdmin(TabularInline):
model = Song
def has_add_permission(self, request, obj):
return super().has_add_permission(request, obj)
class BandAdmin(ModelAdmin):
inlines = [SongInlineAdmin]
self.assertIsValid(BandAdmin, Band)
def test_inline_admin_warning(self):
class SongInlineAdmin(TabularInline):
model = Song
def has_add_permission(self, request):
return super().has_add_permission(request)
class BandAdmin(ModelAdmin):
inlines = [SongInlineAdmin]
msg = (
"Update SongInlineAdmin.has_add_permission() to accept a "
"positional `obj` argument."
)
with self.assertWarnsMessage(RemovedInDjango30Warning, msg):
self.assertIsValid(BandAdmin, Band)
class MockRequest:
method = 'POST'
FILES = {}
POST = {}
class SongInline(TabularInline):
model = Song
def has_add_permission(self, request):
return True
class BandAdmin(ModelAdmin):
inlines = [SongInline]
class ModelAdminTests(TestCase):
@classmethod
def setUpTestData(cls):
cls.band = Band.objects.create(name='The Doors', bio='', sign_date=date(1965, 1, 1))
cls.song = Song.objects.create(name='test', band=cls.band)
def setUp(self):
self.site = AdminSite()
self.request = MockRequest()
self.request.POST = {
'song_set-TOTAL_FORMS': 4,
'song_set-INITIAL_FORMS': 1,
}
self.request.user = self.MockAddUser()
self.ma = BandAdmin(Band, self.site)
class MockAddUser:
def has_perm(self, perm):
return perm == 'modeladmin.add_band'
def test_get_inline_instances(self):
self.assertEqual(len(self.ma.get_inline_instances(self.request)), 1)
def test_get_inline_formsets(self):
formsets, inline_instances = self.ma._create_formsets(self.request, self.band, change=True)
self.assertEqual(len(self.ma.get_inline_formsets(self.request, formsets, inline_instances)), 1)
def test_get_formsets_with_inlines(self):
self.assertEqual(len(list(self.ma. get_formsets_with_inlines(self.request, self.band))), 1)