Skip to content

Commit 9d5d794

Browse files
authored
Retrieve VideoAsset and Recommendations using slug instead of id (#64)
1 parent 008dc1e commit 9d5d794

File tree

5 files changed

+11
-9
lines changed

5 files changed

+11
-9
lines changed

events/factories.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from django.contrib.auth import get_user_model
55
from django.utils import timezone
6+
from django.utils.text import slugify
67

78
from events.models import Event, EventPresenter, Playlist, Tag, VideoAsset
89

@@ -28,6 +29,7 @@ class Meta:
2829

2930
creator = factory.SubFactory(UserFactory)
3031
title = factory.Faker("sentence", nb_words=4)
32+
slug = factory.LazyAttribute(lambda obj: slugify(obj.title))
3133
description = factory.Faker("paragraph")
3234
event_time = factory.LazyFunction(lambda: timezone.now() + timezone.timedelta(days=30))
3335
event_type = Event.EventType.SESSION

events/tests/test_apis.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def test_list_events_with_and_without_videoasset(self, api_client):
5858
def test_video_asset_detail(self, api_client):
5959
""" Test retrieving a video asset detail """
6060
video_asset = VideoAssetFactory()
61-
response = api_client.get(reverse("video-asset-detail", args=[video_asset.event.id]))
61+
response = api_client.get(reverse("video-asset-detail", args=[video_asset.event.slug]))
6262
assert response.status_code == status.HTTP_200_OK
6363
assert response.data["title"] == video_asset.title
6464
assert response.data["status"] == VideoAsset.VideoStatus.READY
@@ -120,7 +120,7 @@ def test_event_recommendations(self, api_client):
120120
unrelated_event.playlists.add(other_playlist)
121121
unrelated_event.save()
122122

123-
response = api_client.get(reverse("recommendation", args=[event.id]))
123+
response = api_client.get(reverse("recommendation", args=[event.slug]))
124124
assert response.status_code == status.HTTP_200_OK
125125

126126
returned_ids = {e["id"] for e in response.data}

events/v1/urls.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111
urlpatterns = [
1212
path('all/', EventsListView.as_view(), name='events-list'),
13-
path('videoasset/<int:pk>/', VideoAssetDetailView.as_view(), name='video-asset-detail'),
13+
path('videoasset/<slug:event_slug>/', VideoAssetDetailView.as_view(), name='video-asset-detail'),
1414
path('playlists/', PlaylistListView.as_view(), name='playlist-list'),
1515
path('tags/', TagListView.as_view(), name='tag-list'),
16-
path('recommendations/<event_id>/', EventRecommendationsView.as_view(), name='recommendation')
16+
path('recommendations/<slug:event_slug>/', EventRecommendationsView.as_view(), name='recommendation')
1717
]

events/v1/utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
from events.models import Event
55

66

7-
def get_similar_events(event_id: int) -> list[Event]:
7+
def get_similar_events(event_slug: str) -> list[Event]:
88
"""
99
Retrieve similar events based on playlists, presenters, and tags.
1010
Excludes the current event and returns a maximum of 5 latest events.
1111
"""
12-
event = get_object_or_404(Event, id=event_id)
12+
event = get_object_or_404(Event, slug=event_slug)
1313
exclude_current = ~Q(id=event.id)
1414
similarity_query = Q()
1515

events/v1/views.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class VideoAssetDetailView(RetrieveAPIView):
2929
def get_object(self):
3030
obj = get_object_or_404(
3131
VideoAsset.objects.select_related('event__creator').prefetch_related('event__tags', 'event__playlists'),
32-
event_id=self.kwargs["pk"]
32+
event__slug=self.kwargs["event_slug"]
3333
)
3434
return obj
3535

@@ -55,8 +55,8 @@ class PlaylistListView(ListAPIView):
5555
class EventRecommendationsView(APIView):
5656
""" View for listing similar events """
5757

58-
def get(self, request, event_id, *args, **kwargs):
58+
def get(self, request, event_slug, *args, **kwargs):
5959
""" Get similar events based on the same playlist, presenter or tags """
60-
similar_events = get_similar_events(event_id)
60+
similar_events = get_similar_events(event_slug)
6161
serializer = EventSerializer(similar_events, many=True)
6262
return Response(serializer.data, status=status.HTTP_200_OK)

0 commit comments

Comments
 (0)