summaryrefslogtreecommitdiff
path: root/tests/admin_views
diff options
context:
space:
mode:
authorArthur Rio <arthurio@users.noreply.github.com>2019-01-16 16:07:28 +0100
committerTim Graham <timograham@gmail.com>2019-01-16 10:07:28 -0500
commit181fb60159e54d442d3610f4afba6f066a6dac05 (patch)
tree087646be10e537b2a9808e5351d30bd489e76273 /tests/admin_views
parentdbcf2ffa77af24642c035c58199e6058d91d8e35 (diff)
Fixed #11154, #22270 -- Made proxy model permissions use correct content type.
Co-Authored-By: Simon Charette <charette.s@gmail.com> Co-Authored-By: Antoine Catton <acatton@fusionbox.com>
Diffstat (limited to 'tests/admin_views')
-rw-r--r--tests/admin_views/admin.py4
-rw-r--r--tests/admin_views/models.py6
-rw-r--r--tests/admin_views/tests.py84
3 files changed, 89 insertions, 5 deletions
diff --git a/tests/admin_views/admin.py b/tests/admin_views/admin.py
index d09e7fa084..0b0ad41e2e 100644
--- a/tests/admin_views/admin.py
+++ b/tests/admin_views/admin.py
@@ -43,7 +43,8 @@ from .models import (
Restaurant, RowLevelChangePermissionModel, Section, ShortMessage, Simple,
Sketch, State, Story, StumpJoke, Subscriber, SuperVillain, Telegram, Thing,
Topping, UnchangeableObject, UndeletableObject, UnorderedObject,
- UserMessenger, Villain, Vodcast, Whatsit, Widget, Worker, WorkHour,
+ UserMessenger, UserProxy, Villain, Vodcast, Whatsit, Widget, Worker,
+ WorkHour,
)
@@ -1075,6 +1076,7 @@ site.register(Ingredient)
site.register(NotReferenced)
site.register(ExplicitlyProvidedPK, GetFormsetsArgumentCheckingAdmin)
site.register(ImplicitlyGeneratedPK, GetFormsetsArgumentCheckingAdmin)
+site.register(UserProxy)
# Register core models we need in our tests
site.register(User, UserAdmin)
diff --git a/tests/admin_views/models.py b/tests/admin_views/models.py
index eef8106df4..d134b34923 100644
--- a/tests/admin_views/models.py
+++ b/tests/admin_views/models.py
@@ -976,3 +976,9 @@ class Author(models.Model):
class Authorship(models.Model):
book = models.ForeignKey(Book, models.CASCADE)
author = models.ForeignKey(Author, models.CASCADE)
+
+
+class UserProxy(User):
+ """Proxy a model with a different app_label."""
+ class Meta:
+ proxy = True
diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py
index 93a93454d9..0cc16509ff 100644
--- a/tests/admin_views/tests.py
+++ b/tests/admin_views/tests.py
@@ -52,7 +52,8 @@ from .models import (
Report, Restaurant, RowLevelChangePermissionModel, SecretHideout, Section,
ShortMessage, Simple, State, Story, SuperSecretHideout, SuperVillain,
Telegram, TitleTranslation, Topping, UnchangeableObject, UndeletableObject,
- UnorderedObject, Villain, Vodcast, Whatsit, Widget, Worker, WorkHour,
+ UnorderedObject, UserProxy, Villain, Vodcast, Whatsit, Widget, Worker,
+ WorkHour,
)
ERROR_MESSAGE = "Please enter the correct username and password \
@@ -1362,10 +1363,10 @@ class CustomModelAdminTest(AdminViewBasicTestCase):
self.assertEqual(response.status_code, 200)
-def get_perm(Model, perm):
+def get_perm(Model, codename):
"""Return the permission object, for the Model"""
- ct = ContentType.objects.get_for_model(Model)
- return Permission.objects.get(content_type=ct, codename=perm)
+ ct = ContentType.objects.get_for_model(Model, for_concrete_model=False)
+ return Permission.objects.get(content_type=ct, codename=codename)
@override_settings(
@@ -2384,6 +2385,81 @@ class AdminViewPermissionsTest(TestCase):
)
+@override_settings(
+ ROOT_URLCONF='admin_views.urls',
+ TEMPLATES=[{
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'APP_DIRS': True,
+ 'OPTIONS': {
+ 'context_processors': [
+ 'django.contrib.auth.context_processors.auth',
+ 'django.contrib.messages.context_processors.messages',
+ ],
+ },
+ }],
+)
+class AdminViewProxyModelPermissionsTests(TestCase):
+ """Tests for proxy models permissions in the admin."""
+
+ @classmethod
+ def setUpTestData(cls):
+ cls.viewuser = User.objects.create_user(username='viewuser', password='secret', is_staff=True)
+ cls.adduser = User.objects.create_user(username='adduser', password='secret', is_staff=True)
+ cls.changeuser = User.objects.create_user(username='changeuser', password='secret', is_staff=True)
+ cls.deleteuser = User.objects.create_user(username='deleteuser', password='secret', is_staff=True)
+ # Setup permissions.
+ opts = UserProxy._meta
+ cls.viewuser.user_permissions.add(get_perm(UserProxy, get_permission_codename('view', opts)))
+ cls.adduser.user_permissions.add(get_perm(UserProxy, get_permission_codename('add', opts)))
+ cls.changeuser.user_permissions.add(get_perm(UserProxy, get_permission_codename('change', opts)))
+ cls.deleteuser.user_permissions.add(get_perm(UserProxy, get_permission_codename('delete', opts)))
+ # UserProxy instances.
+ cls.user_proxy = UserProxy.objects.create(username='user_proxy', password='secret')
+
+ def test_add(self):
+ self.client.force_login(self.adduser)
+ url = reverse('admin:admin_views_userproxy_add')
+ data = {
+ 'username': 'can_add',
+ 'password': 'secret',
+ 'date_joined_0': '2019-01-15',
+ 'date_joined_1': '16:59:10',
+ }
+ response = self.client.post(url, data, follow=True)
+ self.assertEqual(response.status_code, 200)
+ self.assertTrue(UserProxy.objects.filter(username='can_add').exists())
+
+ def test_view(self):
+ self.client.force_login(self.viewuser)
+ response = self.client.get(reverse('admin:admin_views_userproxy_changelist'))
+ self.assertContains(response, '<h1>Select user proxy to view</h1>')
+ self.assertEqual(response.status_code, 200)
+ response = self.client.get(reverse('admin:admin_views_userproxy_change', args=(self.user_proxy.pk,)))
+ self.assertContains(response, '<h1>View user proxy</h1>')
+ self.assertContains(response, '<div class="readonly">user_proxy</div>')
+
+ def test_change(self):
+ self.client.force_login(self.changeuser)
+ data = {
+ 'password': self.user_proxy.password,
+ 'username': self.user_proxy.username,
+ 'date_joined_0': self.user_proxy.date_joined.strftime('%Y-%m-%d'),
+ 'date_joined_1': self.user_proxy.date_joined.strftime('%H:%M:%S'),
+ 'first_name': 'first_name',
+ }
+ url = reverse('admin:admin_views_userproxy_change', args=(self.user_proxy.pk,))
+ response = self.client.post(url, data)
+ self.assertRedirects(response, reverse('admin:admin_views_userproxy_changelist'))
+ self.assertEqual(UserProxy.objects.get(pk=self.user_proxy.pk).first_name, 'first_name')
+
+ def test_delete(self):
+ self.client.force_login(self.deleteuser)
+ url = reverse('admin:admin_views_userproxy_delete', args=(self.user_proxy.pk,))
+ response = self.client.post(url, {'post': 'yes'}, follow=True)
+ self.assertEqual(response.status_code, 200)
+ self.assertFalse(UserProxy.objects.filter(pk=self.user_proxy.pk).exists())
+
+
@override_settings(ROOT_URLCONF='admin_views.urls')
class AdminViewsNoUrlTest(TestCase):
"""Regression test for #17333"""