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 def checkLimit(limit): if limit == "": limit = None else: limit = int(limit) return limit def getAllMigrations(limit): return Migration.objects.all()[:limit] def getFilteredMigrations(limit, **kwargs): pass class MigrationList(APIView): ''' Returns a list of migrations with simpleData ''' def get(self, request, format=None): limit = checkLimit(request.GET.get('limit', '')) migrations = getAllMigrations(limit) 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): limit = checkLimit(request.GET.get('limit', '')) migrations = MigrationOverView(Migration.objects.filter( migration_status="Booked",)[:limit], 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): limit = checkLimit(request.GET.get('limit', '')) migrations = MigrationOverView(Migration.objects.filter( migration_status="Waiting Termination",)[:limit], 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): limit = checkLimit(request.GET.get('limit', '')) migrations = MigrationOverView(Migration.objects.filter( migration_status="Completed",)[:limit], 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): limit = checkLimit(request.GET.get('limit', '')) migrations = Migration.objects.filter( migration_status="Booked", booked_time__lte=timezone.now() + datetime.timedelta(1), booked_time__gte=(timezone.now() + datetime.timedelta(-1)) )[:limit] 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): limit = checkLimit(request.GET.get('limit', '')) migrations = Migration.objects.filter( booked_time__lte=timezone.now() + datetime.timedelta(-1), migration_status="Booked" )[:limit] 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): limit = checkLimit(request.GET.get('limit', '')) migrations = Migration.objects.filter( migration_status="Waiting Termination", term_date__lte=timezone.now() + datetime.timedelta(1) )[:limit] serializer = MigrationOverView(migrations, many=True) return Response(serializer.data) class MigrationListAll(APIView): def get(self, request, format=None): limit = checkLimit(request.GET.get('limit', '')) migrations = getAllMigrations(limit) serializer = MigrationSerializer(migrations, many=True) return Response(serializer.data)