diff --git a/backend/server/adventures/urls.py b/backend/server/adventures/urls.py index 2eb2573..10cdb1a 100644 --- a/backend/server/adventures/urls.py +++ b/backend/server/adventures/urls.py @@ -1,12 +1,13 @@ from django.urls import include, path from rest_framework.routers import DefaultRouter -from .views import AdventureViewSet, CollectionViewSet, StatsViewSet, GenerateDescription +from .views import AdventureViewSet, CollectionViewSet, StatsViewSet, GenerateDescription, ActivityTypesView router = DefaultRouter() router.register(r'adventures', AdventureViewSet, basename='adventures') router.register(r'collections', CollectionViewSet, basename='collections') router.register(r'stats', StatsViewSet, basename='stats') router.register(r'generate', GenerateDescription, basename='generate') +router.register(r'activity-types', ActivityTypesView, basename='activity-types') urlpatterns = [ diff --git a/backend/server/adventures/views.py b/backend/server/adventures/views.py index cd64725..d0a1b0c 100644 --- a/backend/server/adventures/views.py +++ b/backend/server/adventures/views.py @@ -139,6 +139,17 @@ class AdventureViewSet(viewsets.ModelViewSet): serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) + + @action(detail=False, methods=['get']) + def search(self, request): + query = self.request.query_params.get('query', '') + queryset = Adventure.objects.filter( + (Q(name__icontains=query) | Q(description__icontains=query) | Q(location__icontains=query) | Q(activity_types__icontains=query)) & + (Q(user_id=request.user.id) | Q(is_public=True)) +) + queryset = self.apply_sorting(queryset) + adventures = self.paginate_and_respond(queryset, request) + return adventures def paginate_and_respond(self, queryset, request): paginator = self.pagination_class() @@ -330,4 +341,31 @@ class GenerateDescription(viewsets.ViewSet): if extract.get('original') is None: return Response({"error": "No image found"}, status=400) return Response(extract["original"]) - \ No newline at end of file + + +class ActivityTypesView(viewsets.ViewSet): + permission_classes = [IsAuthenticated] + + @action(detail=False, methods=['get']) + def types(self, request): + """ + Retrieve a list of distinct activity types for adventures associated with the current user. + + Args: + request (HttpRequest): The HTTP request object. + + Returns: + Response: A response containing a list of distinct activity types. + """ + types = Adventure.objects.filter(user_id=request.user.id).values_list('activity_types', flat=True).distinct() + + allTypes = [] + + for i in types: + if not i: + continue + for x in i: + if x and x not in allTypes: + allTypes.append(x) + + return Response(allTypes) diff --git a/frontend/src/lib/components/ActivityComplete.svelte b/frontend/src/lib/components/ActivityComplete.svelte new file mode 100644 index 0000000..ac04ea6 --- /dev/null +++ b/frontend/src/lib/components/ActivityComplete.svelte @@ -0,0 +1,91 @@ + + +
Hi, {user.first_name} {user.last_name}
+