Conversion_Kitchen_Code/kitchen_counter/centralisedFileSystem/views.py

166 lines
5.7 KiB
Python
Raw Permalink Normal View History

2024-04-27 09:33:09 +00:00
"""
The API views for Centralised File System.
"""
import mimetypes
from django.http import FileResponse
from rest_framework.authentication import (BasicAuthentication,
SessionAuthentication)
from rest_framework.decorators import (authentication_classes,
permission_classes)
from rest_framework.generics import CreateAPIView, UpdateAPIView
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework_simplejwt.authentication import JWTAuthentication
from centralisedFileSystem.models import File, ScreenPlay, Script
from centralisedFileSystem.serializers import (FileSerializer,
ScreenPlayScriptSerializer,
ScreenPlaySerializer,
ScriptSerializer,
UserScriptsSerializer)
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
class ScriptView(CreateAPIView):
'''
Create view for creating new scripts and uploading a file to it.
'''
queryset = Script.objects.all()
serializer_class = ScriptSerializer
def get(self, request) -> FileResponse:
'''
To download any file of the given script.
________________________________________________
QueryParameters
script_id : id of the script
type : type of file to downlaod
________________________________________________
'''
if not "script_id" in request.query_params:
return Response("script_id must be provided in query parameter to Download a script.", status=status.HTTP_400_BAD_REQUEST)
if not "type" in request.query_params:
return Response("type must be provided in query parameter to specify the type of file.", status=status.HTTP_400_BAD_REQUEST)
query_file = File.objects.get(
script = request.query_params.get("script_id"),
type = request.query_params.get("type"),
)
file_path = query_file.file.path
file_size = query_file.file.size
document = open(file_path, 'rb')
mimetype, _ = mimetypes.guess_type(file_path)
response = FileResponse(document, content_type=mimetype)
response['Content-Length'] = file_size
response['Content-Disposition'] = f"attachment; filename={query_file.script.screenplay.name + '_' + str(query_file)}.{file_path.rsplit('.',1)[1]}"
return response
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
class ScreenPlayView(CreateAPIView):
'''
For creating new screenplays.
'''
queryset = ScreenPlay.objects.all()
serializer_class = ScreenPlaySerializer
def get(self, request) -> Response:
'''
To get all the scripts of the given script name.
________________________________________________
QueryParameters
screenplay : name of the screenplay
________________________________________________
'''
if not "screenplay" in request.query_params:
return Response("screenplay name must be provided in query parameter.", status=status.HTTP_400_BAD_REQUEST)
queryobject = ScreenPlay.objects.get(
name = request.query_params.get("screenplay"),
user = request.user,
)
script = UserScriptsSerializer(queryobject)
return Response(script.data)
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
class ScreenPlayScriptView(CreateAPIView):
'''
For creating a new screenplay with a script and uploading a file to it.
'''
queryset = ScreenPlay.objects.all()
serializer_class = ScreenPlayScriptSerializer
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
class FileView(CreateAPIView, UpdateAPIView):
'''
To upload a file to a script.
'''
queryset = File.objects.all()
serializer_class = FileSerializer
def get(self, request) -> Response:
'''
To get the specified file of a script.
_____________________________________
QueryParameters
script_id : script id
type : file type
_____________________________________
'''
if not "script_id" in request.query_params:
return Response("script_id must be provided in query parameter.", status=status.HTTP_400_BAD_REQUEST)
if not "type" in request.query_params:
return Response("type must be provided in query parameter.", status=status.HTTP_400_BAD_REQUEST)
queryobject = File.objects.get(
script = request.query_params.get("script_id"),
type = request.query_params.get("type"),
)
serializer = FileSerializer(queryobject)
return Response(serializer.data)
# @authentication_classes([SessionAuthentication, BasicAuthentication])
# @permission_classes([IsAuthenticated])
class UserScripts(APIView):
authentication_classes = [JWTAuthentication]
permission_classes = [IsAuthenticated]
def get(self, request) -> Response:
'''
To get all the screenplays along with all of their scripts of the current user.
'''
queryset = ScreenPlay.objects.filter(user=request.user)
scripts = UserScriptsSerializer(queryset, many=True)
return Response(scripts.data)