import datetime from django.shortcuts import get_object_or_404, render from django.http import HttpResponseRedirect, JsonResponse, Http404 from django.views import generic from django.urls import reverse from django.utils import timezone from rest_framework import status, viewsets from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.decorators import action from .serializers import MigrationSerializer, MigrationOverView from .models import Migration class MigrationList(APIView): ''' Returns a list of migrations with simpleData ''' def get(self, request, format=None): migrations = Migration.objects.all() serializer = MigrationOverView(migrations, many=True) return Response(serializer.data) def post(self, request, format=None): serializer = MigrationSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) class MigrationDetails(APIView): ''' Returns full migration details ''' def getObject(self, pk): try: migration = Migration.objects.get(id=pk) return migration except Migration.DoesNotExist: raise Http404 def get(self, request, pk, format=None): migration = self.getObject(pk) serializer = MigrationSerializer(migration) return Response(serializer.data) def put(self, request, pk, format=None): migration = self.getObject(pk) serializer = MigrationSerializer(migration, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) class MigrationsBooked(APIView): ''' Returns list of booked migrations ''' def get(self, request, format=None): migrations = MigrationOverView(Migration.objects.filter( migration_status="Booked",), many=True) return Response(migrations.data, status=status.HTTP_200_OK) class MigrationsWaitingTerm(APIView): ''' Returns list of booked migrations ''' def get(self, request, format=None): migrations = MigrationOverView(Migration.objects.filter( migration_status="Waiting Termination",), many=True) return Response(migrations.data, status=status.HTTP_200_OK) class MigrationsCompleted(APIView): ''' Returns list of booked migrations ''' def get(self, request, format=None): migrations = MigrationOverView(Migration.objects.filter( migration_status="Completed",), many=True) return Response(migrations.data, status=status.HTTP_200_OK) class PendingMigrations(APIView): ''' Returns list of 'pending' migrations (migrations that are booked for today (maybe before timezone.now)) ''' def get(self, request, format=None): migrations = Migration.objects.filter( migration_status="Booked", booked_time__lte=timezone.now() + datetime.timedelta(1), booked_time__gte=(timezone.now() + datetime.timedelta(-1)) ) serializer = MigrationOverView(migrations, many=True) return Response(serializer.data, status=status.HTTP_200_OK) class MissedMigrations(APIView): ''' Returns a list of missed migrations ''' def get(self, request, format=None): migrations = Migration.objects.filter( booked_time__lte=timezone.now() + datetime.timedelta(-1), migration_status="Booked" ) serializer = MigrationOverView(migrations, many=True) return Response(serializer.data) class PendingTerm(APIView): ''' Returns a list of accounts pending termination (might add an arg so we can specify how many days) ''' def get(self, request, format=None): migrations = Migration.objects.filter( migration_status="Waiting Termination", term_date__lte=timezone.now() + datetime.timedelta(1) ) serializer = MigrationOverView(migrations, many=True) return Response(serializer.data) # class MigrationViewSet(viewsets.ModelViewSet): # ''' Class for defining the migration views ''' # queryset = Migration.objects.all() # serializer_class = MigrationOverView # # permission_classes = (AllowAny,) # @action(detail=False, methods=['GET']) # def upcoming(self, request): # ''' Returns a list of the migrations due today ''' # queryset = MigrationSerializer( # Migration.objects.filter(booked_time=timezone.now(), # migration_status="Booked"), many=True) # return Response(queryset.data, status=status.HTTP_200_OK) # @action(detail=False, methods=['GET']) # def missed(self, request): # ''' Returns a list of the missed migrations (Still have the status # booked and date is greater then today) ''' # queryset = MigrationSerializer( # Migration.objects.filter(booked_time__gte=timezone.now() + datetime.timedelta(1), # migration_status="Booked"), many=True) # return Response(queryset.data, status=status.HTTP_200_OK) # @action(detail=False, methods=['GET']) # def booked(self, request): # ''' Returns a list of the booked migrations ''' # queryset = MigrationSerializer(Migration.objects.filter( # migration_status="Booked",), many=True) # return Response(queryset.data, status=status.HTTP_200_OK) # @action(detail=False, methods=['GET']) # def completed(self, request): # ''' Returns a list of the completed migrations ''' # queryset = MigrationSerializer(Migration.objects.filter( # migration_status="Completed",), many=True) # return Response(queryset.data, status=status.HTTP_200_OK) # @action(detail=False, methods=['GET']) # def awaitterm(self, request): # ''' Returns migrations awaiting termination ''' # queryset = MigrationSerializer(Migration.objects.filter( # migration_status="Waiting Termination", term_date__lte=timezone.now()), many=True) # return Response(queryset.data, status=status.HTTP_200_OK)