diff --git a/MisplaceAI/process_misplaced_manager/serializers.py b/MisplaceAI/process_misplaced_manager/serializers.py index 7b7a8abaf00cc21db6e89c15250b0b21e59d9428..8324cc74854117bfa45d337662adeed52388d353 100644 --- a/MisplaceAI/process_misplaced_manager/serializers.py +++ b/MisplaceAI/process_misplaced_manager/serializers.py @@ -12,6 +12,8 @@ class UploadedImageSerializer(serializers.ModelSerializer): class Meta: model = UploadedImage fields = ['id', 'image', 'uploaded_at', 'user'] + read_only_fields = ['uploaded_at'] + class UploadedVideoSerializer(serializers.ModelSerializer): class Meta: diff --git a/MisplaceAI/process_misplaced_manager/views.py b/MisplaceAI/process_misplaced_manager/views.py index 166bcf476bd0ae5ac51759763eb16d2dac06ef48..190de693906adf028b2cfa105405eb7d6f4a37e6 100644 --- a/MisplaceAI/process_misplaced_manager/views.py +++ b/MisplaceAI/process_misplaced_manager/views.py @@ -37,10 +37,14 @@ class UploadedImageViewSet(viewsets.ModelViewSet): permission_classes = [IsAuthenticated] +# MisplaceAI/process_misplaced_manager/views.py @api_view(['POST']) @permission_classes([IsAuthenticated]) def normal_detection(request): + print("Received request for normal detection") + print("Request data:", request.data) + print("Request FILES:", request.FILES) try: if 'capturedImageData' in request.data: captured_image_data = request.data['capturedImageData'] @@ -48,12 +52,15 @@ def normal_detection(request): ext = format.split('/')[-1] image_data = ContentFile(base64.b64decode(imgstr), name='temp.' + ext) - new_image = UploadedImage.objects.create(image=image_data) + new_image = UploadedImage.objects.create(image=image_data, user=request.user) else: - serializer = UploadedImageSerializer(data=request.data) + data = request.data.copy() + data['user'] = request.user.id + serializer = UploadedImageSerializer(data=data) if serializer.is_valid(): new_image = serializer.save() else: + print("Serializer errors:", serializer.errors) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) image_path = new_image.image.path @@ -79,6 +86,7 @@ def normal_detection(request): print(f"Error processing image: {str(e)}") return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + def correct_image_orientation(image_path): try: image = Image.open(image_path) @@ -271,24 +279,17 @@ def process_video_for_misplaced_objects(video_path, frame_interval, frame_delay) @api_view(['DELETE']) @permission_classes([IsAuthenticated]) def delete_image(request, image_name): - try: - print(f"Attempting to delete image: {image_name}") - # Construct the file path - file_path = os.path.join(settings.MEDIA_ROOT, image_name) - - # Check if the file exists - if os.path.exists(file_path): - # Delete the file - os.remove(file_path) - print(f"Image {image_name} deleted successfully.") - return Response(status=status.HTTP_204_NO_CONTENT) - else: - print(f"Image {image_name} not found.") - return Response({'error': 'Image not found'}, status=status.HTTP_404_NOT_FOUND) - except Exception as e: - print(f"Error deleting image {image_name}: {str(e)}") - return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) - + print(f"Attempting to delete image: {image_name}") + # Construct the file path + file_path = os.path.join(settings.MEDIA_ROOT, image_name) + # Check if the file exists + if os.path.exists(file_path): + # Delete the file + os.remove(file_path) + print(f"Image {image_name} deleted successfully.") + else: + print(f"Image {image_name} not found. It may have already been deleted.") + return Response(status=status.HTTP_204_NO_CONTENT) @@ -296,19 +297,14 @@ def delete_image(request, image_name): @api_view(['DELETE']) @permission_classes([IsAuthenticated]) def delete_video(request, video_name): - try: - print(f"Attempting to delete video: {video_name}") - video_path = os.path.join(settings.MEDIA_ROOT, 'videos', video_name) - if os.path.exists(video_path): - os.remove(video_path) - print(f"Video {video_name} deleted successfully.") - return Response(status=status.HTTP_204_NO_CONTENT) - else: - print(f"Video {video_name} not found.") - return Response({'error': 'Video not found'}, status=status.HTTP_404_NOT_FOUND) - except Exception as e: - print(f"Error deleting video {video_name}: {str(e)}") - return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + print(f"Attempting to delete video: {video_name}") + video_path = os.path.join(settings.MEDIA_ROOT, 'videos', video_name) + if os.path.exists(video_path): + os.remove(video_path) + print(f"Video {video_name} deleted successfully.") + else: + print(f"Video {video_name} not found. It may have already been deleted.") + return Response(status=status.HTTP_204_NO_CONTENT) ################################################################################################# diff --git a/frontend/src/pages/ProcessMisplacedManager/ManageImages.js b/frontend/src/pages/ProcessMisplacedManager/ManageImages.js deleted file mode 100644 index 294def29aeedcaaa825a54ef2208c8890b8e89d8..0000000000000000000000000000000000000000 --- a/frontend/src/pages/ProcessMisplacedManager/ManageImages.js +++ /dev/null @@ -1,48 +0,0 @@ -// src/pages/ProcessMisplacedManager/ManageImages.js -import React, { useState, useEffect } from 'react'; -import { getImages, createImage } from '../../services/processMisplacedManagerApi'; - -const ManageImages = () => { - const [images, setImages] = useState([]); - const [image, setImage] = useState(null); - - useEffect(() => { - const fetchData = async () => { - const result = await getImages(); - setImages(result); - }; - fetchData(); - }, []); - - const handleImageChange = (e) => { - setImage(e.target.files[0]); - }; - - const handleImageUpload = async (e) => { - e.preventDefault(); - const formData = new FormData(); - formData.append('image', image); - await createImage(formData); - const result = await getImages(); - setImages(result); - }; - - return ( - <div> - <h1>Manage Images</h1> - <form onSubmit={handleImageUpload}> - <input type="file" onChange={handleImageChange} /> - <button type="submit">Upload</button> - </form> - <ul> - {images.map((img) => ( - <li key={img.id}> - <img src={img.image} alt="uploaded" /> - </li> - ))} - </ul> - </div> - ); -}; - -export default ManageImages; diff --git a/frontend/src/pages/ProcessMisplacedManager/ManageVideos.js b/frontend/src/pages/ProcessMisplacedManager/ManageVideos.js deleted file mode 100644 index 4641d482eec4e7dd0a59f17ea5985e42e12a201e..0000000000000000000000000000000000000000 --- a/frontend/src/pages/ProcessMisplacedManager/ManageVideos.js +++ /dev/null @@ -1,51 +0,0 @@ -// src/pages/ProcessMisplacedManager/ManageVideos.js -import React, { useState, useEffect } from 'react'; -import { getVideos, createVideo } from '../../services/processMisplacedManagerApi'; - -const ManageVideos = () => { - const [videos, setVideos] = useState([]); - const [video, setVideo] = useState(null); - - useEffect(() => { - const fetchData = async () => { - const result = await getVideos(); - setVideos(result); - }; - fetchData(); - }, []); - - const handleVideoChange = (e) => { - setVideo(e.target.files[0]); - }; - - const handleVideoUpload = async (e) => { - e.preventDefault(); - const formData = new FormData(); - formData.append('video', video); - await createVideo(formData); - const result = await getVideos(); - setVideos(result); - }; - - return ( - <div> - <h1>Manage Videos</h1> - <form onSubmit={handleVideoUpload}> - <input type="file" onChange={handleVideoChange} /> - <button type="submit">Upload</button> - </form> - <ul> - {videos.map((vid) => ( - <li key={vid.id}> - <video width="320" height="240" controls> - <source src={vid.video} type="video/mp4" /> - Your browser does not support the video tag. - </video> - </li> - ))} - </ul> - </div> - ); -}; - -export default ManageVideos; diff --git a/frontend/src/pages/Results/DisplayResultsPage.js b/frontend/src/pages/Results/DisplayResultsPage.js deleted file mode 100644 index 59a825658b3e9b4bd9854174275f709d7a3d3d7a..0000000000000000000000000000000000000000 --- a/frontend/src/pages/Results/DisplayResultsPage.js +++ /dev/null @@ -1,48 +0,0 @@ -// src/pages/Results/DisplayResultsPage.js -import React, { useEffect, useState } from 'react'; -import { useParams } from 'react-router-dom'; -import { getImageResults } from '../../services/processMisplacedManagerApi'; -import '../../styles/main.css'; - -const DisplayResultsPage = () => { - const { imageId } = useParams(); - const [results, setResults] = useState(null); - - useEffect(() => { - const fetchResults = async () => { - const data = await getImageResults(imageId); - setResults(data); - }; - fetchResults(); - }, [imageId]); - - if (!results) { - return <div>Loading...</div>; - } - - return ( - <div className="pages-container-center"> - <div className="row justify-content-center"> - <div className="col-md-8"> - <h1 className="text-center">Detection Results</h1> - <img src={results.output_image_url} alt="Detected Objects" className="img-fluid" /> - <h2 className="mt-4">Misplaced Objects</h2> - <ul className="list-group"> - {results.misplaced_objects.map(obj => ( - <li key={obj.class_name} className="list-group-item"> - {obj.class_name} is misplaced. Allowed locations: {obj.allowed_locations.join(", ")} - </li> - ))} - </ul> - <div className="text-center mt-4"> - <a href="/detection-options" className="btn btn-link"> - Try another detection - </a> - </div> - </div> - </div> - </div> - ); -}; - -export default DisplayResultsPage; diff --git a/frontend/src/services/processMisplacedManagerApi.js b/frontend/src/services/processMisplacedManagerApi.js index 6807735e4de9ed4f86112ae65e49243d8899343f..5bcf51223c0369fea08e6edfba7a7fb7fa23c3b9 100644 --- a/frontend/src/services/processMisplacedManagerApi.js +++ b/frontend/src/services/processMisplacedManagerApi.js @@ -1,50 +1,6 @@ // src/services/processMisplacedManagerApi.js import api from './api'; -// Function to get all images -export const getImages = async () => { - try { - const response = await api.get('/api/process_misplaced_manager/images/'); - return response.data; - } catch (error) { - console.error("Error fetching images:", error); - throw error; - } -}; - -// Function to get a single image by ID -export const getImage = async (id) => { - try { - const response = await api.get(`/api/process_misplaced_manager/images/${id}/`); - return response.data; - } catch (error) { - console.error(`Error fetching image with ID ${id}:`, error); - throw error; - } -}; - -// Function to create a new image -export const createImage = async (data) => { - try { - const response = await api.post('/api/process_misplaced_manager/images/', data); - return response.data; - } catch (error) { - console.error("Error creating image:", error); - throw error; - } -}; - -// Function to get all videos -export const getVideos = async () => { - try { - const response = await api.get('/api/process_misplaced_manager/videos/'); - return response.data; - } catch (error) { - console.error("Error fetching videos:", error); - throw error; - } -}; - // Function to get a single video by ID export const getVideo = async (id) => { try { @@ -56,16 +12,7 @@ export const getVideo = async (id) => { } }; -// Function to create a new video -export const createVideo = async (data) => { - try { - const response = await api.post('/api/process_misplaced_manager/videos/', data); - return response.data; - } catch (error) { - console.error("Error creating video:", error); - throw error; - } -}; + // Function for normal detection export const normalDetection = async (data) => { @@ -98,16 +45,6 @@ export const uploadVideo = async (data) => { } }; -// Function to check placement rules -export const checkPlacement = async (data) => { - try { - const response = await api.post('/api/placement_rules/check_placement/', data); - return response.data; - } catch (error) { - console.error("Error in checking placement:", error); - throw error; - } -}; // Function to get video results