44from rest_framework .decorators import action
55from rest_framework .permissions import IsAuthenticated
66from rest_framework .response import Response
7+ from rest_framework import mixins
78
8- from .serializers import ChangeTaskListBoardSerializer , ChangeTaskOrderSerializer
9+ from drf_spectacular .utils import extend_schema , extend_schema_view , OpenApiParameter
10+
11+ from tasks .tasks .serializers import ChangeTaskListBoardSerializer , ChangeTaskOrderSerializer , SubTaskSerializer
912from boards .models import ListBoard , KanbanTaskOrder
10- from tasks .models import Todo , RecurrenceTask , Habit
13+ from tasks .models import Todo , RecurrenceTask , Habit , Subtask
1114from tasks .tasks .serializers import (TaskCreateSerializer ,
1215 TaskSerializer ,
1316 RecurrenceTaskSerializer ,
@@ -32,6 +35,18 @@ def get_serializer_class(self):
3235 return TaskCreateSerializer
3336 return TaskSerializer
3437
38+ def list (self , request , * args , ** kwargs ):
39+ """
40+ list all tasks of the authenticated
41+ user and send tags if those Todo too.
42+ """
43+ try :
44+ queryset = self .get_queryset ()
45+ serializer = TaskSerializer (queryset , many = True )
46+ return Response (serializer .data )
47+ except Exception as e :
48+ return Response ({'error' : str (e )}, status = status .HTTP_500_INTERNAL_SERVER_ERROR )
49+
3550 def create (self , request , * args , ** kwargs ):
3651 try :
3752 new_task_data = request .data
@@ -117,6 +132,73 @@ def change_task_list_board(self, request):
117132 return Response ({'error' : str (e )}, status = status .HTTP_500_INTERNAL_SERVER_ERROR )
118133
119134
135+ @extend_schema_view (
136+ list = extend_schema (
137+ parameters = [
138+ OpenApiParameter (name = 'parent_task' , description = 'Parent Task ID' , type = int ),
139+ ]
140+ )
141+ )
142+ class SubTaskViewset (viewsets .GenericViewSet ,
143+ mixins .CreateModelMixin ,
144+ mixins .DestroyModelMixin ,
145+ mixins .ListModelMixin ,
146+ mixins .UpdateModelMixin ):
147+ queryset = Subtask .objects .all ()
148+ permission_classes = (IsAuthenticated ,)
149+
150+ def get_serializer_class (self ):
151+ return SubTaskSerializer
152+
153+ def list (self , request , * args , ** kwargs ):
154+ """List only subtask of parent task."""
155+ try :
156+ parent_task = request .query_params .get ('parent_task' )
157+ if not parent_task :
158+ raise serializers .ValidationError ('parent_task is required.' )
159+ queryset = self .get_queryset ().filter (parent_task_id = parent_task )
160+ serializer = self .get_serializer (queryset , many = True )
161+ return Response (serializer .data )
162+
163+ except Exception as e :
164+ return Response ({'error' : str (e )}, status = status .HTTP_500_INTERNAL_SERVER_ERROR )
165+
166+ def create (self , request , * args , ** kwargs ):
167+ """Create a new subtask, point to some parent tasks."""
168+ try :
169+ serializer = self .get_serializer (data = request .data )
170+ serializer .is_valid (raise_exception = True )
171+ self .perform_create (serializer )
172+ return Response (serializer .data )
173+
174+ except Exception as e :
175+ return Response ({'error' : str (e )}, status = status .HTTP_500_INTERNAL_SERVER_ERROR )
176+
177+
178+ def destroy (self , request , * args , ** kwargs ):
179+ """Delete a subtask."""
180+ try :
181+ instance = self .get_object ()
182+ self .perform_destroy (instance )
183+ return Response (status = status .HTTP_204_NO_CONTENT )
184+
185+ except Exception as e :
186+ return Response ({'error' : str (e )}, status = status .HTTP_500_INTERNAL_SERVER_ERROR )
187+
188+
189+ def partial_update (self , request , * args , ** kwargs ):
190+ """Update a subtask."""
191+ try :
192+ instance = self .get_object ()
193+ serializer = self .get_serializer (instance , data = request .data , partial = True )
194+ serializer .is_valid (raise_exception = True )
195+ self .perform_update (serializer )
196+ return Response (serializer .data )
197+
198+ except Exception as e :
199+ return Response ({'error' : str (e )}, status = status .HTTP_500_INTERNAL_SERVER_ERROR )
200+
201+
120202class RecurrenceTaskViewSet (viewsets .ModelViewSet ):
121203 queryset = RecurrenceTask .objects .all ()
122204 serializer_class = RecurrenceTaskSerializer
0 commit comments