Skip to content

Commit 820bb0d

Browse files
author
Juan Benitez
committed
refactor: change views classes
1 parent 17eff4c commit 820bb0d

File tree

6 files changed

+23
-100
lines changed

6 files changed

+23
-100
lines changed

movies/models.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from django.db import models
22

3-
# Create Movie Model
3+
44
class Movie(models.Model):
55
title = models.CharField(max_length=100)
66
genre = models.CharField(max_length=100)
77
year = models.IntegerField()
8-
created_at = models.DateTimeField(auto_now_add=True) # When it was create
9-
updated_at = models.DateTimeField(auto_now=True) # When i was update
8+
created_at = models.DateTimeField(auto_now_add=True)
9+
updated_at = models.DateTimeField(auto_now=True)
1010
creator = models.ForeignKey('auth.User', related_name='movies', on_delete=models.CASCADE)
1111

1212

movies/pagination.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from rest_framework.pagination import PageNumberPagination
22

3+
34
class CustomPagination(PageNumberPagination):
45
page_size = 10
5-
page_size_query_param = 'page_size'
6+
page_size_query_param = 'page_size'

movies/permissions.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,3 @@ def has_object_permission(self, request, view, obj):
1515

1616
# Write permissions are only allowed to the creator of the movie
1717
return obj.creator == request.user
18-
19-
20-
class IsAuthenticated(permissions.BasePermission):
21-
"""
22-
Allows access only to authenticated users.
23-
"""
24-
def has_permission(self, request, view):
25-
message = 'You must be authenticated'
26-
is_it = bool(request.user and request.user.is_authenticated)
27-
if is_it:
28-
return is_it
29-
else:
30-
raise PermissionDenied(detail=message)

movies/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class Meta:
1111
fields = ('id', 'title', 'genre', 'year', 'creator')
1212

1313

14-
class UserSerializer(serializers.ModelSerializer): # create class to serializer usermodel
14+
class UserSerializer(serializers.ModelSerializer): # create class to serializer user model
1515
movies = serializers.PrimaryKeyRelatedField(many=True, queryset=Movie.objects.all())
1616

1717
class Meta:

movies/urls.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
1-
from django.urls import include, path, re_path
1+
from django.urls import path
22
from . import views
33

44

55
urlpatterns = [
6-
re_path(r'^api/v1/movies/(?P<pk>[0-9]+)$', # Url to get update or delete a movie
7-
views.get_delete_update_movie.as_view(),
8-
name='get_delete_update_movie'
9-
),
10-
path('api/v1/movies/', # urls list all and create new one
11-
views.get_post_movies.as_view(),
12-
name='get_post_movies'
13-
)
6+
path('', views.ListCreateMovieAPIView.as_view(), name='get_post_movies'),
7+
path('<int:pk>/', views.RetrieveUpdateDestroyMovieAPIView.as_view(), name='get_delete_update_movie'),
148
]

movies/views.py

Lines changed: 14 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,29 @@
1-
from rest_framework import status
2-
from rest_framework.response import Response
31
from rest_framework.generics import RetrieveUpdateDestroyAPIView, ListCreateAPIView
2+
from rest_framework.permissions import IsAuthenticated
43
from .models import Movie
5-
from .permissions import IsOwnerOrReadOnly, IsAuthenticated
4+
from .permissions import IsOwnerOrReadOnly
65
from .serializers import MovieSerializer
76
from .pagination import CustomPagination
87

9-
class get_delete_update_movie(RetrieveUpdateDestroyAPIView):
10-
serializer_class = MovieSerializer
11-
permission_classes = (IsAuthenticated, IsOwnerOrReadOnly,)
12-
13-
def get_queryset(self, pk):
14-
try:
15-
movie = Movie.objects.get(pk=pk)
16-
except Movie.DoesNotExist:
17-
content = {
18-
'status': 'Not Found'
19-
}
20-
return Response(content, status=status.HTTP_404_NOT_FOUND)
21-
return movie
228

23-
# Get a movie
24-
def get(self, request, pk):
9+
class ListCreateMovieAPIView(ListCreateAPIView):
2510

26-
movie = self.get_queryset(pk)
27-
serializer = MovieSerializer(movie)
28-
return Response(serializer.data, status=status.HTTP_200_OK)
29-
30-
# Update a movie
31-
def put(self, request, pk):
32-
33-
movie = self.get_queryset(pk)
11+
serializer_class = MovieSerializer
12+
queryset = Movie.objects.all()
13+
permission_classes = [IsAuthenticated]
14+
pagination_class = CustomPagination
3415

35-
if(request.user == movie.creator): # If creator is who makes request
36-
serializer = MovieSerializer(movie, data=request.data)
37-
if serializer.is_valid():
38-
serializer.save()
39-
return Response(serializer.data, status=status.HTTP_201_CREATED)
40-
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
41-
else:
42-
content = {
43-
'status': 'UNAUTHORIZED'
44-
}
45-
return Response(content, status=status.HTTP_401_UNAUTHORIZED)
16+
def perform_create(self, serializer):
17+
# Assign the user who created the movie
18+
serializer.save(creator=self.request.user)
4619

47-
# Delete a movie
48-
def delete(self, request, pk):
4920

50-
movie = self.get_queryset(pk)
21+
class RetrieveUpdateDestroyMovieAPIView(RetrieveUpdateDestroyAPIView):
22+
serializer_class = MovieSerializer
23+
queryset = Movie.objects.all()
24+
permission_classes = [IsAuthenticated, IsOwnerOrReadOnly]
5125

52-
if(request.user == movie.creator): # If creator is who makes request
53-
movie.delete()
54-
content = {
55-
'status': 'NO CONTENT'
56-
}
57-
return Response(content, status=status.HTTP_204_NO_CONTENT)
58-
else:
59-
content = {
60-
'status': 'UNAUTHORIZED'
61-
}
62-
return Response(content, status=status.HTTP_401_UNAUTHORIZED)
63-
6426

65-
class get_post_movies(ListCreateAPIView):
66-
serializer_class = MovieSerializer
67-
permission_classes = (IsAuthenticated,)
68-
pagination_class = CustomPagination
69-
70-
def get_queryset(self):
71-
movies = Movie.objects.all()
72-
return movies
7327

74-
# Get all movies
75-
def get(self, request):
76-
movies = self.get_queryset()
77-
paginate_queryset = self.paginate_queryset(movies)
78-
serializer = self.serializer_class(paginate_queryset, many=True)
79-
return self.get_paginated_response(serializer.data)
8028

81-
# Create a new movie
82-
def post(self, request):
83-
serializer = MovieSerializer(data=request.data)
84-
if serializer.is_valid():
85-
serializer.save(creator=request.user)
86-
return Response(serializer.data, status=status.HTTP_201_CREATED)
87-
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
8829

0 commit comments

Comments
 (0)