78 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
import json
 | 
						|
import logging
 | 
						|
 | 
						|
from django.conf import settings
 | 
						|
 | 
						|
from dynamic_preferences.api import serializers
 | 
						|
from dynamic_preferences.api import viewsets as preferences_viewsets
 | 
						|
from dynamic_preferences.registries import global_preferences_registry
 | 
						|
from rest_framework import views
 | 
						|
from rest_framework.response import Response
 | 
						|
 | 
						|
from funkwhale_api.common import middleware
 | 
						|
from funkwhale_api.common import preferences
 | 
						|
from funkwhale_api.federation import utils as federation_utils
 | 
						|
from funkwhale_api.users.oauth import permissions as oauth_permissions
 | 
						|
 | 
						|
from . import nodeinfo
 | 
						|
 | 
						|
NODEINFO_2_CONTENT_TYPE = "application/json; profile=http://nodeinfo.diaspora.software/ns/schema/2.0#; charset=utf-8"  # noqa
 | 
						|
 | 
						|
 | 
						|
logger = logging.getLogger(__name__)
 | 
						|
 | 
						|
 | 
						|
class AdminSettings(preferences_viewsets.GlobalPreferencesViewSet):
 | 
						|
    pagination_class = None
 | 
						|
    permission_classes = [oauth_permissions.ScopePermission]
 | 
						|
    required_scope = "instance:settings"
 | 
						|
 | 
						|
 | 
						|
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)
 | 
						|
 | 
						|
 | 
						|
class NodeInfo(views.APIView):
 | 
						|
    permission_classes = []
 | 
						|
    authentication_classes = []
 | 
						|
 | 
						|
    def get(self, request, *args, **kwargs):
 | 
						|
        try:
 | 
						|
            data = nodeinfo.get()
 | 
						|
        except ValueError:
 | 
						|
            logger.warn("nodeinfo returned invalid json")
 | 
						|
            data = {}
 | 
						|
        return Response(data, status=200, content_type=NODEINFO_2_CONTENT_TYPE)
 | 
						|
 | 
						|
 | 
						|
class SpaManifest(views.APIView):
 | 
						|
    permission_classes = []
 | 
						|
    authentication_classes = []
 | 
						|
 | 
						|
    def get(self, request, *args, **kwargs):
 | 
						|
        existing_manifest = middleware.get_spa_file(
 | 
						|
            settings.FUNKWHALE_SPA_HTML_ROOT, "manifest.json"
 | 
						|
        )
 | 
						|
        parsed_manifest = json.loads(existing_manifest)
 | 
						|
        parsed_manifest["short_name"] = settings.APP_NAME
 | 
						|
        parsed_manifest["start_url"] = federation_utils.full_url("/")
 | 
						|
        instance_name = preferences.get("instance__name")
 | 
						|
        if instance_name:
 | 
						|
            parsed_manifest["short_name"] = instance_name
 | 
						|
            parsed_manifest["name"] = instance_name
 | 
						|
        instance_description = preferences.get("instance__short_description")
 | 
						|
        if instance_description:
 | 
						|
            parsed_manifest["description"] = instance_description
 | 
						|
        return Response(parsed_manifest, status=200)
 |