See #206: added API endpoint for managing settings

This commit is contained in:
Eliot Berriot 2018-05-17 23:39:34 +02:00
parent 0dc9cdabab
commit 13c5219d71
No known key found for this signature in database
GPG Key ID: DD6965E2476E5C27
4 changed files with 42 additions and 3 deletions

View File

@ -1,9 +1,11 @@
from django.conf.urls import url
from rest_framework import routers
from . import views
admin_router = routers.SimpleRouter()
admin_router.register(r'admin/settings', views.AdminSettings, 'admin-settings')
urlpatterns = [
url(r'^nodeinfo/2.0/$', views.NodeInfo.as_view(), name='nodeinfo-2.0'),
url(r'^settings/$', views.InstanceSettings.as_view(), name='settings'),
]
] + admin_router.urls

View File

@ -2,6 +2,7 @@ from rest_framework import views
from rest_framework.response import Response
from dynamic_preferences.api import serializers
from dynamic_preferences.api import viewsets as preferences_viewsets
from dynamic_preferences.registries import global_preferences_registry
from funkwhale_api.common import preferences
@ -15,6 +16,10 @@ NODEINFO_2_CONTENT_TYPE = (
)
class AdminSettings(preferences_viewsets.GlobalPreferencesViewSet):
pagination_class = None
class InstanceSettings(views.APIView):
permission_classes = []
authentication_classes = []

View File

@ -6,7 +6,7 @@ import os
import uuid
from django.conf import settings
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.models import AbstractUser, Permission
from django.urls import reverse
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
@ -55,6 +55,10 @@ class User(AbstractUser):
def __str__(self):
return self.username
def add_permission(self, codename):
p = Permission.objects.get(codename=codename)
self.user_permissions.add(p)
def get_absolute_url(self):
return reverse('users:detail', kwargs={'username': self.username})

View File

@ -21,3 +21,31 @@ def test_nodeinfo_endpoint_disabled(db, api_client, preferences):
response = api_client.get(url)
assert response.status_code == 404
def test_settings_only_list_public_settings(db, api_client, preferences):
url = reverse('api:v1:instance:settings')
response = api_client.get(url)
for conf in response.data:
p = preferences.model.objects.get(
section=conf['section'], name=conf['name'])
assert p.preference.show_in_api is True
def test_admin_settings_restrict_access(db, logged_in_api_client, preferences):
url = reverse('api:v1:instance:admin-settings-list')
response = logged_in_api_client.get(url)
assert response.status_code == 403
def test_admin_settings_correct_permission(
db, logged_in_api_client, preferences):
user = logged_in_api_client.user
user.add_permission('change_globalpreferencemodel')
url = reverse('api:v1:instance:admin-settings-list')
response = logged_in_api_client.get(url)
assert response.status_code == 200
assert len(response.data) == len(preferences.all())