diff --git a/api/funkwhale_api/radios/views.py b/api/funkwhale_api/radios/views.py index 7882135fd..74a0ec44b 100644 --- a/api/funkwhale_api/radios/views.py +++ b/api/funkwhale_api/radios/views.py @@ -136,8 +136,9 @@ class V1_RadioSessionTrackViewSet(mixins.CreateModelMixin, viewsets.GenericViewS session = serializer.validated_data["session"] if not request.user.is_authenticated and not request.session.session_key: self.request.session.create() - if not request.user == session.user or not ( - request.session.session_key == session.session_key and session.session_key + if not request.user == session.user or ( + not request.session.session_key == session.session_key + and not session.session_key ): return Response(status=status.HTTP_403_FORBIDDEN) @@ -164,18 +165,19 @@ class V1_RadioSessionTrackViewSet(mixins.CreateModelMixin, viewsets.GenericViewS return super().get_serializer_class(*args, **kwargs) -class RadioSessionTracksViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet): +class RadioSessionTracksViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): """Return a list of RadioSessionTracks""" serializer_class = serializers.RadioSessionTrackSerializer queryset = models.RadioSessionTrack.objects.all() permission_classes = [] - @extend_schema(operation_id="get_radio_tracks") - def create(self, request, *args, **kwargs): - serializer = self.get_serializer(data=request.data) + @extend_schema(operation_id="get_radio_tracks_get") + def list(self, request, *args, **kwargs): + serializer = self.get_serializer(data=request.query_params) serializer.is_valid(raise_exception=True) session = serializer.validated_data["session"] + count = ( serializer.validated_data["count"] if "count" in serializer.validated_data.keys() @@ -183,18 +185,18 @@ class RadioSessionTracksViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet ) # this is used for test purpose. filter_playable = ( - request.data["filter_playable"] - if "filter_playable" in request.data.keys() + request.query_params["filter_playable"] + if "filter_playable" in request.query_params.keys() else True ) if not request.user.is_authenticated and not request.session.session_key: self.request.session.create() - if not request.user == session.user or not ( - request.session.session_key == session.session_key and session.session_key + if not request.user == session.user or ( + not request.session.session_key == session.session_key + and not session.session_key ): return Response(status=status.HTTP_403_FORBIDDEN) - try: session.radio.pick_many_v2(count, filter_playable=filter_playable) except ValueError: @@ -213,7 +215,6 @@ class RadioSessionTracksViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet many="true", ) serializer.is_valid() - headers = self.get_success_headers(serializer.data) # delete the tracks we sent from the cache new_cached_radiotracks = evaluated_radio_tracks[count:] @@ -222,10 +223,11 @@ class RadioSessionTracksViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet ) return Response( - serializer.data, status=status.HTTP_201_CREATED, headers=headers + serializer.data, + status=status.HTTP_201_CREATED, ) def get_serializer_class(self, *args, **kwargs): - if self.action == "create": + if self.action == "list": return serializers.RadioSessionTrackSerializerCreate return super().get_serializer_class(*args, **kwargs) diff --git a/api/tests/radios/test_radios.py b/api/tests/radios/test_radios.py index 2c1fcb290..45c3767d0 100644 --- a/api/tests/radios/test_radios.py +++ b/api/tests/radios/test_radios.py @@ -203,7 +203,7 @@ def test_can_get_track_for_session_from_api_v2(factories, logged_in_api_client): session = models.RadioSession.objects.latest("id") url = reverse("api:v2:radios:tracks-list") - response = logged_in_api_client.post(url, {"session": session.pk}) + response = logged_in_api_client.get(url, {"session": session.pk}) data = json.loads(response.content.decode("utf-8")) assert data[0]["track"]["id"] == track.pk @@ -212,7 +212,7 @@ def test_can_get_track_for_session_from_api_v2(factories, logged_in_api_client): next_track = factories["music.Upload"]( library__actor=actor, import_status="finished" ).track - response = logged_in_api_client.post(url, {"session": session.pk}) + response = logged_in_api_client.get(url, {"session": session.pk}) data = json.loads(response.content.decode("utf-8")) assert data[0]["track"]["id"] == next_track.id @@ -470,7 +470,7 @@ def test_session_radio_excludes_previous_picks_v2(factories, logged_in_api_clien previous_choices = [] for i in range(5): - response = logged_in_api_client.post( + response = logged_in_api_client.get( url, {"session": session.pk, "filter_playable": False} ) pick = json.loads(response.content.decode("utf-8")) @@ -478,7 +478,7 @@ def test_session_radio_excludes_previous_picks_v2(factories, logged_in_api_clien assert pick[0]["track"]["title"] in [t.title for t in tracks] previous_choices.append(pick[0]["track"]["title"]) - response = logged_in_api_client.post(url, {"session": session.pk}) + response = logged_in_api_client.get(url, {"session": session.pk}) assert ( json.loads(response.content.decode("utf-8")) == "Radio doesn't have more candidates" @@ -542,10 +542,10 @@ def test_regenerate_cache_if_not_enought_tracks_in_it( response = logged_in_api_client.post(url, {"radio_type": "random"}) session = models.RadioSession.objects.latest("id") url = reverse("api:v2:radios:tracks-list") - logged_in_api_client.post( + logged_in_api_client.get( url, {"session": session.pk, "count": 9, "filter_playable": False} ) - response = logged_in_api_client.post( + response = logged_in_api_client.get( url, {"session": session.pk, "count": 10, "filter_playable": False} ) pick = json.loads(response.content.decode("utf-8"))