diff --git a/backend/server/adventures/serializers.py b/backend/server/adventures/serializers.py index 1057eee..53541b4 100644 --- a/backend/server/adventures/serializers.py +++ b/backend/server/adventures/serializers.py @@ -23,14 +23,6 @@ class AdventureSerializer(serializers.ModelSerializer): return [activity.lower() for activity in value] return value -class CollectionSerializer(serializers.ModelSerializer): - adventures = AdventureSerializer(many=True, read_only=True, source='adventure_set') - - class Meta: - model = Collection - # fields are all plus the adventures field - fields = ['id', 'description', 'user_id', 'name', 'is_public', 'adventures', 'created_at', 'start_date', 'end_date'] - class TransportationSerializer(serializers.ModelSerializer): class Meta: @@ -65,4 +57,15 @@ class TransportationSerializer(serializers.ModelSerializer): validated_data['user_id'] = self.context['request'].user return super().create(validated_data) + +class CollectionSerializer(serializers.ModelSerializer): + adventures = AdventureSerializer(many=True, read_only=True, source='adventure_set') + transportations = TransportationSerializer(many=True, read_only=True, source='transportation_set') + + class Meta: + model = Collection + # fields are all plus the adventures field + fields = ['id', 'description', 'user_id', 'name', 'is_public', 'adventures', 'created_at', 'start_date', 'end_date', 'transportations'] + + \ No newline at end of file diff --git a/backend/server/adventures/views.py b/backend/server/adventures/views.py index 8d427b4..c15bfe0 100644 --- a/backend/server/adventures/views.py +++ b/backend/server/adventures/views.py @@ -261,6 +261,10 @@ class CollectionViewSet(viewsets.ModelViewSet): Prefetch('adventure_set', queryset=Adventure.objects.filter( Q(is_public=True) | Q(user_id=self.request.user.id) )) + ).prefetch_related( + Prefetch('transportation_set', queryset=Transportation.objects.filter( + Q(is_public=True) | Q(user_id=self.request.user.id) + )) ) return self.apply_sorting(collections) @@ -296,6 +300,14 @@ class CollectionViewSet(viewsets.ModelViewSet): serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) + # make a view to return all of the associated transportations with a collection + @action(detail=True, methods=['get']) + def transportations(self, request, pk=None): + collection = self.get_object() + transportations = Transportation.objects.filter(collection=collection) + serializer = TransportationSerializer(transportations, many=True) + return Response(serializer.data) + class StatsViewSet(viewsets.ViewSet): permission_classes = [IsAuthenticated] @@ -395,6 +407,16 @@ class TransportationViewSet(viewsets.ModelViewSet): return Response({"detail": "Listing all adventures is not allowed."}, status=status.HTTP_403_FORBIDDEN) + @action(detail=False, methods=['get']) + def all(self, request): + if not request.user.is_authenticated: + return Response({"error": "User is not authenticated"}, status=400) + queryset = Transportation.objects.filter( + Q(user_id=request.user.id) + ) + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) + def get_queryset(self): diff --git a/frontend/src/lib/components/TransportationCard.svelte b/frontend/src/lib/components/TransportationCard.svelte new file mode 100644 index 0000000..1b6df55 --- /dev/null +++ b/frontend/src/lib/components/TransportationCard.svelte @@ -0,0 +1,83 @@ + + +
{collection.adventures.length} Adventures
+ {#if collection.start_date && collection.end_date} ++ Dates: {new Date(collection.start_date).toLocaleDateString('en-US', { timeZone: 'UTC' })} - {new Date( + collection.end_date + ).toLocaleDateString('en-US', { timeZone: 'UTC' })} +
+ ++ Duration: {Math.floor( + (new Date(collection.end_date).getTime() - new Date(collection.start_date).getTime()) / + (1000 * 60 * 60 * 24) + ) + 1}{' '} + days +
{/if} +{transportation.id}
+{transportation.name}
+{transportation.type}
+{transportation.date}
+ {/each} + {/if} + {#if collection.start_date && collection.end_date}