Skip to content

Commit 064889a

Browse files
committed
Make permissions class more modular
1 parent 67b7137 commit 064889a

File tree

2 files changed

+28
-22
lines changed

2 files changed

+28
-22
lines changed

readthedocs/api/v3/permissions.py

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,37 @@
1-
from rest_framework.permissions import IsAuthenticated
1+
from rest_framework.permissions import BasePermission
22

33

4-
class PublicDetailPrivateListing(IsAuthenticated):
4+
class PublicDetailPrivateListing(BasePermission):
55

66
"""
77
Permission class for our custom use case.
88
99
* Always give permission for a ``detail`` request
1010
* Only give permission for ``listing`` request if user is admin of the project
11+
"""
12+
13+
def has_permission(self, request, view):
14+
if view.detail:
15+
return True
16+
17+
project = view._get_parent_project()
18+
if view.has_admin_permission(request.user, project):
19+
return True
20+
21+
22+
class ListCreateProject(BasePermission):
23+
24+
"""
25+
Permission class to grant projects listing and project creation.
26+
1127
* Allow access to ``/projects`` (user's projects listing)
1228
"""
1329

1430
def has_permission(self, request, view):
15-
is_authenticated = super().has_permission(request, view)
16-
if is_authenticated:
17-
if view.basename == 'projects' and any([
18-
view.action == 'list',
19-
view.action == 'create', # used to create Form in BrowsableAPIRenderer
20-
view.action is None, # needed for BrowsableAPIRenderer
21-
]):
22-
# hitting ``/projects/``, allowing
23-
return True
24-
25-
if view.detail:
26-
return True
27-
28-
project = view._get_parent_project()
29-
if view.has_admin_permission(request.user, project):
30-
return True
31-
32-
return False
31+
if view.basename == 'projects' and any([
32+
view.action == 'list',
33+
view.action == 'create', # used to create Form in BrowsableAPIRenderer
34+
view.action is None, # needed for BrowsableAPIRenderer
35+
]):
36+
# hitting ``/projects/``, allowing
37+
return True

readthedocs/api/v3/views.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
UpdateModelMixin,
1212
)
1313
from rest_framework.pagination import LimitOffsetPagination
14+
from rest_framework.permissions import IsAuthenticated
1415
from rest_framework.renderers import BrowsableAPIRenderer
1516
from rest_framework.response import Response
1617
from rest_framework.throttling import AnonRateThrottle, UserRateThrottle
@@ -25,7 +26,7 @@
2526

2627
from .filters import BuildFilter, ProjectFilter, VersionFilter
2728
from .mixins import ProjectQuerySetMixin
28-
from .permissions import PublicDetailPrivateListing
29+
from .permissions import PublicDetailPrivateListing, ListCreateProject
2930
from .renderers import AlphabeticalSortedJSONRenderer
3031
from .serializers import (
3132
BuildCreateSerializer,
@@ -54,7 +55,7 @@ class APIv3Settings:
5455
# Using only ``TokenAuthentication`` for now, so we can give access to
5556
# specific carefully selected users only
5657
authentication_classes = (TokenAuthentication,)
57-
permission_classes = (PublicDetailPrivateListing,)
58+
permission_classes = (IsAuthenticated & (ListCreateProject | PublicDetailPrivateListing),)
5859

5960
pagination_class = LimitOffsetPagination
6061
LimitOffsetPagination.default_limit = 10

0 commit comments

Comments
 (0)