From 65b60fb3108bd95999c5587a35f052434ae8d385 Mon Sep 17 00:00:00 2001 From: malcolm Date: Tue, 12 Mar 2024 22:48:24 -0700 Subject: [PATCH 1/6] created endpoint to get items associated with an auction --- backend/auction/urls.py | 6 ++++++ backend/auction/views.py | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/backend/auction/urls.py b/backend/auction/urls.py index db023c4..f3ca8dc 100644 --- a/backend/auction/urls.py +++ b/backend/auction/urls.py @@ -7,6 +7,7 @@ AuctionListApiView, GetSavedUnitApiView, SaveUnitApiView, + AuctionVehiclesApiView, ) urlpatterns = [ @@ -27,4 +28,9 @@ AddToAuctionApiView.as_view(), name="add_to_auction", ), + path( + "/vehicles/", + AuctionVehiclesApiView.as_view(), + name="auction_vehicles", + ), ] diff --git a/backend/auction/views.py b/backend/auction/views.py index 27f8314..5bfef04 100644 --- a/backend/auction/views.py +++ b/backend/auction/views.py @@ -7,7 +7,7 @@ from core.permissions import IsAdminUser, IsAuthenticated from services.AWSCognitoService import AWSCognitoService -from vehicle.models import SavedUnits, Vehicle +from vehicle.models import SavedUnits, Vehicle, Equipment, Trailer from .models import Auction, AuctionItem from .serializers import AuctionSerializer @@ -212,3 +212,36 @@ def post(self, request, *args, **kwargs): {"message": "Vehicle added to auction successfully"}, status=status.HTTP_201_CREATED, ) + +class AuctionVehiclesApiView(APIView): + """ + An endpoint to retrieve an auction's associated vehicles + """ + + cognitoService = AWSCognitoService() + + def get(self, request, **kwargs): + auction_id = kwargs.get("auction_id") + auction = get_object_or_404(Auction, id=auction_id) + + auction_items = AuctionItem.objects.filter(auction_id=auction) + + vehicle_list = [] + equipment_list = [] + trailer_list = [] + + for auction_item in auction_items: + if isinstance(auction_item.content_object, Vehicle): + vehicle_list.append(auction_item.content_object) + elif isinstance(auction_item.content_object, Equipment): + equipment_list.append(auction_item.content_object) + elif isinstance(auction_item.content_object, Trailer): + trailer_list.append(auction_item.content_object) + + vehicle_data = [{"id": vehicle.id} for vehicle in vehicle_list] + equipment_data = [{"id": equipment.id} for equipment in equipment_list] + trailer_data = [{"id": trailer.id} for trailer in trailer_list] + + return Response({"vehicles": vehicle_data, "equipment": equipment_data, + "trailers": trailer_data}, status=status.HTTP_200_OK) + From 07cb515361c4a51819cf9716e005cd3d1e6888f4 Mon Sep 17 00:00:00 2001 From: malcolm Date: Thu, 14 Mar 2024 03:05:14 -0700 Subject: [PATCH 2/6] representing the right amount of cards and the right amount of auctions --- frontend/src/pages/HomePage.jsx | 119 ++++++++++++++--------------- frontend/src/utils/auctionUtils.js | 20 +++++ 2 files changed, 79 insertions(+), 60 deletions(-) create mode 100644 frontend/src/utils/auctionUtils.js diff --git a/frontend/src/pages/HomePage.jsx b/frontend/src/pages/HomePage.jsx index 0142bb4..5cfe3b0 100644 --- a/frontend/src/pages/HomePage.jsx +++ b/frontend/src/pages/HomePage.jsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import NavBar from '../components/navBars/NavBar'; import CoverImage from '../assets/cover-image.png'; @@ -13,9 +13,15 @@ import LogInJoinAuctionButton from '../components/buttons/LogInJoinAuctionButton import RegisterEarlyButton from '../components/buttons/RegisterEarlyButton'; import RegisterForAuctionButton from '../components/buttons/RegisterForAuctionButton'; import useAuth from '../hooks/useAuth'; +import useAxios from '../hooks/useAxios'; +import sortAuctions from '../utils/auctionUtils'; export default function HomePage() { const [searchedAuctions, setSearchedAuctions] = useState([]); + const [currentAuctionList, setCurrentAuctionList] = useState([]); + const [upcomingAuctionList, setUpcomingAuctionList] = useState([]); + const [pastAuctionList, setPastAuctionList] = useState([]); + const { fetchData } = useAxios(); const { isAuthenticated } = useAuth(); // eslint-disable-next-line no-console @@ -28,6 +34,27 @@ export default function HomePage() { currentAuctionButton = ; } + const getAuctions = async () => { + try { + const response = await fetchData({ + endpoint: 'auctions/', + method: 'GET', + }); + const auctionList = sortAuctions(response.data); + setUpcomingAuctionList(auctionList.upcoming); + setCurrentAuctionList(auctionList.current); + setPastAuctionList(auctionList.past); + } catch (err) { + // eslint-disable-next-line no-console + console.error(err); + } + }; + + useEffect(() => { + getAuctions(); + }, []); + + return (
@@ -98,90 +125,62 @@ export default function HomePage() {
-
+ {currentAuctionList.length > 0 &&

Current Auction

-
-
+
} + {upcomingAuctionList.length > 0 &&

Upcoming Auctions

- - - + {upcomingAuctionList.map(auction => ( + + ))} +
-
-
+
} + {pastAuctionList.length > 0 &&

Past Auctions

- - - + {pastAuctionList.map(auction => ( + + ))} +
-
+
}
diff --git a/frontend/src/utils/auctionUtils.js b/frontend/src/utils/auctionUtils.js new file mode 100644 index 0000000..28eddaa --- /dev/null +++ b/frontend/src/utils/auctionUtils.js @@ -0,0 +1,20 @@ +const sortAuctions = (auctionList) => { + const upcomingList = [] + const currentList = [] + const pastList = [] + + const now = new Date(Date.now()); + auctionList.forEach(auction => { + if (new Date(auction.start_date) > now) { + upcomingList.push(auction); + } else if (new Date(auction.end_date) > now) { + currentList.push(auction); + } else { + pastList.push(auction); + } + }); + + return ({"upcoming": upcomingList, "current": currentList, "past": pastList}); +} + +export default sortAuctions; \ No newline at end of file From ac13f8f34563ac69a1bd9abedf57ed10957dea84 Mon Sep 17 00:00:00 2001 From: malcolm Date: Tue, 19 Mar 2024 12:32:43 -0700 Subject: [PATCH 3/6] each auction represents the number of items accurately --- frontend/src/pages/HomePage.jsx | 31 ++++++++++++++++++++---------- frontend/src/utils/auctionUtils.js | 2 ++ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/frontend/src/pages/HomePage.jsx b/frontend/src/pages/HomePage.jsx index 5cfe3b0..50dee35 100644 --- a/frontend/src/pages/HomePage.jsx +++ b/frontend/src/pages/HomePage.jsx @@ -40,7 +40,18 @@ export default function HomePage() { endpoint: 'auctions/', method: 'GET', }); - const auctionList = sortAuctions(response.data); + + const itemsPromises = response.data.map(async (auction) => { + const itemResponse = await fetchData({ + endpoint: `auctions/${auction.id}/vehicles/`, + method: 'GET', + }); + return { ...auction, items: itemResponse.data }; + }); + + const auctionsWithItems = await Promise.all(itemsPromises); + + const auctionList = sortAuctions(auctionsWithItems); setUpcomingAuctionList(auctionList.upcoming); setCurrentAuctionList(auctionList.current); setPastAuctionList(auctionList.past); @@ -133,9 +144,9 @@ export default function HomePage() { imageUrls={[image, image, image, image]} startDate={new Date(currentAuctionList[0].start_date)} endDate={new Date(currentAuctionList[0].end_date)} - numberOfEquipment={10} - numberOfTrailers={15} - numberOfTrucks={5} + numberOfEquipment={currentAuctionList[0].items.equipment.length} + numberOfTrailers={currentAuctionList[0].items.trailers.length} + numberOfTrucks={currentAuctionList[0].items.vehicles.length} button={currentAuctionButton} />
} @@ -149,9 +160,9 @@ export default function HomePage() { imageUrls={[image, image, image, image]} startDate={new Date(auction.start_date)} endDate={new Date(auction.end_date)} - numberOfEquipment={3} - numberOfTrailers={18} - numberOfTrucks={20} + numberOfEquipment={auction.items.equipment.length} + numberOfTrailers={auction.items.trailers.length} + numberOfTrucks={auction.items.vehicles.length} button={upcomingAuctionButton} /> ))} @@ -168,9 +179,9 @@ export default function HomePage() { imageUrls={[image, image, image, image]} startDate={new Date(auction.start_date)} endDate={new Date(auction.end_date)} - numberOfEquipment={3} - numberOfTrailers={18} - numberOfTrucks={20} + numberOfEquipment={auction.items.equipment.length} + numberOfTrailers={auction.items.trailers.length} + numberOfTrucks={auction.items.vehicles.length} /> ))} diff --git a/frontend/src/utils/auctionUtils.js b/frontend/src/utils/auctionUtils.js index 28eddaa..cfd5c83 100644 --- a/frontend/src/utils/auctionUtils.js +++ b/frontend/src/utils/auctionUtils.js @@ -17,4 +17,6 @@ const sortAuctions = (auctionList) => { return ({"upcoming": upcomingList, "current": currentList, "past": pastList}); } + + export default sortAuctions; \ No newline at end of file From eb6ac1eb2005804a0365257b2a671ef73c1aee29 Mon Sep 17 00:00:00 2001 From: malcolm Date: Thu, 21 Mar 2024 00:57:25 -0700 Subject: [PATCH 4/6] added clarifying comments --- frontend/src/pages/HomePage.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/pages/HomePage.jsx b/frontend/src/pages/HomePage.jsx index 50dee35..5d0d61c 100644 --- a/frontend/src/pages/HomePage.jsx +++ b/frontend/src/pages/HomePage.jsx @@ -36,11 +36,13 @@ export default function HomePage() { const getAuctions = async () => { try { + // get auction list const response = await fetchData({ endpoint: 'auctions/', method: 'GET', }); + // get items associated with each auction const itemsPromises = response.data.map(async (auction) => { const itemResponse = await fetchData({ endpoint: `auctions/${auction.id}/vehicles/`, @@ -50,7 +52,7 @@ export default function HomePage() { }); const auctionsWithItems = await Promise.all(itemsPromises); - + const auctionList = sortAuctions(auctionsWithItems); setUpcomingAuctionList(auctionList.upcoming); setCurrentAuctionList(auctionList.current); From 2f2dbb45841650c07e844c960de04dad2d147380 Mon Sep 17 00:00:00 2001 From: malcolm Date: Thu, 21 Mar 2024 01:16:58 -0700 Subject: [PATCH 5/6] linting --- backend/auction/views.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/auction/views.py b/backend/auction/views.py index 5bfef04..20d0678 100644 --- a/backend/auction/views.py +++ b/backend/auction/views.py @@ -212,7 +212,8 @@ def post(self, request, *args, **kwargs): {"message": "Vehicle added to auction successfully"}, status=status.HTTP_201_CREATED, ) - + + class AuctionVehiclesApiView(APIView): """ An endpoint to retrieve an auction's associated vehicles @@ -225,7 +226,7 @@ def get(self, request, **kwargs): auction = get_object_or_404(Auction, id=auction_id) auction_items = AuctionItem.objects.filter(auction_id=auction) - + vehicle_list = [] equipment_list = [] trailer_list = [] @@ -241,7 +242,6 @@ def get(self, request, **kwargs): vehicle_data = [{"id": vehicle.id} for vehicle in vehicle_list] equipment_data = [{"id": equipment.id} for equipment in equipment_list] trailer_data = [{"id": trailer.id} for trailer in trailer_list] - - return Response({"vehicles": vehicle_data, "equipment": equipment_data, - "trailers": trailer_data}, status=status.HTTP_200_OK) + return Response({"vehicles": vehicle_data, "equipment": equipment_data, + "trailers": trailer_data}, status=status.HTTP_200_OK) \ No newline at end of file From 9e1c693311bc9122add4a18e308590585c7e2f0b Mon Sep 17 00:00:00 2001 From: malcolm Date: Thu, 21 Mar 2024 01:18:41 -0700 Subject: [PATCH 6/6] more linting --- backend/auction/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/auction/views.py b/backend/auction/views.py index 20d0678..b1530b6 100644 --- a/backend/auction/views.py +++ b/backend/auction/views.py @@ -243,5 +243,5 @@ def get(self, request, **kwargs): equipment_data = [{"id": equipment.id} for equipment in equipment_list] trailer_data = [{"id": trailer.id} for trailer in trailer_list] - return Response({"vehicles": vehicle_data, "equipment": equipment_data, - "trailers": trailer_data}, status=status.HTTP_200_OK) \ No newline at end of file + return Response({"vehicles": vehicle_data, "equipment": equipment_data, + "trailers": trailer_data}, status=status.HTTP_200_OK)