Skip to content
Snippets Groups Projects
views.py 2.69 KiB
Newer Older
  • Learn to ignore specific revisions
  • 
    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
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    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
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    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"
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    class InstanceSettings(views.APIView):
        permission_classes = []
        authentication_classes = []
    
        def get(self, request, *args, **kwargs):
            manager = global_preferences_registry.manager()
            manager.all()
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            all_preferences = manager.model.objects.all().order_by("section", "name")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                p for p in all_preferences if getattr(p.preference, "show_in_api", False)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            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 = {}
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            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)