From c6d408924b2c8ea7fc505546fd3f94005859fd58 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Tue, 12 Dec 2017 22:04:39 +0100 Subject: [PATCH] Added artist filtering on API --- api/config/settings/common.py | 1 + api/funkwhale_api/music/filters.py | 12 ++++++++++++ api/funkwhale_api/music/tests/test_api.py | 15 +++++++++++++++ api/funkwhale_api/music/views.py | 5 ++++- api/requirements/base.txt | 1 + 5 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 api/funkwhale_api/music/filters.py diff --git a/api/config/settings/common.py b/api/config/settings/common.py index 3f7cc7503..87740e818 100644 --- a/api/config/settings/common.py +++ b/api/config/settings/common.py @@ -309,6 +309,7 @@ REST_FRAMEWORK = { ), 'DEFAULT_FILTER_BACKENDS': ( 'rest_framework.filters.OrderingFilter', + 'django_filters.rest_framework.DjangoFilterBackend', ) } diff --git a/api/funkwhale_api/music/filters.py b/api/funkwhale_api/music/filters.py new file mode 100644 index 000000000..ba3fa453d --- /dev/null +++ b/api/funkwhale_api/music/filters.py @@ -0,0 +1,12 @@ +import django_filters + +from . import models + + +class ArtistFilter(django_filters.FilterSet): + + class Meta: + model = models.Artist + fields = { + 'name': ['exact', 'iexact', 'startswith'] + } diff --git a/api/funkwhale_api/music/tests/test_api.py b/api/funkwhale_api/music/tests/test_api.py index 21a567084..b7c25424f 100644 --- a/api/funkwhale_api/music/tests/test_api.py +++ b/api/funkwhale_api/music/tests/test_api.py @@ -182,6 +182,21 @@ class TestAPI(TMPDirTestCaseMixin, TestCase): self.assertJSONEqual(expected, json.loads(response.content.decode('utf-8'))) + def test_can_search_artist_by_name_start(self): + artist1 = factories.ArtistFactory(name='alpha') + artist2 = factories.ArtistFactory(name='beta') + results = { + 'next': None, + 'previous': None, + 'count': 1, + 'results': [serializers.ArtistSerializerNested(artist1).data] + } + expected = json.dumps(results) + url = self.reverse('api:v1:artists-list') + response = self.client.get(url, {'name__startswith': 'a'}) + + self.assertJSONEqual(expected, json.loads(response.content.decode('utf-8'))) + def test_can_search_tracks(self): artist1 = models.Artist.objects.create(name='Test1') artist2 = models.Artist.objects.create(name='Test2') diff --git a/api/funkwhale_api/music/views.py b/api/funkwhale_api/music/views.py index 983192552..d149b5d1b 100644 --- a/api/funkwhale_api/music/views.py +++ b/api/funkwhale_api/music/views.py @@ -21,8 +21,10 @@ from taggit.models import Tag from . import models from . import serializers from . import importers +from . import filters from . import utils + class SearchMixin(object): search_fields = [] @@ -52,7 +54,8 @@ class ArtistViewSet(SearchMixin, viewsets.ReadOnlyModelViewSet): serializer_class = serializers.ArtistSerializerNested permission_classes = [ConditionalAuthentication] search_fields = ['name'] - ordering_fields = ('creation_date',) + ordering_fields = ('creation_date', 'name') + filter_class = filters.ArtistFilter class AlbumViewSet(SearchMixin, viewsets.ReadOnlyModelViewSet): diff --git a/api/requirements/base.txt b/api/requirements/base.txt index e7bc870cf..3a11afadf 100644 --- a/api/requirements/base.txt +++ b/api/requirements/base.txt @@ -45,6 +45,7 @@ django-taggit==0.22.1 persisting-theory==0.2.1 django-versatileimagefield==1.7.1 django-cachalot==1.5.0 +django-filter==1.1 django-rest-auth==0.9.1 beautifulsoup4==4.6.0 Markdown==2.6.8