Skip to content

Commit 76025c9

Browse files
author
Juan Benitez
committed
Merge branch 'refactor'
2 parents 4606467 + 6c9d8cf commit 76025c9

File tree

5 files changed

+84
-52
lines changed

5 files changed

+84
-52
lines changed

.vscode/settings.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"python.linting.pylintEnabled": true,
3+
"python.pythonPath": "env\\Scripts\\python.exe"
4+
}

movies/permissions.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from rest_framework import permissions
2+
from rest_framework.exceptions import PermissionDenied
23

34

45
class IsOwnerOrReadOnly(permissions.BasePermission):
@@ -13,4 +14,17 @@ def has_object_permission(self, request, view, obj):
1314
return True
1415

1516
# Write permissions are only allowed to the creator of the movie
16-
return obj.creator == request.user
17+
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: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@
33
from django.contrib.auth.models import User
44

55

6-
7-
class MovieSerializer(serializers.ModelSerializer): # create classs to serializer model
6+
class MovieSerializer(serializers.ModelSerializer): # create class to serializer model
87
creator = serializers.ReadOnlyField(source='creator.username')
98

109
class Meta:
1110
model = Movie
1211
fields = ('title', 'genre', 'year', 'creator')
1312

1413

15-
class UserSerializer(serializers.ModelSerializer): #create class to serealizer usermodel
14+
class UserSerializer(serializers.ModelSerializer): # create class to serializer usermodel
1615
movies = serializers.PrimaryKeyRelatedField(many=True, queryset=Movie.objects.all())
1716

1817
class Meta:

movies/urls.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
from django.conf.urls import url
1+
from django.urls import include, path, re_path
22
from . import views
33

44

55
urlpatterns = [
6-
url(r'^api/v1/movies/(?P<pk>[0-9]+)$', # urls with details i.e /movies/(1-9)
7-
views.get_delete_update_movie,
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(),
88
name='get_delete_update_movie'
99
),
10-
url(
11-
r'^api/v1/movies/$', # urls list all and create new one
12-
views.get_post_movies,
10+
path('api/v1/movies/', # urls list all and create new one
11+
views.get_post_movies.as_view(),
1312
name='get_post_movies'
1413
)
1514
]

movies/views.py

Lines changed: 58 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,83 @@
1-
from rest_framework.decorators import api_view, permission_classes
2-
from rest_framework.permissions import IsAuthenticated
3-
from rest_framework.response import Response
41
from rest_framework import status
5-
from rest_framework.parsers import JSONParser
2+
from rest_framework.response import Response
3+
from rest_framework.generics import RetrieveUpdateDestroyAPIView, ListCreateAPIView
64
from .models import Movie
5+
from .permissions import IsOwnerOrReadOnly, IsAuthenticated
76
from .serializers import MovieSerializer
8-
from .permissions import IsOwnerOrReadOnly
97

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

11-
@api_view(['GET', 'DELETE', 'PUT']) # Methods Allowed
12-
@permission_classes((IsAuthenticated, IsOwnerOrReadOnly,)) # Pemissions, Only Authenticated user
13-
def get_delete_update_movie(request, pk): #pk es PrimaryKey(Id)
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+
# Get a movie
22+
def get(self, request, pk):
2123

22-
# details a sinlge movie
23-
if request.method == 'GET':
24+
movie = self.get_queryset(pk)
2425
serializer = MovieSerializer(movie)
25-
return Response(serializer.data)
26-
# delete a movie
27-
elif request.method == 'DELETE':
26+
return Response(serializer.data, status=status.HTTP_200_OK)
27+
28+
# Update a movie
29+
def put(self, request, pk):
30+
31+
movie = self.get_queryset(pk)
32+
2833
if(request.user == movie.creator): # If creator is who makes request
29-
movie.delete()
30-
content = {
31-
'status': 'NO CONTENT'
32-
}
33-
return Response(content, status=status.HTTP_204_NO_CONTENT)
34+
serializer = MovieSerializer(movie, data=request.data)
35+
if serializer.is_valid():
36+
serializer.save()
37+
return Response(serializer.data, status=status.HTTP_201_CREATED)
38+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
3439
else:
3540
content = {
3641
'status': 'UNAUTHORIZED'
3742
}
3843
return Response(content, status=status.HTTP_401_UNAUTHORIZED)
39-
# update a movie
40-
elif request.method == 'PUT':
44+
45+
# Delete a movie
46+
def delete(self, request, pk):
47+
48+
movie = self.get_queryset(pk)
49+
4150
if(request.user == movie.creator): # If creator is who makes request
42-
serializer = MovieSerializer(movie, data=request.data)
43-
if serializer.is_valid():
44-
serializer.save()
45-
return Response(serializer.data, status=status.HTTP_201_CREATED)
46-
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
51+
movie.delete()
52+
content = {
53+
'status': 'NO CONTENT'
54+
}
55+
return Response(content, status=status.HTTP_204_NO_CONTENT)
4756
else:
4857
content = {
4958
'status': 'UNAUTHORIZED'
5059
}
5160
return Response(content, status=status.HTTP_401_UNAUTHORIZED)
61+
62+
63+
class get_post_movies(ListCreateAPIView):
64+
serializer_class = MovieSerializer
65+
#permission_classes = (IsAuthenticated,)
66+
# Get all movies
67+
68+
def get_queryset(self):
69+
movies = Movie.objects.all()
70+
return movies
71+
72+
def get(self, request):
5273

74+
movies = self.get_queryset()
75+
serializer = MovieSerializer(movies, many=True)
76+
return Response(serializer.data, status=status.HTTP_200_OK)
5377

54-
@api_view(['GET', 'POST'])
55-
@permission_classes((IsAuthenticated, ))
56-
def get_post_movies(request):
57-
# get all movies
58-
if request.method == 'GET':
59-
puppies = Movie.objects.all()
60-
serializer = MovieSerializer(puppies, many=True)
61-
return Response(serializer.data)
78+
# Create a new movie
79+
def post(self, request):
6280

63-
# create a new movie
64-
elif request.method == 'POST':
6581
serializer = MovieSerializer(data=request.data)
6682
if serializer.is_valid():
6783
serializer.save(creator=request.user)

0 commit comments

Comments
 (0)