Skip to content
Snippets Groups Projects
Forked from funkwhale / funkwhale
7052 commits behind the upstream repository.
views.py 2.64 KiB
from rest_framework.response import Response
from rest_framework import mixins
from rest_framework import viewsets
from rest_framework.decorators import detail_route, list_route

from rest_auth.registration.views import RegisterView as BaseRegisterView
from allauth.account.adapter import get_adapter

from funkwhale_api.common import preferences

from . import models
from . import serializers


class RegisterView(BaseRegisterView):

    def create(self, request, *args, **kwargs):
        if not self.is_open_for_signup(request):
            r = {
                'detail': 'Registration has been disabled',
            }
            return Response(r, status=403)
        return super().create(request, *args, **kwargs)

    def is_open_for_signup(self, request):
        return get_adapter().is_open_for_signup(request)


class UserViewSet(
        mixins.UpdateModelMixin,
        viewsets.GenericViewSet):
    queryset = models.User.objects.all()
    serializer_class = serializers.UserWriteSerializer
    lookup_field = 'username'

    @list_route(methods=['get'])
    def me(self, request, *args, **kwargs):
        """Return information about the current user"""
        serializer = serializers.UserReadSerializer(request.user)
        return Response(serializer.data)

    @detail_route(
        methods=['get', 'post', 'delete'], url_path='subsonic-token')
    def subsonic_token(self, request, *args, **kwargs):
        if not self.request.user.username == kwargs.get('username'):
            return Response(status=403)
        if not preferences.get('subsonic__enabled'):
            return Response(status=405)
        if request.method.lower() == 'get':
            return Response({
                'subsonic_api_token': self.request.user.subsonic_api_token
            })
        if request.method.lower() == 'delete':
            self.request.user.subsonic_api_token = None
            self.request.user.save(update_fields=['subsonic_api_token'])
            return Response(status=204)
        self.request.user.update_subsonic_api_token()
        self.request.user.save(update_fields=['subsonic_api_token'])
        data = {
            'subsonic_api_token': self.request.user.subsonic_api_token
        }
        return Response(data)

    def update(self, request, *args, **kwargs):
        if not self.request.user.username == kwargs.get('username'):
            return Response(status=403)
        return super().update(request, *args, **kwargs)

    def partial_update(self, request, *args, **kwargs):
        if not self.request.user.username == kwargs.get('username'):
            return Response(status=403)
        return super().partial_update(request, *args, **kwargs)