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 = 'lennon@thebeatles.com'
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy