From 9d5d7941e77d440bc4348903508def9619cd8b6a Mon Sep 17 00:00:00 2001 From: Palwisha Akhtar Date: Thu, 19 Jun 2025 07:05:08 -0600 Subject: [PATCH] Retrieve VideoAsset and Recommendations using slug instead of id (#64) --- events/factories.py | 2 ++ events/tests/test_apis.py | 4 ++-- events/v1/urls.py | 4 ++-- events/v1/utils.py | 4 ++-- events/v1/views.py | 6 +++--- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/events/factories.py b/events/factories.py index becef28..f821130 100644 --- a/events/factories.py +++ b/events/factories.py @@ -3,6 +3,7 @@ from django.contrib.auth import get_user_model from django.utils import timezone +from django.utils.text import slugify from events.models import Event, EventPresenter, Playlist, Tag, VideoAsset @@ -28,6 +29,7 @@ class Meta: creator = factory.SubFactory(UserFactory) title = factory.Faker("sentence", nb_words=4) + slug = factory.LazyAttribute(lambda obj: slugify(obj.title)) description = factory.Faker("paragraph") event_time = factory.LazyFunction(lambda: timezone.now() + timezone.timedelta(days=30)) event_type = Event.EventType.SESSION diff --git a/events/tests/test_apis.py b/events/tests/test_apis.py index 0e6efcc..744fc1f 100644 --- a/events/tests/test_apis.py +++ b/events/tests/test_apis.py @@ -58,7 +58,7 @@ def test_list_events_with_and_without_videoasset(self, api_client): def test_video_asset_detail(self, api_client): """ Test retrieving a video asset detail """ video_asset = VideoAssetFactory() - response = api_client.get(reverse("video-asset-detail", args=[video_asset.event.id])) + response = api_client.get(reverse("video-asset-detail", args=[video_asset.event.slug])) assert response.status_code == status.HTTP_200_OK assert response.data["title"] == video_asset.title assert response.data["status"] == VideoAsset.VideoStatus.READY @@ -120,7 +120,7 @@ def test_event_recommendations(self, api_client): unrelated_event.playlists.add(other_playlist) unrelated_event.save() - response = api_client.get(reverse("recommendation", args=[event.id])) + response = api_client.get(reverse("recommendation", args=[event.slug])) assert response.status_code == status.HTTP_200_OK returned_ids = {e["id"] for e in response.data} diff --git a/events/v1/urls.py b/events/v1/urls.py index 7de6824..a8fd076 100644 --- a/events/v1/urls.py +++ b/events/v1/urls.py @@ -10,8 +10,8 @@ urlpatterns = [ path('all/', EventsListView.as_view(), name='events-list'), - path('videoasset//', VideoAssetDetailView.as_view(), name='video-asset-detail'), + path('videoasset//', VideoAssetDetailView.as_view(), name='video-asset-detail'), path('playlists/', PlaylistListView.as_view(), name='playlist-list'), path('tags/', TagListView.as_view(), name='tag-list'), - path('recommendations//', EventRecommendationsView.as_view(), name='recommendation') + path('recommendations//', EventRecommendationsView.as_view(), name='recommendation') ] diff --git a/events/v1/utils.py b/events/v1/utils.py index e4f9237..81f8c7b 100644 --- a/events/v1/utils.py +++ b/events/v1/utils.py @@ -4,12 +4,12 @@ from events.models import Event -def get_similar_events(event_id: int) -> list[Event]: +def get_similar_events(event_slug: str) -> list[Event]: """ Retrieve similar events based on playlists, presenters, and tags. Excludes the current event and returns a maximum of 5 latest events. """ - event = get_object_or_404(Event, id=event_id) + event = get_object_or_404(Event, slug=event_slug) exclude_current = ~Q(id=event.id) similarity_query = Q() diff --git a/events/v1/views.py b/events/v1/views.py index 0314b1e..5590f23 100644 --- a/events/v1/views.py +++ b/events/v1/views.py @@ -29,7 +29,7 @@ class VideoAssetDetailView(RetrieveAPIView): def get_object(self): obj = get_object_or_404( VideoAsset.objects.select_related('event__creator').prefetch_related('event__tags', 'event__playlists'), - event_id=self.kwargs["pk"] + event__slug=self.kwargs["event_slug"] ) return obj @@ -55,8 +55,8 @@ class PlaylistListView(ListAPIView): class EventRecommendationsView(APIView): """ View for listing similar events """ - def get(self, request, event_id, *args, **kwargs): + def get(self, request, event_slug, *args, **kwargs): """ Get similar events based on the same playlist, presenter or tags """ - similar_events = get_similar_events(event_id) + similar_events = get_similar_events(event_slug) serializer = EventSerializer(similar_events, many=True) return Response(serializer.data, status=status.HTTP_200_OK)