Skip to content

Commit bf9533a

Browse files
authored
Merge pull request #6286 from markddavidoff/patch-1
permissions must return a boolean to allow &/| operator comparison
2 parents fae7e91 + 1f13b6f commit bf9533a

File tree

2 files changed

+20
-13
lines changed

2 files changed

+20
-13
lines changed

rest_framework/permissions.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ class IsAuthenticated(BasePermission):
110110
"""
111111

112112
def has_permission(self, request, view):
113-
return request.user and request.user.is_authenticated
113+
return bool(request.user and request.user.is_authenticated)
114114

115115

116116
class IsAdminUser(BasePermission):
@@ -119,7 +119,7 @@ class IsAdminUser(BasePermission):
119119
"""
120120

121121
def has_permission(self, request, view):
122-
return request.user and request.user.is_staff
122+
return bool(request.user and request.user.is_staff)
123123

124124

125125
class IsAuthenticatedOrReadOnly(BasePermission):
@@ -128,7 +128,7 @@ class IsAuthenticatedOrReadOnly(BasePermission):
128128
"""
129129

130130
def has_permission(self, request, view):
131-
return (
131+
return bool(
132132
request.method in SAFE_METHODS or
133133
request.user and
134134
request.user.is_authenticated

tests/test_permissions.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import warnings
66

77
import django
8-
from django.contrib.auth.models import Group, Permission, User
8+
from django.contrib.auth.models import AnonymousUser, Group, Permission, User
99
from django.db import models
1010
from django.test import TestCase
1111
from django.urls import ResolverMatch
@@ -542,39 +542,46 @@ def test_permission_denied_for_object_with_custom_detail(self):
542542
self.assertEqual(detail, self.custom_message)
543543

544544

545-
class FakeUser:
546-
def __init__(self, auth=False):
547-
self.is_authenticated = auth
545+
class PermissionsCompositionTests(TestCase):
548546

547+
def setUp(self):
548+
self.username = 'john'
549+
self.email = '[email protected]'
550+
self.password = 'password'
551+
self.user = User.objects.create_user(
552+
self.username,
553+
self.email,
554+
self.password
555+
)
556+
self.client.login(username=self.username, password=self.password)
549557

550-
class PermissionsCompositionTests(TestCase):
551558
def test_and_false(self):
552559
request = factory.get('/1', format='json')
553-
request.user = FakeUser(auth=False)
560+
request.user = AnonymousUser()
554561
composed_perm = permissions.IsAuthenticated & permissions.AllowAny
555562
assert composed_perm().has_permission(request, None) is False
556563

557564
def test_and_true(self):
558565
request = factory.get('/1', format='json')
559-
request.user = FakeUser(auth=True)
566+
request.user = self.user
560567
composed_perm = permissions.IsAuthenticated & permissions.AllowAny
561568
assert composed_perm().has_permission(request, None) is True
562569

563570
def test_or_false(self):
564571
request = factory.get('/1', format='json')
565-
request.user = FakeUser(auth=False)
572+
request.user = AnonymousUser()
566573
composed_perm = permissions.IsAuthenticated | permissions.AllowAny
567574
assert composed_perm().has_permission(request, None) is True
568575

569576
def test_or_true(self):
570577
request = factory.get('/1', format='json')
571-
request.user = FakeUser(auth=True)
578+
request.user = self.user
572579
composed_perm = permissions.IsAuthenticated | permissions.AllowAny
573580
assert composed_perm().has_permission(request, None) is True
574581

575582
def test_several_levels(self):
576583
request = factory.get('/1', format='json')
577-
request.user = FakeUser(auth=True)
584+
request.user = self.user
578585
composed_perm = (
579586
permissions.IsAuthenticated &
580587
permissions.IsAuthenticated &

0 commit comments

Comments
 (0)