Use ModelViewset for Todo and Add some fields before validate

This commit is contained in:
sosokker 2023-11-07 03:23:20 +07:00
parent 5299fb2eb7
commit a403e45f9f
3 changed files with 19 additions and 36 deletions

View File

@ -31,6 +31,10 @@ class GoogleCalendarEventViewset(viewsets.ViewSet):
for event in events.get('items', []): for event in events.get('items', []):
if event.get('recurringEventId'): if event.get('recurringEventId'):
continue continue
event['start_datetime'] = event.get('start').get('dateTime')
event['end_datetime'] = event.get('end').get('dateTime')
event.pop('start')
event.pop('end')
try: try:
task = Todo.objects.get(google_calendar_id=event['id']) task = Todo.objects.get(google_calendar_id=event['id'])
serializer = TodoUpdateSerializer(instance=task, data=event) serializer = TodoUpdateSerializer(instance=task, data=event)

View File

@ -1,37 +1,16 @@
from rest_framework import status from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.generics import CreateAPIView, RetrieveAPIView, RetrieveUpdateAPIView, DestroyAPIView
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from ..models import Todo from tasks.models import Todo
from .serializers import TaskCreateSerializer, TaskGeneralSerializer from .serializers import TaskCreateSerializer, TaskGeneralSerializer
class TaskCreateView(CreateAPIView):
queryset = Todo.objects.all()
serializer_class = TaskCreateSerializer
permission_classes = [IsAuthenticated]
def create(self, request, *args, **kwargs): class TodoViewSet(viewsets.ModelViewSet):
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
self.perform_create(serializer)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class TaskRetrieveView(RetrieveAPIView):
queryset = Todo.objects.all() queryset = Todo.objects.all()
serializer_class = TaskGeneralSerializer serializer_class = TaskGeneralSerializer
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
def get_serializer_class(self):
class TaskUpdateView(RetrieveUpdateAPIView): # Can't add ManytoMany at creation time (Tags)
queryset = Todo.objects.all() if self.action == 'create':
serializer_class = TaskGeneralSerializer return TaskCreateSerializer
permission_classes = [IsAuthenticated] return TaskGeneralSerializer
class TaskDeleteView(DestroyAPIView):
queryset = Todo.objects.all()
permission_classes = [IsAuthenticated]

View File

@ -1,17 +1,17 @@
from django.urls import path, include from django.urls import path, include
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
from .api import GoogleCalendarEventViewset
from .tasks.views import TaskCreateView, TaskRetrieveView, TaskUpdateView, TaskDeleteView from tasks.api import GoogleCalendarEventViewset
from .misc.views import TagViewSet from tasks.tasks.views import TodoViewSet
from tasks.misc.views import TagViewSet
router = DefaultRouter() router = DefaultRouter()
router.register(r'todo', TodoViewSet)
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')
urlpatterns = [ urlpatterns = [
path('', include(router.urls)), path('', include(router.urls)),
path('tasks/create/', TaskCreateView.as_view(), name="add-task"),
path('tasks/<int:pk>/', TaskRetrieveView.as_view(), name='retrieve-task'),
path('tasks/<int:pk>/update/', TaskUpdateView.as_view(), name='update-task'),
path('tasks/<int:pk>/delete/', TaskDeleteView.as_view(), name='delete-task'),
] ]