from rest_framework import status from rest_framework.authtoken.models import Token from rest_framework.permissions import AllowAny, IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView from .serializers import ( E621CredentialsSerializer, RegisterSerializer, UserSerializer, ) class RegisterView(APIView): permission_classes = [AllowAny] def post(self, request): serializer = RegisterSerializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.save() token, _ = Token.objects.get_or_create(user=user) return Response( {"token": token.key, "user": UserSerializer(user).data}, status=status.HTTP_201_CREATED, ) class MeView(APIView): permission_classes = [IsAuthenticated] def get(self, request): return Response(UserSerializer(request.user).data) class LogoutView(APIView): permission_classes = [IsAuthenticated] def post(self, request): if request.auth: request.auth.delete() return Response(status=status.HTTP_204_NO_CONTENT) class E621CredentialsView(APIView): """Store the e621 credentials used by the user's browser to call e621 directly.""" permission_classes = [IsAuthenticated] def _payload(self, user): return { "username": user.e621_username, "api_key": user.e621_api_key, "base_url": user.e621_base_url, "configured": user.e621_configured, } def get(self, request): return Response(self._payload(request.user)) def put(self, request): serializer = E621CredentialsSerializer(data=request.data) serializer.is_valid(raise_exception=True) data = serializer.validated_data user = request.user user.e621_username = data["username"].strip() user.e621_api_key = data["api_key"].strip() user.e621_base_url = ( (data.get("base_url") or "https://e621.net").strip().rstrip("/") ) user.save( update_fields=["e621_username", "e621_api_key", "e621_base_url"] ) return Response(self._payload(user))