profiles: use of OneToOneField to access profile through user

This commit is contained in:
AdrienLSH
2024-04-18 09:29:36 +02:00
parent 96b0d493e5
commit 5a2da91d6e
5 changed files with 34 additions and 48 deletions

View File

@ -2,7 +2,7 @@ from __future__ import annotations
from os.path import splitext
from django.contrib.auth.models import User
from django.db.models import Q, Model, CASCADE, ForeignKey, ImageField
from django.db.models import Q, Model, CASCADE, ForeignKey, ImageField, OneToOneField
from django.db.models.signals import post_save, pre_delete
from django.dispatch import receiver
@ -10,8 +10,9 @@ from django.dispatch import receiver
def upload_to(instance, filename: str):
return f"./profiles/static/avatars/{instance.pk}{splitext(filename)[1]}"
class ProfileModel(Model):
user = ForeignKey(User, on_delete=CASCADE)
user = OneToOneField(User, on_delete=CASCADE)
avatar = ImageField(upload_to=upload_to, default="./profiles/static/avatars/default.avif")
def get_game(self) -> int:

View File

@ -4,8 +4,8 @@ from rest_framework import permissions, status
from rest_framework.authentication import SessionAuthentication
from rest_framework.request import Request
from django.contrib.auth.models import User
from django.utils.translation import gettext as _
from django.shortcuts import get_object_or_404
from ..models import BlockModel, ProfileModel
from ..serializers.ProfileSerializer import ProfileSerializer
@ -16,7 +16,7 @@ class GetBlocksView(APIView):
authentication_classes = (SessionAuthentication,)
def get(self, request: Request):
blocks = BlockModel.objects.filter(blocker=ProfileModel.objects.filter(user=request.user).first())
blocks = BlockModel.objects.filter(blocker=request.user.profilemodel)
bloked_profiles = [block.blocked for block in blocks]
return Response(ProfileSerializer(bloked_profiles, many=True).data)
@ -26,32 +26,32 @@ class EditBlocksView(APIView):
permission_classes = (permissions.IsAuthenticated,)
authentication_classes = (SessionAuthentication,)
def get_object(self):
return self.request.user.profilemodel
def post(self, request, pk=None):
if (pk == request.user.pk):
user_profile = self.get_object()
blocked_profile = get_object_or_404(ProfileModel, pk=pk)
if user_profile.pk == pk:
return Response(_('You can\'t block yourself.'), status.HTTP_400_BAD_REQUEST)
blocked = User.objects.filter(pk=pk)
if (not blocked.exists()):
return Response(_('This user doesn\'t exist.'), status.HTTP_404_NOT_FOUND)
if BlockModel.objects.filter(blocker=user_profile, blocked=blocked_profile):
return Response(_('You already blocked this user.'), status.HTTP_409_CONFLICT)
if (BlockModel.objects.filter(blocker=request.user, blocked=pk)):
return Response(_('You already blocked this user.'), status=status.HTTP_409_CONFLICT)
BlockModel(blocker=request.user, blocked=blocked[0]).save()
return Response(status=status.HTTP_201_CREATED)
BlockModel(blocker=user_profile, blocked=blocked_profile).save()
return Response(_('User successfully blocked.'), status.HTTP_201_CREATED)
def delete(self, request, pk=None):
if (pk == request.user.pk):
user_profile = self.get_object()
blocked_profile = get_object_or_404(ProfileModel, pk=pk)
if user_profile.pk == pk:
return Response(_('You can\'t unblock yourself.'), status.HTTP_400_BAD_REQUEST)
blocked = User.objects.filter(pk=pk)
if (not blocked.exists()):
return Response(_('This user doesn\'t exist.'), status.HTTP_404_NOT_FOUND)
block_record = BlockModel.objects.filter(blocker=user_profile, blocked=blocked_profile).first()
if not block_record:
return Response(_('This user is not blocked.'), status.HTTP_400_BAD_REQUEST)
block = BlockModel.objects.filter(blocker=request.user, blocked=blocked[0])
if (not block):
return Response(_('This user isn\'t blocked.'), status.HTTP_400_NOT_FOUND)
block.delete()
return Response(status=status.HTTP_200_OK)
block_record.delete()
return Response(_('User successfully unblocked.'), status.HTTP_200_OK)

View File

@ -4,7 +4,6 @@ from rest_framework import permissions, status
from rest_framework.authentication import SessionAuthentication
from django.utils.translation import gettext as _
from django.db.models import Q
from django.shortcuts import get_object_or_404
from ..models import ProfileModel, FriendModel
@ -16,11 +15,7 @@ class GetFriendsView(APIView):
authentication_classes = (SessionAuthentication,)
def get(self, request):
query = ProfileModel.objects.filter(user=request.user)
if not query.exists():
return Response(status=status.HTTP_400_BAD_REQUEST)
friends = query[0].get_friends()
return Response(ProfileSerializer(friends, many=True).data)
return Response(ProfileSerializer(request.user.profilemodel.get_friends(), many=True).data)
class EditFriendView(APIView):
@ -28,7 +23,7 @@ class EditFriendView(APIView):
authentication_classes = (SessionAuthentication,)
def get_object(self):
return ProfileModel.objects.get(pk=self.request.user.pk)
return self.request.user.profilemodel
def post(self, request, pk=None):
user_profile = self.get_object()

View File

@ -14,8 +14,7 @@ class MyProfileViewSet(viewsets.ModelViewSet):
queryset = ProfileModel.objects.all()
def get_object(self):
obj = self.get_queryset().get(pk=self.request.user.pk)
return obj
return self.request.user.profilemodel
def perform_update(self, serializer: ProfileSerializer, pk=None):
serializer.is_valid(raise_exception=True)

View File

@ -1,7 +1,7 @@
from django.utils.translation import gettext as _
from django.contrib.auth.models import User
from django.shortcuts import get_object_or_404
from rest_framework import permissions, status
from rest_framework import permissions
from rest_framework import viewsets
from rest_framework.response import Response
@ -15,21 +15,12 @@ class ProfileViewSet(viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
def retrieve(self, request, username=None):
query = User.objects.filter(username=username)
if (not query):
return Response({"detail": _("Profile not found.")}, status.HTTP_404_NOT_FOUND)
query = self.get_queryset().filter(pk=query[0].pk)
if (not query):
return Response({"detail": _("Profile not found.")}, status.HTTP_404_NOT_FOUND)
instance = query[0]
return Response(self.serializer_class(instance).data)
user = get_object_or_404(User, username=username)
return Response(self.serializer_class(user.profilemodel).data)
def retrieve_id(self, request, pk=None):
query = self.get_queryset().filter(pk=pk)
if (not query):
return Response({"detail": _("Profile not found.")}, status.HTTP_404_NOT_FOUND)
instance = query[0]
return Response(self.serializer_class(instance).data)
user = get_object_or_404(User, pk=pk)
return Response(self.serializer_class(user.profilemodel).data)
def list(self, request):
serializer = ProfileSerializer(self.get_queryset(), many=True)