From fe7ca088c58fcf43911e3c102fef0454b820596e Mon Sep 17 00:00:00 2001 From: Eliot Berriot <contact@eliotberriot.com> Date: Tue, 10 Apr 2018 23:34:57 +0200 Subject: [PATCH] Library list endpoint --- api/funkwhale_api/federation/filters.py | 14 ++++++++++++++ api/funkwhale_api/federation/serializers.py | 20 ++++++++++++++++++++ api/funkwhale_api/federation/views.py | 18 ++++++++++++++++-- api/tests/federation/test_views.py | 14 ++++++++++++++ 4 files changed, 64 insertions(+), 2 deletions(-) diff --git a/api/funkwhale_api/federation/filters.py b/api/funkwhale_api/federation/filters.py index a43c2dc0..d76fe7ad 100644 --- a/api/funkwhale_api/federation/filters.py +++ b/api/funkwhale_api/federation/filters.py @@ -3,6 +3,20 @@ import django_filters from . import models +class LibraryFilter(django_filters.FilterSet): + approved = django_filters.BooleanFilter('following__approved') + + class Meta: + model = models.Library + fields = { + 'approved': ['exact'], + 'federation_enabled': ['exact'], + 'download_files': ['exact'], + 'autoimport': ['exact'], + 'tracks_count': ['exact'], + } + + class FollowFilter(django_filters.FilterSet): ordering = django_filters.OrderingFilter( # tuple-mapping retains order diff --git a/api/funkwhale_api/federation/serializers.py b/api/funkwhale_api/federation/serializers.py index 0fe52e1f..cf59eaa6 100644 --- a/api/funkwhale_api/federation/serializers.py +++ b/api/funkwhale_api/federation/serializers.py @@ -137,6 +137,26 @@ class LibraryActorSerializer(ActorSerializer): return validated_data +class APILibrarySerializer(serializers.ModelSerializer): + actor = APIActorSerializer + + class Meta: + model = models.Library + fields = [ + 'actor', + 'autoimport', + 'federation_enabled', + 'download_files', + 'tracks_count', + 'url', + 'uuid', + 'creation_date', + 'follow', + 'fetched_date', + 'modification_date', + ] + + class APILibraryCreateSerializer(serializers.ModelSerializer): actor = serializers.URLField() diff --git a/api/funkwhale_api/federation/views.py b/api/funkwhale_api/federation/views.py index 5b11942f..bceac424 100644 --- a/api/funkwhale_api/federation/views.py +++ b/api/funkwhale_api/federation/views.py @@ -5,6 +5,7 @@ from django.db import transaction from django.http import HttpResponse from django.urls import reverse +from rest_framework import mixins from rest_framework import permissions as rest_permissions from rest_framework import response from rest_framework import views @@ -164,9 +165,22 @@ class MusicFilesViewSet(FederationMixin, viewsets.GenericViewSet): return response.Response(data) -class LibraryViewSet(viewsets.GenericViewSet): +class LibraryViewSet( + mixins.ListModelMixin, + viewsets.GenericViewSet): permission_classes = [rest_permissions.DjangoModelPermissions] - queryset = models.Library.objects.all() + queryset = models.Library.objects.all().select_related( + 'actor', + 'follow', + ) + filter_class = filters.LibraryFilter + serializer_class = serializers.APILibrarySerializer + ordering_fields = ( + 'id', + 'creation_date', + 'fetched_date', + 'actor__domain', + ) @list_route(methods=['get']) def scan(self, request, *args, **kwargs): diff --git a/api/tests/federation/test_views.py b/api/tests/federation/test_views.py index 3bc9fa88..a2786be0 100644 --- a/api/tests/federation/test_views.py +++ b/api/tests/federation/test_views.py @@ -261,3 +261,17 @@ def test_can_list_system_actor_followers(factories, superuser_api_client): assert response.data['results'] == [ serializers.APIFollowSerializer(follow2).data ] + + +def test_can_list_libraries(factories, superuser_api_client): + library1 = factories['federation.Library']() + library2 = factories['federation.Library']() + + url = reverse('api:v1:federation:libraries-list') + response = superuser_api_client.get(url) + + assert response.status_code == 200 + assert response.data['results'] == [ + serializers.APILibrarySerializer(library1).data, + serializers.APILibrarySerializer(library2).data, + ] -- GitLab