From c6d408924b2c8ea7fc505546fd3f94005859fd58 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
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 3f7cc750..87740e81 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 00000000..ba3fa453
--- /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 21a56708..b7c25424 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 98319255..d149b5d1 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 e7bc870c..3a11afad 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
-- 
GitLab