Add subtask api

This commit is contained in:
sosokker 2023-11-28 00:33:39 +07:00
parent 2b013cda45
commit d3a8c90c30
3 changed files with 72 additions and 5 deletions

View File

@ -1,7 +1,7 @@
from rest_framework import serializers from rest_framework import serializers
from users.models import CustomUser from users.models import CustomUser
from boards.models import ListBoard from boards.models import ListBoard
from tasks.models import Todo, RecurrenceTask, Habit from tasks.models import Todo, RecurrenceTask, Habit, Subtask
class TaskSerializer(serializers.ModelSerializer): class TaskSerializer(serializers.ModelSerializer):
class Meta: class Meta:
@ -97,4 +97,14 @@ class HabitTaskSerializer(serializers.ModelSerializer):
class HabitTaskCreateSerializer(serializers.ModelSerializer): class HabitTaskCreateSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Habit model = Habit
exclude = ('tags',) exclude = ('tags',)
class SubTaskSerializer(serializers.ModelSerializer):
class Meta:
model = Subtask
fields = '__all__'
def create(self, validated_data):
# Create a new task with validated data
return Todo.objects.create(**validated_data)

View File

@ -4,10 +4,13 @@ from rest_framework import viewsets, status, serializers
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import mixins
from .serializers import ChangeTaskListBoardSerializer, ChangeTaskOrderSerializer from drf_spectacular.utils import extend_schema, extend_schema_view, OpenApiParameter
from tasks.tasks.serializers import ChangeTaskListBoardSerializer, ChangeTaskOrderSerializer, SubTaskSerializer
from boards.models import ListBoard, KanbanTaskOrder from boards.models import ListBoard, KanbanTaskOrder
from tasks.models import Todo, RecurrenceTask, Habit from tasks.models import Todo, RecurrenceTask, Habit, Subtask
from tasks.tasks.serializers import (TaskCreateSerializer, from tasks.tasks.serializers import (TaskCreateSerializer,
TaskSerializer, TaskSerializer,
RecurrenceTaskSerializer, RecurrenceTaskSerializer,
@ -117,6 +120,59 @@ class TodoViewSet(viewsets.ModelViewSet):
return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@extend_schema_view(
list=extend_schema(
parameters=[
OpenApiParameter(name='parent_task', description='Parent Task ID', type=int),
]
)
)
class SubTaskViewset(viewsets.GenericViewSet,
mixins.CreateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin):
queryset = Subtask.objects.all()
permission_classes = (IsAuthenticated,)
def get_serializer_class(self):
return SubTaskSerializer
def list(self, request, *args, **kwargs):
"""List only subtask of parent task."""
try:
parent_task = request.query_params.get('parent_task')
if not parent_task:
raise serializers.ValidationError('parent_task is required.')
queryset = self.get_queryset().filter(parent_task_id=parent_task)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
except Exception as e:
return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
def create(self, request, *args, **kwargs):
"""Create a new subtask, point to some parent tasks."""
try:
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
return Response(serializer.data)
except Exception as e:
return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
def destroy(self, request, *args, **kwargs):
"""Delete a subtask."""
try:
instance = self.get_object()
self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT)
except Exception as e:
return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
class RecurrenceTaskViewSet(viewsets.ModelViewSet): class RecurrenceTaskViewSet(viewsets.ModelViewSet):
queryset = RecurrenceTask.objects.all() queryset = RecurrenceTask.objects.all()
serializer_class = RecurrenceTaskSerializer serializer_class = RecurrenceTaskSerializer

View File

@ -3,7 +3,7 @@ from django.urls import path, include
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
from tasks.api import GoogleCalendarEventViewset from tasks.api import GoogleCalendarEventViewset
from tasks.tasks.views import TodoViewSet, RecurrenceTaskViewSet, HabitTaskViewSet from tasks.tasks.views import TodoViewSet, RecurrenceTaskViewSet, HabitTaskViewSet, SubTaskViewset
from tasks.misc.views import TagViewSet from tasks.misc.views import TagViewSet
@ -13,6 +13,7 @@ router.register(r'daily', RecurrenceTaskViewSet)
router.register(r'habit', HabitTaskViewSet) router.register(r'habit', HabitTaskViewSet)
router.register(r'tags', TagViewSet) router.register(r'tags', TagViewSet)
router.register(r'calendar-events', GoogleCalendarEventViewset, basename='calendar-events') router.register(r'calendar-events', GoogleCalendarEventViewset, basename='calendar-events')
router.register(r'subtasks', SubTaskViewset, basename='subtasks')
urlpatterns = [ urlpatterns = [
path('', include(router.urls)), path('', include(router.urls)),