Skip to content

Commit 6f372fd

Browse files
committed
Add authorization to CRUD views
1 parent c05d1b6 commit 6f372fd

File tree

6 files changed

+115
-3
lines changed

6 files changed

+115
-3
lines changed

api/models/prompt.py

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from django.db import models
2+
from django.contrib.auth import get_user_model
3+
4+
class Prompt(models.Model):
5+
"""Prompt model"""
6+
content = models.CharField(max_length=100)
7+
created_at = models.DateTimeField(auto_now_add=True)
8+
updated_at = models.DateTimeField(auto_now=True)
9+
owner = models.ForeignKey(
10+
get_user_model(),
11+
on_delete=models.CASCADE
12+
)
13+
14+
def __str__(self):
15+
"""Return a string representation of a prompt"""
16+
return f'{self.content}'
17+
18+
def as_dict(self):
19+
"""Return a dictionary representation of a prompt"""
20+
return {
21+
'id': self.id,
22+
'content': self.content,
23+
'created_at': self.created_at,
24+
'updated_at': self.updated_at
25+
}

api/urls.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99
path('sign-up/', SignUp.as_view(), name='sign-up'),
1010
path('sign-in/', SignIn.as_view(), name='sign-in'),
1111
path('sign-out/', SignOut.as_view(), name='sign-out'),
12-
path('change-pw/', ChangePassword.as_view(), name='change-pw')
12+
path('change-pw/', ChangePassword.as_view(), name='change-pw'),
1313
]

api/views/prompt_views.py

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from django.shortcuts import get_object_or_404
2+
from rest_framework.views import APIView
3+
from rest_framework.response import Response
4+
from rest_framework import generics, status
5+
from ..models.prompt import Prompt
6+
from ..serializers import PromptSerializer
7+
# from .serializers import PromptReadSerializer
8+
9+
from rest_framework.permissions import IsAuthenticated
10+
from rest_framework.exceptions import PermissionDenied
11+
12+
13+
# from django.http import JsonResponse
14+
15+
class Prompts(generics.ListCreateAPIView):
16+
permission_classes=(IsAuthenticated,)
17+
serializer_class=PromptSerializer
18+
19+
def get(self, request):
20+
"""Index Request"""
21+
# prompts = Prompt.objects.all()
22+
prompts = Prompt.objects.filter(owner=request.user.id)
23+
data = PromptSerializer(prompts, many=True).data
24+
return Response({"prompt": data})
25+
# prompts = Prompt.objects.filter(owner=request.user.id)
26+
27+
def post(self, request):
28+
"""Create a Prompt"""
29+
request.data['prompt']['owner'] = request.user.id
30+
serializer = PromptSerializer(data=request.data['prompt'])
31+
if serializer.is_valid():
32+
serializer.save()
33+
return Response(serializer.data, status=status.HTTP_201_CREATED)
34+
else:
35+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
36+
37+
38+
class PromptDetail(APIView):
39+
permission_classes=(IsAuthenticated,)
40+
def get(self, request, pk):
41+
"""Show one Prompt"""
42+
prompt = get_object_or_404(Prompt, pk=pk)
43+
44+
if not request.user.id == prompt.owner.id:
45+
raise PermissionDenied('Unauthorized, you do not own this prompt')
46+
47+
data = PromptSerializer(prompt).data
48+
return Response({ 'prompt': data })
49+
50+
def patch(self, request, pk):
51+
"""Update a Prompt"""
52+
print('request: ', request.data)
53+
prompt = get_object_or_404(Prompt, pk=pk)
54+
print('prompt: ', prompt)
55+
ms = PromptSerializer(prompt, data=request.data['prompt'], partial=True)
56+
if ms.is_valid():
57+
ms.save()
58+
print('ms.data: ', ms.data)
59+
return Response(ms.data)
60+
return Response(ms.errors, status=status.HTTP_400_BAD_REQUEST)
61+
62+
def delete(self, request, pk):
63+
"""Delete Request"""
64+
prompt = get_object_or_404(Prompt, pk=pk)
65+
prompt.delete()
66+
return Response(status=status.HTTP_204_NO_CONTENT)

curl-scripts/prompts/create.sh

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/bin/bash
2+
3+
curl "http://localhost:8000/prompt/" \
4+
--include \
5+
--request POST \
6+
--header "Content-Type: application/json" \
7+
--header "Authorization: Token ${TOKEN}" \
8+
--data '{
9+
"prompt": {
10+
"content": "'"${CONTENT}"'"
11+
}
12+
}'
13+
14+
echo

prompt/serializers.py

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from rest_framework import serializers
22
from .models import Prompt
3+
from django.contrib.auth import get_user_model
34

45
class PromptSerializer(serializers.ModelSerializer):
56
class Meta:

prompt/views.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# from django.http import JsonResponse
1414

1515
class Prompts(APIView):
16-
permission_classes=()
16+
permission_classes=(IsAuthenticated,)
1717
serializer_class=PromptSerializer
1818

1919
def get(self, request):
@@ -25,6 +25,7 @@ def get(self, request):
2525

2626
def post(self, request):
2727
"""Create a Prompt"""
28+
request.data['prompt']['owner'] = request.user.id
2829
serializer = PromptSerializer(data=request.data['prompt'])
2930
if serializer.is_valid():
3031
serializer.save()
@@ -41,7 +42,8 @@ def get(self, request, pk):
4142

4243
if not request.user.id == prompt.owner.id:
4344
raise PermissionDenied('Unauthorized, you do not own this prompt')
44-
45+
print('request.user.id: ', request.user.id)
46+
print('prompt.owner.id: ', prompt.owner.id)
4547
data = PromptSerializer(prompt).data
4648
return Response({ 'prompt': data })
4749

@@ -60,5 +62,9 @@ def patch(self, request, pk):
6062
def delete(self, request, pk):
6163
"""Delete Request"""
6264
prompt = get_object_or_404(Prompt, pk=pk)
65+
if not request.user.id == prompt.owner.id:
66+
raise PermissionDenied('Unauthorized, you do not own this prompt')
67+
print('request.user.id: ', request.user.id)
68+
print('prompt.owner.id: ', prompt.owner.id)
6369
prompt.delete()
6470
return Response(status=status.HTTP_204_NO_CONTENT)

0 commit comments

Comments
 (0)