from rest_framework import viewsets from rest_framework.response import Response from rest_framework import status from .models import Task, SubTask, AssignedTask from .serializers import TaskSerializer, SubTaskSerializer, AssignedTaskSerializer from rest_framework.decorators import action from .caching import get_cached_tasks, get_cached_task_by_id, get_cached_tasks_by_status from django.core.cache import cache from .choices import TaskStatus from rest_framework.permissions import IsAuthenticated class TaskViewSet(viewsets.ModelViewSet): permission_classes = [IsAuthenticated] queryset = Task.objects.all() serializer_class = TaskSerializer def list(self, request, *args, **kwargs): status_param = request.query_params.get('status', None) if status_param: tasks = get_cached_tasks_by_status(status_param) else: tasks = get_cached_tasks() serializer = self.get_serializer(tasks, many=True) return Response(serializer.data) def retrieve(self, request, pk=None): task = get_cached_task_by_id(pk) serializer = self.get_serializer(task) return Response(serializer.data) @action(detail=True, methods=['put']) def update_status(self, request, pk=None): task = self.get_object() new_status = request.data.get('status') if not new_status: return Response({'error': 'Status is required.'}, status=status.HTTP_400_BAD_REQUEST) valid_statuses = [choice[0] for choice in TaskStatus.choices] if new_status not in valid_statuses: return Response({'error': f'Invalid status. Valid statuses: {valid_statuses}'}, status=status.HTTP_400_BAD_REQUEST) cache.delete(f"task_{task.id}") cache.delete(f"tasks_by_status_{task.status}") task.status = new_status task.save() return Response({'status': 'Status updated.'}) class SubTaskViewSet(viewsets.ModelViewSet): permission_classes = [IsAuthenticated] queryset = SubTask.objects.all() serializer_class = SubTaskSerializer class AssignedTaskViewSet(viewsets.ModelViewSet): permission_classes = [IsAuthenticated] queryset = AssignedTask.objects.all() serializer_class = AssignedTaskSerializer