Skip to content

Commit 428f0cc

Browse files
committed
added completion toggle persistence
1 parent 076bd0c commit 428f0cc

File tree

4 files changed

+21
-7
lines changed

4 files changed

+21
-7
lines changed

client/src/pages/[id]/tasks.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export default function TasksPage() {
6767

6868
try {
6969
const response = await fetch(
70-
`http://localhost:8000/api/planner/tasks/${id}/`,
70+
`http://localhost:8000/api/planner/tasks/${id}/toggle_complete/`,
7171
{
7272
method: "PATCH",
7373
headers: {

server/task_planner/serializers.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,9 @@ def create(self, validated_data):
6767

6868
task.save()
6969
task.refresh_from_db()
70-
return Task.objects.get(id=task.id)
70+
return Task.objects.get(id=task.id)
71+
72+
class TaskCompleteSerializer(serializers.ModelSerializer):
73+
class Meta:
74+
model = Task
75+
fields = ["completed"]

server/task_planner/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@
77
path("topic/", views.TopicList.as_view(), name="topic-list"),
88
path("time/", views.TimeList.as_view(), name="time-list"),
99
path("tasks/", views.TaskViewSet.as_view({'get': 'list', 'post': 'create'}), name="task-viewset"),
10-
path("tasks/<int:pk>/", views.TaskViewSet.as_view({'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'}), name="task-detail"),
10+
path("tasks/<int:pk>/", views.TaskViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}), name="task-detail"),
11+
path("tasks/<int:pk>/toggle_complete/", views.TaskViewSet.as_view({'patch': 'toggle_complete'}), name="task-toggle-complete"),
1112
]

server/task_planner/views.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
from rest_framework.views import APIView
77
from rest_framework.viewsets import ModelViewSet
88
from rest_framework import status
9+
from rest_framework.decorators import action
910
#from rest_framework.permissions import IsAuthenticated
1011

1112
from .models import Task, Topic, Time
12-
from .serializers import TaskReadSerializer, TaskWriteSerializer, TopicReadSerializer, TimeReadSerializer
13+
from .serializers import TaskReadSerializer, TaskWriteSerializer, TopicReadSerializer, TimeReadSerializer, TaskCompleteSerializer
1314

1415

1516
# Create your views here.
@@ -61,7 +62,6 @@ def create(self, request, *args, **kwargs):
6162
write_serializer = TaskWriteSerializer(data=request.data)
6263
write_serializer.is_valid(raise_exception=True)
6364

64-
# 👇 THIS is what perform_create used to do
6565
user_id = request.data.get("user_id")
6666
if user_id:
6767
task = write_serializer.save(user_id=user_id)
@@ -70,6 +70,14 @@ def create(self, request, *args, **kwargs):
7070
else:
7171
raise ValidationError({"user_id": "Provide user_id or authenticate."})
7272

73-
# Return READ shape
7473
read_serializer = TaskReadSerializer(task)
75-
return Response(read_serializer.data, status=status.HTTP_201_CREATED)
74+
return Response(read_serializer.data, status=status.HTTP_201_CREATED)
75+
76+
@action(detail=True, methods=['patch'])
77+
def toggle_complete(self, request, pk=None):
78+
task = self.get_object()
79+
serializer = TaskCompleteSerializer(task, data=request.data, partial=True)
80+
serializer.is_valid(raise_exception=True)
81+
serializer.save()
82+
read_serializer = TaskReadSerializer(task)
83+
return Response(read_serializer.data)

0 commit comments

Comments
 (0)