Skip to content

Commit

Permalink
create IsAdminOrIfAuthenticatedReadOnly permissions for views & add i…
Browse files Browse the repository at this point in the history
…t to views
  • Loading branch information
Viesich committed Nov 13, 2024
1 parent b969085 commit 07e84ab
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 35 deletions.
10 changes: 3 additions & 7 deletions cinema/permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,6 @@

class IsAdminOrIfAuthenticatedReadOnly(BasePermission):
def has_permission(self, request, view):
if request.method in ["GET", "HEAD", "OPTIONS"]:
return bool(
request.method in
SAFE_METHODS
and request.user
and request.user.is_authenticated
) or (request.user and request.user.is_staff)
if request.method in SAFE_METHODS and request.user.is_authenticated:
return True
return bool(request.user and request.user.is_staff)
54 changes: 26 additions & 28 deletions cinema/views.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
from datetime import datetime

from django.db.models import F, Count

from rest_framework import viewsets
from rest_framework.authentication import TokenAuthentication
from rest_framework.pagination import PageNumberPagination
from rest_framework.permissions import IsAuthenticated, IsAdminUser
from rest_framework.permissions import IsAdminUser, AllowAny, IsAuthenticated
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
from rest_framework.viewsets import GenericViewSet

from cinema.models import Genre, Actor, CinemaHall, Movie, MovieSession, Order
from cinema.permissions import IsAdminOrIfAuthenticatedReadOnly
Expand All @@ -23,40 +24,43 @@
)


class GenreViewSet(viewsets.ModelViewSet):
class OrderPagination(PageNumberPagination):
page_size = 10
max_page_size = 100


class GenreViewSet(ListModelMixin, CreateModelMixin, GenericViewSet):
queryset = Genre.objects.all()
serializer_class = GenreSerializer
permission_classes = (IsAdminUser(), )

def get_permissions(self):
if self.action in ("list", "create"):
return (IsAdminOrIfAuthenticatedReadOnly(), )
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAdminOrIfAuthenticatedReadOnly, )


class ActorViewSet(viewsets.ModelViewSet):
class ActorViewSet(ListModelMixin, CreateModelMixin, GenericViewSet):
queryset = Actor.objects.all()
serializer_class = ActorSerializer
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAdminOrIfAuthenticatedReadOnly, )


class CinemaHallViewSet(viewsets.ModelViewSet):
class CinemaHallViewSet(ListModelMixin, CreateModelMixin, GenericViewSet):
queryset = CinemaHall.objects.all()
serializer_class = CinemaHallSerializer
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAdminOrIfAuthenticatedReadOnly, )


class MovieViewSet(viewsets.ModelViewSet):
class MovieViewSet(ListModelMixin, CreateModelMixin, RetrieveModelMixin, GenericViewSet):
queryset = Movie.objects.prefetch_related("genres", "actors")
serializer_class = MovieSerializer
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAdminOrIfAuthenticatedReadOnly, )

@staticmethod
def _params_to_ints(qs):
"""Converts a list of string IDs to a list of integers"""
return [int(str_id) for str_id in qs.split(",")]

def get_queryset(self):
"""Retrieve the movies with filters"""
title = self.request.query_params.get("title")
genres = self.request.query_params.get("genres")
actors = self.request.query_params.get("actors")
Expand All @@ -79,10 +83,8 @@ def get_queryset(self):
def get_serializer_class(self):
if self.action == "list":
return MovieListSerializer

if self.action == "retrieve":
return MovieDetailSerializer

return MovieSerializer


Expand All @@ -97,6 +99,7 @@ class MovieSessionViewSet(viewsets.ModelViewSet):
)
)
serializer_class = MovieSessionSerializer
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAdminOrIfAuthenticatedReadOnly, )

def get_queryset(self):
Expand All @@ -117,34 +120,29 @@ def get_queryset(self):
def get_serializer_class(self):
if self.action == "list":
return MovieSessionListSerializer

if self.action == "retrieve":
return MovieSessionDetailSerializer

return MovieSessionSerializer


class OrderPagination(PageNumberPagination):
page_size = 10
max_page_size = 100


class OrderViewSet(viewsets.ModelViewSet):
class OrderViewSet(ListModelMixin, CreateModelMixin, GenericViewSet):
queryset = Order.objects.prefetch_related(
"tickets__movie_session__movie", "tickets__movie_session__cinema_hall"
)
serializer_class = OrderSerializer
pagination_class = OrderPagination
permission_classes = (IsAuthenticated, )
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAdminOrIfAuthenticatedReadOnly, )

def get_queryset(self):
return Order.objects.filter(user=self.request.user)

def get_serializer_class(self):
if self.action == "list":
return OrderListSerializer

return OrderSerializer

def perform_create(self, serializer):
serializer.save(user=self.request.user)
def get_permissions(self):
if self.action == "create":
return [AllowAny()]
return [IsAdminOrIfAuthenticatedReadOnly()]

0 comments on commit 07e84ab

Please sign in to comment.