profiles: block rework and tests
This commit is contained in:
parent
13a078eb82
commit
8912e39fa4
@ -1,9 +1,7 @@
|
||||
from django.db import models
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
from django.db import models
|
||||
from django.db.models.signals import post_save, pre_delete
|
||||
from django.dispatch import receiver
|
||||
from django.db.models import IntegerField
|
||||
|
||||
from games.consumers import game_manager
|
||||
|
||||
@ -14,11 +12,10 @@ def upload_to(instance, filename: str):
|
||||
return f"./profiles/static/avatars/{instance.pk}{splitext(filename)[1]}"
|
||||
|
||||
|
||||
# Create your models here.
|
||||
class ProfileModel(models.Model):
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||
avatar = models.ImageField(upload_to=upload_to, default="./profiles/static/avatars/default.avif")
|
||||
|
||||
|
||||
def get_game(self) -> int:
|
||||
for game in game_manager._game_list:
|
||||
for player in game.get_players_connected():
|
||||
@ -26,27 +23,28 @@ class ProfileModel(models.Model):
|
||||
return game.game_id
|
||||
return None
|
||||
|
||||
|
||||
@receiver(pre_delete, sender=ProfileModel)
|
||||
def delete_profile_picture(sender, instance, **kwargs):
|
||||
if instance.avatar.name != './profiles/static/avatars/default.avif':
|
||||
instance.avatar.storage.delete(instance.avatar.name)
|
||||
|
||||
|
||||
@receiver(post_save, sender=User)
|
||||
def on_user_created(sender, instance, created, **kwargs):
|
||||
if created:
|
||||
profile: ProfileModel = ProfileModel.objects.create(pk = instance.pk, user = instance)
|
||||
profile: ProfileModel = ProfileModel.objects.create(pk=instance.pk, user=instance)
|
||||
profile.save()
|
||||
|
||||
class BlockModel(models.Model):
|
||||
blocker = IntegerField(primary_key=False)
|
||||
blocked = IntegerField(primary_key=False)
|
||||
|
||||
def __str__(self):
|
||||
return "blocker_id: " + str(self.blocker) + ", blocked_id: " + str(self.blocked)
|
||||
|
||||
class BlockModel(models.Model):
|
||||
blocker = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blocker')
|
||||
blocked = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blocked')
|
||||
|
||||
|
||||
class AskFriendModel(models.Model):
|
||||
asker = IntegerField(primary_key=False)
|
||||
asked = IntegerField(primary_key=False)
|
||||
asker = models.IntegerField(primary_key=False)
|
||||
asked = models.IntegerField(primary_key=False)
|
||||
|
||||
def getAsked(self, asker):
|
||||
askeds = []
|
||||
@ -74,9 +72,10 @@ class AskFriendModel(models.Model):
|
||||
deleted.delete()
|
||||
return True
|
||||
|
||||
|
||||
class FriendModel(models.Model):
|
||||
user_id1 = IntegerField(primary_key=False)
|
||||
user_id2 = IntegerField(primary_key=False)
|
||||
user_id1 = models.IntegerField(primary_key=False)
|
||||
user_id2 = models.IntegerField(primary_key=False)
|
||||
|
||||
def getFriends(self, user_id):
|
||||
friends = []
|
||||
|
10
profiles/serializers/BlockSerializer.py
Normal file
10
profiles/serializers/BlockSerializer.py
Normal file
@ -0,0 +1,10 @@
|
||||
from rest_framework.serializers import ModelSerializer
|
||||
|
||||
from ..models import BlockModel
|
||||
|
||||
|
||||
class BlockSerializer(ModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = BlockModel
|
||||
fields = ['blocked']
|
@ -1,8 +1,10 @@
|
||||
from rest_framework import serializers
|
||||
from .models import ProfileModel
|
||||
from django.conf import settings
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
from rest_framework import serializers
|
||||
|
||||
from ..models import ProfileModel
|
||||
|
||||
|
||||
class ProfileSerializer(serializers.ModelSerializer):
|
||||
|
||||
@ -24,5 +26,4 @@ class ProfileSerializer(serializers.ModelSerializer):
|
||||
def to_representation(self, instance):
|
||||
data = super().to_representation(instance)
|
||||
data['avatar'] = data['avatar'][data['avatar'].find('/static/'):]
|
||||
print(data)
|
||||
return data
|
@ -6,28 +6,29 @@ from rest_framework import status
|
||||
|
||||
class ProfileTest(TestCase):
|
||||
def setUp(self):
|
||||
self.user: User = User.objects.create(username='bozo', password='password')
|
||||
self.user: User = User.objects.create_user('bozo', password='password')
|
||||
self.user.save()
|
||||
self.expected_response = {'avatar': '/static/avatars/default.avif', 'user_id': 1, 'username': 'bozo'}
|
||||
|
||||
self.url = "/api/profiles/"
|
||||
self.url = "/api/profiles/user/"
|
||||
|
||||
def test_profile_create_on_user_created(self):
|
||||
response: HttpResponse = self.client.get(self.url + str(self.user.pk))
|
||||
response_dict: dict = eval(response.content)
|
||||
self.assertDictEqual(self.expected_response, response_dict)
|
||||
response: HttpResponse = self.client.get(self.url + self.user.username)
|
||||
self.assertDictEqual(self.expected_response, response.json())
|
||||
|
||||
|
||||
class BlockTest(TestCase):
|
||||
def setUp(self):
|
||||
self.blocker_password = 'hello_world'
|
||||
self.blocker: User = User.objects.create_user('blocker', password=self.blocker_passord)
|
||||
self.blocker: User = User.objects.create_user('blocker', password=self.blocker_password)
|
||||
self.blocked: User = User.objects.create_user('blocked', password='password')
|
||||
self.blocker.save()
|
||||
self.blocked.save()
|
||||
|
||||
def test_normal(self):
|
||||
self.client.login(self.blocker.username, self.blocker_password)
|
||||
self.client.login(username=self.blocker.username, password=self.blocker_password)
|
||||
response: HttpResponse = self.client.post(f'/api/profiles/block/{self.blocked.pk}')
|
||||
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
||||
|
||||
response = self.client.get('/api/profiles/block')
|
||||
self.assertListEqual(response.json(), [{'blocked': self.blocked.pk}])
|
||||
|
@ -2,15 +2,15 @@ from django.urls import path
|
||||
|
||||
from .viewsets.ProfileViewSet import ProfileViewSet
|
||||
from .viewsets.MyProfileViewSet import MyProfileViewSet
|
||||
from . import views
|
||||
from .views.blocks import GetBlocksView, EditBlocksView
|
||||
|
||||
urlpatterns = [
|
||||
path("settings", MyProfileViewSet.as_view({'patch': 'partial_update', 'delete': 'delete_avatar'}), name="my_profile_page"),
|
||||
path("me", MyProfileViewSet.as_view({'get': 'retrieve'}), name="my_profile_page"),
|
||||
path("", ProfileViewSet.as_view({'get': 'list'}), name="profiles_list"),
|
||||
path("block", views.BlocksView.as_view(), name="block_page"),
|
||||
path("block/<int:pk>", views.BlocksView.as_view(), name="block_page"),
|
||||
path("friend", views.FriendsView.as_view(), name="friend_page"),
|
||||
path("block", GetBlocksView.as_view(), name="block_page"),
|
||||
path("block/<int:pk>", EditBlocksView.as_view(), name="block_page"),
|
||||
# path("friend", views.FriendsView.as_view(), name="friend_page"),
|
||||
path("user/<str:username>", ProfileViewSet.as_view({'get': 'retrieve'}), name="profile_page"),
|
||||
path("id/<int:pk>", ProfileViewSet.as_view({'get': 'retrieve_id'}), name="profile_page"),
|
||||
]
|
||||
|
@ -1,59 +0,0 @@
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import permissions, status
|
||||
from rest_framework.authentication import SessionAuthentication
|
||||
from django.core import serializers
|
||||
from django.utils.translation import gettext as _
|
||||
from .models import BlockModel, FriendModel
|
||||
|
||||
|
||||
class BlocksView(APIView):
|
||||
permission_classes = (permissions.IsAuthenticated,)
|
||||
authentication_classes = (SessionAuthentication,)
|
||||
|
||||
def get(self, request):
|
||||
blocked_profiles = BlockModel.objects.filter(blocker=request.user.pk)
|
||||
response_status: int = status.HTTP_204_NO_CONTENT if blocked_profiles else status.HTTP_204_NO_CONTENT
|
||||
return Response(serializers.serialize("json", blocked_profiles), response_status)
|
||||
|
||||
def post(self, request, pk=None):
|
||||
if (pk == request.user.pk):
|
||||
return Response(_('You can\'t block yourself.'), status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
if (BlockModel.objects.filter(blocker=request.user.pk, blocked=pk)):
|
||||
return Response(_('You already blocked this user.'), status=status.HTTP_409_CONFLICT)
|
||||
|
||||
BlockModel(blocker=request.user.pk, blocked=pk).save()
|
||||
|
||||
return Response(status=status.HTTP_201_CREATED)
|
||||
|
||||
def delete(self, request):
|
||||
data: dict = request.data
|
||||
users_id = request.data.get("users_id", None)
|
||||
|
||||
if (users_id == None):
|
||||
return Response({"Error"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
if (users_id[0] == None or users_id[1] == None):
|
||||
return Response({"Error send blocker/ed None"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
block = BlockModel.objects.filter(blocker=users_id[0], blocked=users_id[1])
|
||||
|
||||
if (block.count() > 1):
|
||||
return Response("Not normal >:[", status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
||||
|
||||
if (not block):
|
||||
return Response("Don't exist", status=status.HTTP_404_NOT_FOUND)
|
||||
|
||||
block.delete()
|
||||
return Response("Deleted", status=status.HTTP_200_OK)
|
||||
|
||||
class FriendsView(APIView):
|
||||
permission_classes = (permissions.IsAuthenticated,)
|
||||
authentication_classes = (SessionAuthentication,)
|
||||
|
||||
def get(self, request):
|
||||
friends = FriendModel().getFriends(request.user.pk)
|
||||
if (friends):
|
||||
return Response({"friends": friends, "user_id": request.user.pk}, status=status.HTTP_200_OK)
|
||||
return Response({}, status=status.HTTP_204_NO_CONTENT)
|
55
profiles/views/blocks.py
Normal file
55
profiles/views/blocks.py
Normal file
@ -0,0 +1,55 @@
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import permissions, status
|
||||
from rest_framework.authentication import SessionAuthentication
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
from ..models import BlockModel
|
||||
from ..serializers.BlockSerializer import BlockSerializer
|
||||
|
||||
|
||||
class GetBlocksView(APIView):
|
||||
permission_classes = (permissions.IsAuthenticated,)
|
||||
authentication_classes = (SessionAuthentication,)
|
||||
|
||||
def get(self, request):
|
||||
blocked_profiles = BlockModel.objects.filter(blocker=request.user.pk)
|
||||
response_status: int = status.HTTP_200_OK if blocked_profiles else status.HTTP_204_NO_CONTENT
|
||||
return Response(BlockSerializer(blocked_profiles, many=True).data, response_status)
|
||||
|
||||
|
||||
class EditBlocksView(APIView):
|
||||
permission_classes = (permissions.IsAuthenticated,)
|
||||
authentication_classes = (SessionAuthentication,)
|
||||
|
||||
def post(self, request, pk=None):
|
||||
if (pk == request.user.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=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)
|
||||
|
||||
def delete(self, request, pk=None):
|
||||
if (pk == request.user.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 = 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)
|
17
profiles/views/friends.py
Normal file
17
profiles/views/friends.py
Normal file
@ -0,0 +1,17 @@
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import permissions, status
|
||||
from rest_framework.authentication import SessionAuthentication
|
||||
from django.utils.translation import gettext as _
|
||||
from ..models import FriendModel
|
||||
|
||||
|
||||
class FriendsView(APIView):
|
||||
permission_classes = (permissions.IsAuthenticated,)
|
||||
authentication_classes = (SessionAuthentication,)
|
||||
|
||||
def get(self, request):
|
||||
friends = FriendModel().getFriends(request.user.pk)
|
||||
if (friends):
|
||||
return Response({"friends": friends, "user_id": request.user.pk}, status=status.HTTP_200_OK)
|
||||
return Response({}, status=status.HTTP_204_NO_CONTENT)
|
@ -3,7 +3,7 @@ from rest_framework import viewsets
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.authentication import SessionAuthentication
|
||||
|
||||
from ..serializers import ProfileSerializer
|
||||
from ..serializers.ProfileSerializer import ProfileSerializer
|
||||
from ..models import ProfileModel
|
||||
|
||||
|
||||
|
@ -5,7 +5,7 @@ from rest_framework import permissions, status
|
||||
from rest_framework import viewsets
|
||||
from rest_framework.response import Response
|
||||
|
||||
from ..serializers import ProfileSerializer
|
||||
from ..serializers.ProfileSerializer import ProfileSerializer
|
||||
from ..models import ProfileModel
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user