from rest_framework.parsers import MultiPartParser, FormParser from rest_framework import permissions, status from rest_framework import viewsets from rest_framework.response import Response from rest_framework.authentication import SessionAuthentication from django.http import HttpRequest from django.db.models import QuerySet from django.contrib.auth.models import User from .serializers import ProfileSerializer from .models import ProfileModel class ProfileViewSet(viewsets.ModelViewSet): queryset = ProfileModel.objects.all serializer_class = ProfileSerializer parser_classes = (MultiPartParser, FormParser) permission_classes = (permissions.IsAuthenticatedOrReadOnly,) def retrieve(self, request: HttpRequest, username=None): user = User.objects.filter(username=username) if (not user): return Response({"detail": "Profile not found."}, status=status.HTTP_404_NOT_FOUND) instance = self.queryset().get(pk=user[0].pk) instance.avatar.name = instance.avatar.name[instance.avatar.name.find("static") - 1:] return Response(self.serializer_class(instance).data, status=status.HTTP_200_OK) def retrieve_id(self, request: HttpRequest, pk=None): user = User.objects.filter(pk=pk) if (not user): return Response({"detail": "Profile not found."}, status=status.HTTP_404_NOT_FOUND) instance = self.queryset().get(pk=user[0].pk) instance.avatar.name = instance.avatar.name[instance.avatar.name.find("static") - 1:] return Response(self.serializer_class(instance).data, status=status.HTTP_200_OK) def list(self, request: HttpRequest): serializer = ProfileSerializer(self.queryset(), many=True) for profile in serializer.data: profile["avatar"] = profile["avatar"][profile["avatar"].find("static") - 1:] return Response(serializer.data) class MyProfileViewSet(viewsets.ModelViewSet): permission_classes = (permissions.IsAuthenticated,) authentication_classes = (SessionAuthentication,) serializer_class = ProfileSerializer queryset = ProfileModel.objects.all() def get_object(self): obj = self.queryset.get(pk=self.request.user.pk) return obj def perform_update(self, serializer: ProfileSerializer, pk=None): serializer.is_valid(raise_exception=True) avatar = serializer.validated_data.get('avatar') profile: ProfileModel = self.get_object() if (avatar is not None): if (profile.avatar.name != "./profiles/static/avatars/default.avif"): profile.avatar.storage.delete(profile.avatar.name) serializer.save() def delete_avatar(self, request, pk=None): profile = self.get_object() if (profile.avatar.name != './profiles/static/avatars/default.avif'): profile.avatar.storage.delete(profile.avatar.name) profile.avatar.name = './profiles/static/avatars/default.avif' profile.save() return Response(ProfileSerializer(profile).data) def retrieve(self, request: HttpRequest, pk=None): instance: ProfileModel = self.get_object() instance.avatar.name = instance.avatar.name[instance.avatar.name.find("static") - 1:] return Response(self.serializer_class(instance).data, status=status.HTTP_200_OK)