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 os.path import splitext
from django.contrib.auth.models import User 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.db.models.signals import post_save, pre_delete
from django.dispatch import receiver from django.dispatch import receiver
@ -10,8 +10,9 @@ from django.dispatch import receiver
def upload_to(instance, filename: str): def upload_to(instance, filename: str):
return f"./profiles/static/avatars/{instance.pk}{splitext(filename)[1]}" return f"./profiles/static/avatars/{instance.pk}{splitext(filename)[1]}"
class ProfileModel(Model): 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") avatar = ImageField(upload_to=upload_to, default="./profiles/static/avatars/default.avif")
def get_game(self) -> int: 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.authentication import SessionAuthentication
from rest_framework.request import Request from rest_framework.request import Request
from django.contrib.auth.models import User
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django.shortcuts import get_object_or_404
from ..models import BlockModel, ProfileModel from ..models import BlockModel, ProfileModel
from ..serializers.ProfileSerializer import ProfileSerializer from ..serializers.ProfileSerializer import ProfileSerializer
@ -16,7 +16,7 @@ class GetBlocksView(APIView):
authentication_classes = (SessionAuthentication,) authentication_classes = (SessionAuthentication,)
def get(self, request: Request): 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] bloked_profiles = [block.blocked for block in blocks]
return Response(ProfileSerializer(bloked_profiles, many=True).data) return Response(ProfileSerializer(bloked_profiles, many=True).data)
@ -26,32 +26,32 @@ class EditBlocksView(APIView):
permission_classes = (permissions.IsAuthenticated,) permission_classes = (permissions.IsAuthenticated,)
authentication_classes = (SessionAuthentication,) authentication_classes = (SessionAuthentication,)
def get_object(self):
return self.request.user.profilemodel
def post(self, request, pk=None): 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) return Response(_('You can\'t block yourself.'), status.HTTP_400_BAD_REQUEST)
blocked = User.objects.filter(pk=pk) if BlockModel.objects.filter(blocker=user_profile, blocked=blocked_profile):
if (not blocked.exists()): return Response(_('You already blocked this user.'), status.HTTP_409_CONFLICT)
return Response(_('This user doesn\'t exist.'), status.HTTP_404_NOT_FOUND)
if (BlockModel.objects.filter(blocker=request.user, blocked=pk)): BlockModel(blocker=user_profile, blocked=blocked_profile).save()
return Response(_('You already blocked this user.'), status=status.HTTP_409_CONFLICT) return Response(_('User successfully blocked.'), status.HTTP_201_CREATED)
BlockModel(blocker=request.user, blocked=blocked[0]).save()
return Response(status=status.HTTP_201_CREATED)
def delete(self, request, pk=None): 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) return Response(_('You can\'t unblock yourself.'), status.HTTP_400_BAD_REQUEST)
blocked = User.objects.filter(pk=pk) block_record = BlockModel.objects.filter(blocker=user_profile, blocked=blocked_profile).first()
if (not blocked.exists()): if not block_record:
return Response(_('This user doesn\'t exist.'), status.HTTP_404_NOT_FOUND) return Response(_('This user is not blocked.'), status.HTTP_400_BAD_REQUEST)
block = BlockModel.objects.filter(blocker=request.user, blocked=blocked[0]) block_record.delete()
if (not block): return Response(_('User successfully unblocked.'), status.HTTP_200_OK)
return Response(_('This user isn\'t blocked.'), status.HTTP_400_NOT_FOUND)
block.delete()
return Response(status=status.HTTP_200_OK)

View File

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

View File

@ -14,8 +14,7 @@ class MyProfileViewSet(viewsets.ModelViewSet):
queryset = ProfileModel.objects.all() queryset = ProfileModel.objects.all()
def get_object(self): def get_object(self):
obj = self.get_queryset().get(pk=self.request.user.pk) return self.request.user.profilemodel
return obj
def perform_update(self, serializer: ProfileSerializer, pk=None): def perform_update(self, serializer: ProfileSerializer, pk=None):
serializer.is_valid(raise_exception=True) 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.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 import viewsets
from rest_framework.response import Response from rest_framework.response import Response
@ -15,21 +15,12 @@ class ProfileViewSet(viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,) permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
def retrieve(self, request, username=None): def retrieve(self, request, username=None):
query = User.objects.filter(username=username) user = get_object_or_404(User, username=username)
if (not query): return Response(self.serializer_class(user.profilemodel).data)
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)
def retrieve_id(self, request, pk=None): def retrieve_id(self, request, pk=None):
query = self.get_queryset().filter(pk=pk) user = get_object_or_404(User, pk=pk)
if (not query): return Response(self.serializer_class(user.profilemodel).data)
return Response({"detail": _("Profile not found.")}, status.HTTP_404_NOT_FOUND)
instance = query[0]
return Response(self.serializer_class(instance).data)
def list(self, request): def list(self, request):
serializer = ProfileSerializer(self.get_queryset(), many=True) serializer = ProfileSerializer(self.get_queryset(), many=True)