diff --git a/api/config/api_urls.py b/api/config/api_urls.py index d64eeb5fdbb62b5cdfaceaef8740a82cc9d9c2ef..c7ebc4ed3668196ccd11d6844ba14d704e3ba43e 100644 --- a/api/config/api_urls.py +++ b/api/config/api_urls.py @@ -1,5 +1,6 @@ from rest_framework import routers from django.conf.urls import include, url +from funkwhale_api.instance import views as instance_views from funkwhale_api.music import views from funkwhale_api.playlists import views as playlists_views from rest_framework_jwt import views as jwt_views @@ -25,6 +26,10 @@ router.register( v1_patterns = router.urls v1_patterns += [ + url(r'^instance/', + include( + ('funkwhale_api.instance.urls', 'instance'), + namespace='instance')), url(r'^providers/', include( ('funkwhale_api.providers.urls', 'providers'), diff --git a/api/config/settings/common.py b/api/config/settings/common.py index 6f821dfba4de6a3b8af13dd7273c7a3e213cbf2c..2761f91521809ee5dd843584603f3907bc0d2930 100644 --- a/api/config/settings/common.py +++ b/api/config/settings/common.py @@ -60,6 +60,7 @@ THIRD_PARTY_APPS = ( LOCAL_APPS = ( 'funkwhale_api.users', # custom users app # Your stuff: custom apps go here + 'funkwhale_api.instance', 'funkwhale_api.music', 'funkwhale_api.favorites', 'funkwhale_api.radios', diff --git a/api/funkwhale_api/instance/__init__.py b/api/funkwhale_api/instance/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/api/funkwhale_api/instance/urls.py b/api/funkwhale_api/instance/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..2f2b46b87a4fe301387c5e134cc7a6fcdf6291b2 --- /dev/null +++ b/api/funkwhale_api/instance/urls.py @@ -0,0 +1,7 @@ +from django.conf.urls import url +from . import views + + +urlpatterns = [ + url(r'^settings/$', views.InstanceSettings.as_view(), name='settings'), +] diff --git a/api/funkwhale_api/instance/views.py b/api/funkwhale_api/instance/views.py new file mode 100644 index 0000000000000000000000000000000000000000..44ee228735d0ad7297dcf31d513ecc087d8c9d59 --- /dev/null +++ b/api/funkwhale_api/instance/views.py @@ -0,0 +1,25 @@ +from rest_framework import views +from rest_framework.response import Response + +from dynamic_preferences.api import serializers +from dynamic_preferences.registries import global_preferences_registry + + +class InstanceSettings(views.APIView): + permission_classes = [] + authentication_classes = [] + + def get(self, request, *args, **kwargs): + manager = global_preferences_registry.manager() + manager.all() + all_preferences = manager.model.objects.all().order_by( + 'section', 'name' + ) + api_preferences = [ + p + for p in all_preferences + if getattr(p.preference, 'show_in_api', False) + ] + data = serializers.GlobalPreferenceSerializer( + api_preferences, many=True).data + return Response(data, status=200) diff --git a/api/tests/conftest.py b/api/tests/conftest.py index 6c0cffa4e0da24ed87501a692464598563de2480..4d7a6fa981d1431cd01a97d4578d2a992b4cb749 100644 --- a/api/tests/conftest.py +++ b/api/tests/conftest.py @@ -3,6 +3,7 @@ import shutil import pytest from django.core.cache import cache as django_cache from dynamic_preferences.registries import global_preferences_registry +from rest_framework.test import APIClient from funkwhale_api.taskapp import celery @@ -29,7 +30,9 @@ def factories(db): @pytest.fixture def preferences(db): - yield global_preferences_registry.manager() + manager = global_preferences_registry.manager() + manager.all() + yield manager @pytest.fixture @@ -48,6 +51,11 @@ def logged_in_client(db, factories, client): delattr(client, 'user') +@pytest.fixture +def api_client(client): + return APIClient() + + @pytest.fixture def superuser_client(db, factories, client): user = factories['users.SuperUser']() diff --git a/api/tests/instance/test_preferences.py b/api/tests/instance/test_preferences.py new file mode 100644 index 0000000000000000000000000000000000000000..c89bfa3492091a93d0000f661bd83f2fc8ebedc0 --- /dev/null +++ b/api/tests/instance/test_preferences.py @@ -0,0 +1,22 @@ +from django.urls import reverse + +from dynamic_preferences.api import serializers + + +def test_can_list_settings_via_api(preferences, api_client): + url = reverse('api:v1:instance:settings') + all_preferences = preferences.model.objects.all() + expected_preferences = { + p.preference.identifier(): p + for p in all_preferences + if getattr(p.preference, 'show_in_api', False)} + + assert len(expected_preferences) > 0 + + response = api_client.get(url) + assert response.status_code == 200 + assert len(response.data) == len(expected_preferences) + + for p in response.data: + i = '__'.join([p['section'], p['name']]) + assert i in expected_preferences