From dbe36b4298a5a6f3fc2d00027cfb28505bc35423 Mon Sep 17 00:00:00 2001 From: Danil Merinov Date: Mon, 11 Sep 2023 13:02:16 -0400 Subject: [PATCH] refactorAPI refactorAPI --- proyecto_musica/api/functions.py | 78 +++++++++++++++ proyecto_musica/api/models.py | 60 +----------- proyecto_musica/api/views.py | 157 ++++--------------------------- 3 files changed, 98 insertions(+), 197 deletions(-) create mode 100644 proyecto_musica/api/functions.py diff --git a/proyecto_musica/api/functions.py b/proyecto_musica/api/functions.py new file mode 100644 index 00000000..f509a646 --- /dev/null +++ b/proyecto_musica/api/functions.py @@ -0,0 +1,78 @@ +from authentication.models import User, Skills, User_Skills, Genres, User_Genres, User_Artists, User_Youtube, User_Vimeo, Nationality, User_Nationality, User_Videos +from rest_framework import response, status +from enum import Enum +import re +from api.models import Images +from api.models import Videos +import os +from proyecto_musica.settings import BASE_DIR +from pathlib import Path +import shutil +from api.models import Images, Videos + + + +def validate_request(jd): + if len(jd) != 2: + res = {'success' : False, 'error': "you didnt add all of the parameters"} + return response.Response(res, status=status.HTTP_400_BAD_REQUEST) + + if "title" not in jd: + res = {'success' : False, 'error' : "Title has to be specified in the request as a key"} + return response.Response(res, status=status.HTTP_400_BAD_REQUEST) + + if "image" not in jd: + res = {'success' : False, 'error' : "Image has to be specified in the request as a key"} + return response.Response(res, status=status.HTTP_400_BAD_REQUEST) + + return None + + +def validate_image_title(jd): + valid_titles = ["image_1","image_2","image_3","image_4","image_5","image_6", "profile_image"] + + if jd['title'] not in valid_titles: + res = {'success' : False, 'error': "not a valid image title"} + return response.Response(res, status=status.HTTP_400_BAD_REQUEST) + + return None + + +def deleteImage(img): + if len(img) == 0: + res = {'success' : False, 'error': 'image with that id does not exist'} + return response.Response(res) + + imgeObj = img[0] + imgeObj.image.delete() + imgeObj.delete() + return None + + +def deleteVideo(vid): + if len(vid) == 0: + res = {'success' : False, 'error': 'video with that id does not exist'} + return response.Response(res) + + videoObj = vid[0] + videoObj.video.delete() + videoObj.delete() + return None + + +def postVideo(currentUsrVideo): + if not currentUsrVideo: + res = {'success' : False, 'error' : "Request must contain video as a key."} + return response.Response(res, status=status.HTTP_400_BAD_REQUEST) + + if len(currentUsrVideo) < 0: + res = {'success' : False, 'error' : "Request must contain video as a key."} + return response.Response(res, status=status.HTTP_400_BAD_REQUEST) + + return None + + + + + + diff --git a/proyecto_musica/api/models.py b/proyecto_musica/api/models.py index a5b21f31..eb4e2675 100644 --- a/proyecto_musica/api/models.py +++ b/proyecto_musica/api/models.py @@ -1,6 +1,4 @@ -# create user model from django.shortcuts import render - from django.db import models from authentication.models import User from datetime import datetime @@ -9,19 +7,10 @@ import random -# TODO: make cleaner def get_uplaod_file_name(userpic, filename): ext = filename.split('.')[-1] - - # TODO: change the name of the file - newName = str(uuid.uuid4()) + '.' + ext - print("uid",) - print('here', u'photos/%s/profileImg//%s' % (str(userpic.user.id),newName)) - - - if userpic.title == "profile_image": return u'photos/%s/profileImg//%s' % (str(userpic.user.id),newName) return u'photos/%s/%s' % (str(userpic.user.id),newName) @@ -33,20 +22,8 @@ def get_uplaod_video_name(userpic, filename): return u'videos/%s/vids//%s' % (str(userpic.user.id),newName) return u'videos/%s/%s' % (str(userpic.user.id),newName) -# these are the images for the profile page - # image_1 - # image_2 - # image_3 - # image_4 - # image_5 - # image_6 -# Profile_image - # profile_image - -# change name of image_One - class Images(models.Model): image_id = models.BigAutoField( auto_created=True, @@ -91,10 +68,6 @@ class Videos(models.Model): video = models.FileField(upload_to=get_uplaod_video_name) - - - -# this contains all of the types of media that we can have class Multimedia_type(models.Model): multimedia_type_id = models.BigAutoField( @@ -113,8 +86,7 @@ def __str__(self): class Meta: db_table = 'Multimedia_type' -# status multimedia of the multimedia -# ex. visible, hidden, deleted +# status multimedia of the multimedia, ex. visible, hidden, deleted class Multimedia_status(models.Model): multimedia_status_id = models.BigAutoField( auto_created=True, @@ -148,32 +120,6 @@ class Meta: db_table = 'Format' -# imagen 1 - -# iimage 2 - -# iimage 3 - -# imagen_5 - -# iimage 5 - - -# When updating I would have to image - -# TODO: Validate the max amount permitted - - - -''' - class Video: - multimedia_id - user_id - - title = models.CharField(max_length=50) - video = models.Video('video/') -''' - # this is table is where we save all of our user multimedia files that are uploade @@ -192,7 +138,6 @@ class Multimedia(models.Model): verbose_name='user_id' ) - multimedia_type = models.ForeignKey( Multimedia_type, on_delete=models.CASCADE, @@ -206,11 +151,8 @@ class Multimedia(models.Model): ) url = models.CharField(max_length=200) - created_at = models.DateTimeField(auto_now_add=True) - description = models.CharField(max_length=200) - multimedia_status = models.ForeignKey( Multimedia_status, on_delete=models.CASCADE, diff --git a/proyecto_musica/api/views.py b/proyecto_musica/api/views.py index 8078ba9c..87ea48d3 100644 --- a/proyecto_musica/api/views.py +++ b/proyecto_musica/api/views.py @@ -1,5 +1,3 @@ -#from django.shortcuts import render -from rest_framework.generics import GenericAPIView from django.views import View from django.http.response import JsonResponse from django.utils.decorators import method_decorator @@ -11,39 +9,25 @@ import pathlib from PIL import Image from django.core import serializers - from api.models import Images, Videos -#pathlib.Path('save_path').mkdir(parents=True, exist_ok=True) from proyecto_musica.settings import MEDIA_URL - -# the picture serializer - from api.serializers import PictureSerialiser from api.serializers import PicturesSerializer from api.serializers import Videoerialiser from api.serializers import VideosSerializer - from rest_framework import response, status, permissions +from rest_framework.generics import GenericAPIView +from ranged_fileresponse import RangedFileResponse +from django.conf import settings +import os +from api.functions import validate_request, validate_image_title, deleteImage, deleteVideo, postVideo -#import mimetypes -#from django.http import HttpResponse -#from rest_framework import response, status, permissions -#from django.contrib.auth import authenticate - -# add -# TODO: add an update method class UpdateImage(GenericAPIView): - serializer_class= PictureSerialiser permission_classes = (permissions.IsAuthenticated,) - # create serializer - # TODO: Ignore messy code - - # this returns all of the imags that bellong to a user - def get(self,request): user = request.user serializer = PicturesSerializer(user) @@ -51,56 +35,28 @@ def get(self,request): return response.Response(res) - # deleting the image def delete(self, request,id=None): user = request.user img = Images.objects.filter(image_id=id, user=request.user.id) - - if len(img) == 0: - res = {'success' : False, 'error': 'image with that id does not exist'} - return response.Response(res) - - imgeObj = img[0] - imgeObj.image.delete() - imgeObj.delete() - - + deleteImageResponse = deleteImage(img) + if deleteImageResponse is not None: return deleteImageResponse serializer = PicturesSerializer(user) - res = {'success' : True, 'data': serializer.data} return response.Response(res) - # this post method requires an id - # creates an an image record for the user - # in the case of when the user already has an image saved in the specific spot - # we override the image def post(self,request,id=None): jd = request.data + validData = functions.validate_request(jd) + if validData is not None: return validData - #making sure that the body is only 2 - if len(jd) != 2: - res = {'success' : False, 'error': "you didnt add all of the parameters"} - return response.Response(res, status=status.HTTP_400_BAD_REQUEST) - - if "title" not in jd: - res = {'success' : False, 'error' : "Title has to be specified in the request as a key"} - return response.Response(res, status=status.HTTP_400_BAD_REQUEST) - - if "image" not in jd: - res = {'success' : False, 'error' : "Image has to be specified in the request as a key"} - return response.Response(res, status=status.HTTP_400_BAD_REQUEST) - - - #verifying that we have a valid user try: user_obj = request.user except User.DoesNotExist: res = {'success' : False, 'error' : "User id does not exist."} return response.Response(res, status=status.HTTP_400_BAD_REQUEST) - # verify that im uploadin a valid image img = request.FILES["image"] try: @@ -111,101 +67,51 @@ def post(self,request,id=None): return response.Response(res, status=status.HTTP_400_BAD_REQUEST) newpic = Images(user=user_obj, title=jd['title'], image = img) - # TODO: imeplement enums - valid_titles = ["image_1","image_2","image_3","image_4","image_5","image_6", "profile_image"] - - # making sure that we have a valid title name - if jd['title'] not in valid_titles: - res = {'success' : False, 'error': "not a valid image title"} - return response.Response(res, status=status.HTTP_400_BAD_REQUEST) + validDataImage = validate_image_title(jd) + if validDataImage is not None: return validDataImage - # does the user already have an image_1, if they do then we CurrentUsrimages = Images.objects.filter(user=user_obj, title=jd['title']) - picture_serializer = PictureSerialiser(data=jd, context={'user': user_obj, 'img' : img, 'request': request}) - if picture_serializer.is_valid(): - # implementation goes here picture_serializer.save() datos = {'success':True,'data':picture_serializer.data} - return response.Response(datos, status=status.HTTP_201_CREATED) else: - datos = {'codigo':"200",'message': "success", "url": newpic.url} - return JsonResponse(datos) - - - -from ranged_fileresponse import RangedFileResponse - -from django.conf import settings -import os - + datos = {'codigo':"200",'message': "success", "url": newpic.url} + return JsonResponse(datos) class LoadVideo(GenericAPIView): - def get(self, request): - video_path = "sample_vid.mp4" # Update with your video file path + video_path = "sample_vid.mp4" file_size = os.path.getsize(video_path) - response = RangedFileResponse(request, open(video_path, "rb"), content_type="video/mp4") - return response - # res = {'hello': 'world'} - # image_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'sample_vid.mp4') - # print('file path', image_path) - print(request.data) - - # filename = 'sample_vid.mp4' - # response = RangedFileResponse(request, open(filename, 'r'), content_type='video/mp4') - # response['Content-Disposition'] = 'attachment; filename="%s"' % filename - # return response - - # return response.Response({'hello':'world'}) - class UpdateVideo(GenericAPIView): serializer_class= PictureSerialiser permission_classes = (permissions.IsAuthenticated,) - - def get(self,request): user = request.user serializer = VideosSerializer(user) res = {} res['success'] = True res['videos'] = serializer.data['videos'] - res = res - return response.Response(res) - # adding the delete methodb - def delete(self, request, id=None): vid = Videos.objects.filter(video_id=id, user=request.user.id) - - - if len(vid) == 0: - res = {'success' : False, 'error': 'video with that id does not exist'} - return response.Response(res) - - videoObj = vid[0] - videoObj.video.delete() - videoObj.delete() - + deleteVideoResponse = deleteVideo(vid) + if deleteVideoResponse is not None: return deleteVideoResponse res = {'success' : True, 'videos': []} - return response.Response(res) - # im only going to allow intro Videos + def post(self,request,id=None): jd = request.data - caption = None - if 'caption' in jd: caption = jd['caption'] @@ -217,44 +123,24 @@ def post(self,request,id=None): if "video" not in jd: - # check if a video existss currentUsrVideo = Videos.objects.filter(user=request.user) - - - if not currentUsrVideo: - res = {'success' : False, 'error' : "Request must contain video as a key."} - return response.Response(res, status=status.HTTP_400_BAD_REQUEST) - - - if len(currentUsrVideo) < 0: - res = {'success' : False, 'error' : "Request must contain video as a key."} - return response.Response(res, status=status.HTTP_400_BAD_REQUEST) + postVideoResponse = postVideo(currentUsrVideo) + if postVideoResponse is not None: return postVideoResponse else: - # video exists in the server and we're just changing the caption currentUsrVideo[0].caption = caption currentUsrVideo[0].save() - - # return the newest user serializer = VideosSerializer(request.user) res = {} res['success'] = True res['video'] = serializer.data['videos'][0] del res['video']['title'] - res = res - return response.Response(res) - res = {'success' : False, 'error' : "Request must contain video as a key."} return response.Response(res, status=status.HTTP_400_BAD_REQUEST) video = request.FILES["video"] - - - - - # here we should check if the image is a video if video: filename = video.name @@ -264,16 +150,11 @@ def post(self,request,id=None): video_serializer = Videoerialiser(data=jd, context={'user': user_obj, 'vid' : video, 'request': request, 'caption': caption}) - if video_serializer.is_valid(): video_serializer.save() - res = {} res['success'] = True res['video'] = video_serializer.data - - - datos = res return response.Response(datos, status=status.HTTP_201_CREATED) else: