diff --git a/backend/server/adventures/serializers.py b/backend/server/adventures/serializers.py index 7a90c52..c30a06f 100644 --- a/backend/server/adventures/serializers.py +++ b/backend/server/adventures/serializers.py @@ -122,7 +122,7 @@ class ChecklistItemSerializer(serializers.ModelSerializer): return super().create(validated_data) -class Checklist(serializers.ModelSerializer): +class ChecklistSerializer(serializers.ModelSerializer): items = ChecklistItemSerializer(many=True, read_only=True, source='checklistitem_set') class Meta: model = Checklist @@ -159,7 +159,7 @@ class CollectionSerializer(serializers.ModelSerializer): adventures = AdventureSerializer(many=True, read_only=True, source='adventure_set') transportations = TransportationSerializer(many=True, read_only=True, source='transportation_set') notes = NoteSerializer(many=True, read_only=True, source='note_set') - checklists = Checklist(many=True, read_only=True, source='checklist_set') + checklists = ChecklistSerializer(many=True, read_only=True, source='checklist_set') class Meta: model = Collection diff --git a/backend/server/adventures/urls.py b/backend/server/adventures/urls.py index a914fc6..8bdd6b7 100644 --- a/backend/server/adventures/urls.py +++ b/backend/server/adventures/urls.py @@ -1,6 +1,6 @@ from django.urls import include, path from rest_framework.routers import DefaultRouter -from .views import AdventureViewSet, CollectionViewSet, NoteViewSet, StatsViewSet, GenerateDescription, ActivityTypesView, TransportationViewSet +from .views import AdventureViewSet, ChecklistViewSet, CollectionViewSet, NoteViewSet, StatsViewSet, GenerateDescription, ActivityTypesView, TransportationViewSet router = DefaultRouter() router.register(r'adventures', AdventureViewSet, basename='adventures') @@ -10,6 +10,7 @@ router.register(r'generate', GenerateDescription, basename='generate') router.register(r'activity-types', ActivityTypesView, basename='activity-types') router.register(r'transportations', TransportationViewSet, basename='transportations') router.register(r'notes', NoteViewSet, basename='notes') +router.register(r'checklists', ChecklistViewSet, basename='checklists') urlpatterns = [ diff --git a/backend/server/adventures/views.py b/backend/server/adventures/views.py index a8ef9fa..93a5c43 100644 --- a/backend/server/adventures/views.py +++ b/backend/server/adventures/views.py @@ -6,7 +6,7 @@ from django.db.models.functions import Lower from rest_framework.response import Response from .models import Adventure, Checklist, Collection, Transportation, Note from worldtravel.models import VisitedRegion, Region, Country -from .serializers import AdventureSerializer, CollectionSerializer, NoteSerializer, TransportationSerializer +from .serializers import AdventureSerializer, CollectionSerializer, NoteSerializer, TransportationSerializer, ChecklistSerializer from rest_framework.permissions import IsAuthenticated from django.db.models import Q, Prefetch from .permissions import IsOwnerOrReadOnly, IsPublicReadOnly @@ -495,5 +495,40 @@ class NoteViewSet(viewsets.ModelViewSet): user = self.request.user return Note.objects.filter(user_id=user) + def perform_create(self, serializer): + serializer.save(user_id=self.request.user) + +class ChecklistViewSet(viewsets.ModelViewSet): + queryset = Checklist.objects.all() + serializer_class = ChecklistSerializer + permission_classes = [IsAuthenticated] + filterset_fields = ['is_public', 'collection'] + + # return error message if user is not authenticated on the root endpoint + def list(self, request, *args, **kwargs): + # Prevent listing all adventures + return Response({"detail": "Listing all checklists 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 = Checklist.objects.filter( + Q(user_id=request.user.id) + ) + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) + + + def get_queryset(self): + + """ + This view should return a list of all checklists + for the currently authenticated user. + """ + user = self.request.user + return Checklist.objects.filter(user_id=user) + def perform_create(self, serializer): serializer.save(user_id=self.request.user) \ No newline at end of file diff --git a/frontend/src/lib/components/ChecklistCard.svelte b/frontend/src/lib/components/ChecklistCard.svelte new file mode 100644 index 0000000..f788b58 --- /dev/null +++ b/frontend/src/lib/components/ChecklistCard.svelte @@ -0,0 +1,67 @@ + + +
{checklist.items.length} {checklist.items.length > 1 ? 'Items' : 'Item'}
+ {/if} + {#if checklist.date && checklist.date !== ''} +{new Date(checklist.date).toLocaleDateString('en-US', { timeZone: 'UTC' })}
+{note.links.length} links
{/if} + {#if note.date && note.date !== ''} +{new Date(note.date).toLocaleDateString('en-US', { timeZone: 'UTC' })}
+