Skip to content

Commit 9b9c788

Browse files
committed
Add views to complete the API and pass (almost) all tests
1 parent 38510e2 commit 9b9c788

File tree

2 files changed

+53
-8
lines changed

2 files changed

+53
-8
lines changed

manager/tasks/tests/test_people.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ def test_post(self):
3939
data={'name':'Ido', 'email': 'ido@gmail.com', 'favoriteProgrammingLanguage': 'Python'})
4040
self.assertEqual(response.status_code, 201)
4141
id = Person.objects.filter(name='Ido').get().id
42-
self.assertEqual(response.headers['Location'], f'/people/{id}')
43-
self.assertEqual(response.headers['x-Created-Id'], id)
42+
self.assertEqual(response.headers['Location'], f'people/{id}')
43+
self.assertEqual(response.headers['x-Created-Id'], str(id))
4444

4545
def test_post_400(self):
4646
response = self.client.post(reverse('person-list'),
@@ -105,8 +105,8 @@ def test_post_tasks_nested(self):
105105
data={'title':'a tour of c++', 'details':'details', 'dueDate':date.today(), 'status':'active'})
106106
self.assertEqual(response.status_code, 201)
107107
id = Task.objects.filter(title='a tour of c++').get().id
108-
self.assertEqual(response.headers['Location'], f'/tasks/{id}')
109-
self.assertEqual(response.headers['x-Created-Id'], id)
108+
self.assertEqual(response.headers['Location'], f'tasks/{id}')
109+
self.assertEqual(response.headers['x-Created-Id'], str(id))
110110

111111
def test_post_tasks_nested_400(self):
112112
response = self.client.post(reverse('person-tasks', args=[self.person.id]),

manager/tasks/views.py

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from django.shortcuts import render
1+
from functools import partial
22
from rest_framework import viewsets
33
from rest_framework.decorators import action
44
from rest_framework.response import Response
@@ -11,16 +11,61 @@ class TaskViewSet(viewsets.ModelViewSet):
1111
queryset = Task.objects.all()
1212
serializer_class = TaskSerializer
1313

14+
@action(detail=True, methods=['get', 'put'])
15+
def status(self, request, pk):
16+
try:
17+
task = Task.objects.filter(id=pk).get()
18+
except Task.DoesNotExist:
19+
return Response("{ id does not exist }", status=status.HTTP_404_NOT_FOUND)
20+
21+
if request.method == 'GET':
22+
return Response(f"{{ '{task.status}' }}")
23+
else:
24+
serializer = TaskSerializer(task, data=request.data, partial=True)
25+
if serializer.is_valid():
26+
return Response(status=status.HTTP_204_NO_CONTENT)
27+
else:
28+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
29+
30+
@action(detail=True, methods=['get', 'put'])
31+
def owner(self, request, pk):
32+
try:
33+
task = Task.objects.filter(id=pk).get()
34+
except Task.DoesNotExist:
35+
return Response("{ id does not exist }", status=status.HTTP_404_NOT_FOUND)
36+
37+
if request.method == 'GET':
38+
return Response(f"{{ '{task.ownerId}' }}")
39+
else:
40+
serializer = TaskSerializer(task, data=request.data, partial=True)
41+
if serializer.is_valid():
42+
return Response(status=status.HTTP_204_NO_CONTENT)
43+
else:
44+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
45+
46+
def create(self, request):
47+
serializer = TaskSerializer(data=request.data)
48+
if serializer.is_valid():
49+
task = serializer.save()
50+
return Response(headers={'Location':f'tasks/{task.id}', 'x-Created-Id':task.id}, status=status.HTTP_201_CREATED)
51+
else:
52+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
53+
54+
1455
class PersonViewSet(viewsets.ModelViewSet):
1556
queryset = Person.objects.all()
1657
serializer_class = PersonSerializer
1758

1859
@action(detail=True, methods=['get', 'post'])
1960
def tasks(self, request, pk):
61+
try:
62+
Person.objects.filter(id=pk).get()
63+
except Person.DoesNotExist:
64+
return Response("{ id does not exist }", status=status.HTTP_404_NOT_FOUND)
2065
if request.method == 'GET':
2166
person_tasks = Task.objects.filter(ownerId=pk)
2267
if person_tasks.count() < 1:
23-
return Response(data="{'Tasks not found'}", status=status.HTTP_404_NOT_FOUND)
68+
return Response(data="{'Tasks do not exist'}", status=status.HTTP_404_NOT_FOUND)
2469
serializer = TaskSerializer(person_tasks, many=True)
2570
return Response(serializer.data)
2671
else:
@@ -29,14 +74,14 @@ def tasks(self, request, pk):
2974
serializer = TaskSerializer(data=data)
3075
if serializer.is_valid():
3176
task = serializer.save()
32-
return Response(headers={'Location':'Raz', 'x-Created-Id':task.id}, status=status.HTTP_201_CREATED)
77+
return Response(headers={'Location':f'tasks/{task.id}', 'x-Created-Id':task.id}, status=status.HTTP_201_CREATED)
3378
else:
3479
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
3580

3681
def create(self, request):
3782
serializer = PersonSerializer(data=request.data)
3883
if serializer.is_valid():
3984
person = serializer.save()
40-
return Response(headers={'Location':'Raz', 'x-Created-Id':person.id}, status=status.HTTP_201_CREATED)
85+
return Response(headers={'Location':f'people/{person.id}', 'x-Created-Id':person.id}, status=status.HTTP_201_CREATED)
4186
else:
4287
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

0 commit comments

Comments
 (0)