1. """
    
  2. A custom AdminSite for AdminViewPermissionsTest.test_login_has_permission().
    
  3. """
    
  4. from django.contrib import admin
    
  5. from django.contrib.auth import get_permission_codename
    
  6. from django.contrib.auth.forms import AuthenticationForm
    
  7. from django.core.exceptions import ValidationError
    
  8. 
    
  9. from . import admin as base_admin
    
  10. from . import models
    
  11. 
    
  12. PERMISSION_NAME = "admin_views.%s" % get_permission_codename(
    
  13.     "change", models.Article._meta
    
  14. )
    
  15. 
    
  16. 
    
  17. class PermissionAdminAuthenticationForm(AuthenticationForm):
    
  18.     def confirm_login_allowed(self, user):
    
  19.         if not user.is_active or not (user.is_staff or user.has_perm(PERMISSION_NAME)):
    
  20.             raise ValidationError("permission denied")
    
  21. 
    
  22. 
    
  23. class HasPermissionAdmin(admin.AdminSite):
    
  24.     login_form = PermissionAdminAuthenticationForm
    
  25. 
    
  26.     def has_permission(self, request):
    
  27.         return request.user.is_active and (
    
  28.             request.user.is_staff or request.user.has_perm(PERMISSION_NAME)
    
  29.         )
    
  30. 
    
  31. 
    
  32. site = HasPermissionAdmin(name="has_permission_admin")
    
  33. site.register(models.Article, base_admin.ArticleAdmin)