diff --git a/api/funkwhale_api/federation/filters.py b/api/funkwhale_api/federation/filters.py index a43c2dc0c7c870374bbb2ae62405669a94cbc57d..d76fe7ad0f11fb6320f44bee1644bdcb86dab6df 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 0fe52e1f5f08d0bf13111169c2c3eaa984c588c0..cf59eaa63ac0ad0cce1246b7637fffdc6ea3fbd6 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 5b11942f23182a0f80bec3efbada9a91d31c0102..bceac4243b5ddfae78da38920b70e67300bed5f7 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 3bc9fa88f276b868fdc47f638054d5ae3da10590..a2786be09e079557a62096966c7da99836a43ef4 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, + ]