test_actions.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from django.contrib import admin
  2. from django.contrib.auth.models import Permission, User
  3. from django.contrib.contenttypes.models import ContentType
  4. from django.test import TestCase
  5. from .models import Band
  6. class AdminActionsTests(TestCase):
  7. @classmethod
  8. def setUpTestData(cls):
  9. cls.superuser = User.objects.create_superuser(username='super', password='secret', email='super@example.com')
  10. content_type = ContentType.objects.get_for_model(Band)
  11. Permission.objects.create(name='custom', codename='custom_band', content_type=content_type)
  12. for user_type in ('view', 'add', 'change', 'delete', 'custom'):
  13. username = '%suser' % user_type
  14. user = User.objects.create_user(username=username, password='secret', is_staff=True)
  15. permission = Permission.objects.get(codename='%s_band' % user_type, content_type=content_type)
  16. user.user_permissions.add(permission)
  17. setattr(cls, username, user)
  18. def test_get_actions_respects_permissions(self):
  19. class MockRequest:
  20. pass
  21. class BandAdmin(admin.ModelAdmin):
  22. actions = ['custom_action']
  23. def custom_action(modeladmin, request, queryset):
  24. pass
  25. def has_custom_permission(self, request):
  26. return request.user.has_perm('%s.custom_band' % self.opts.app_label)
  27. ma = BandAdmin(Band, admin.AdminSite())
  28. mock_request = MockRequest()
  29. mock_request.GET = {}
  30. cases = [
  31. (None, self.viewuser, ['custom_action']),
  32. ('view', self.superuser, ['delete_selected', 'custom_action']),
  33. ('view', self.viewuser, ['custom_action']),
  34. ('add', self.adduser, ['custom_action']),
  35. ('change', self.changeuser, ['custom_action']),
  36. ('delete', self.deleteuser, ['delete_selected', 'custom_action']),
  37. ('custom', self.customuser, ['custom_action']),
  38. ]
  39. for permission, user, expected in cases:
  40. with self.subTest(permission=permission, user=user):
  41. if permission is None:
  42. if hasattr(BandAdmin.custom_action, 'allowed_permissions'):
  43. del BandAdmin.custom_action.allowed_permissions
  44. else:
  45. BandAdmin.custom_action.allowed_permissions = (permission,)
  46. mock_request.user = user
  47. actions = ma.get_actions(mock_request)
  48. self.assertEqual(list(actions.keys()), expected)