init
This commit is contained in:
107
app/user/views.py
Normal file
107
app/user/views.py
Normal file
@@ -0,0 +1,107 @@
|
||||
from django.contrib.auth.views import LoginView
|
||||
from django.views.generic import CreateView
|
||||
from django.contrib.auth import login
|
||||
from django.urls import reverse_lazy
|
||||
from django.db.models import Count, Sum, F, IntegerField
|
||||
|
||||
from rest_framework.viewsets import ModelViewSet, GenericViewSet
|
||||
from rest_framework import mixins
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.response import Response
|
||||
|
||||
from .models import User, FriendRequest, Invitation
|
||||
from .forms import RegisterForm
|
||||
from .serializers import UserSerializer, FriendRequestSerializer, InvitationSerializer
|
||||
|
||||
|
||||
|
||||
class UserLoginView(LoginView):
|
||||
template_name = "user/login.html"
|
||||
fields = "__all__"
|
||||
redirect_authenticated_user = True
|
||||
|
||||
|
||||
class RegisterView(CreateView):
|
||||
template_name = "user/register.html"
|
||||
form_class = RegisterForm
|
||||
success_url = reverse_lazy("torrent:home")
|
||||
|
||||
invitation = None
|
||||
|
||||
def get_form(self, form_class=None):
|
||||
self.invitation = Invitation.objects.get(token=self.kwargs.get("token"), user__isnull=True)
|
||||
return super().get_form(form_class)
|
||||
|
||||
def form_valid(self, form):
|
||||
r = super().form_valid(form)
|
||||
self.invitation.user = self.object
|
||||
self.invitation.save()
|
||||
login(self.request, self.object)
|
||||
return r
|
||||
|
||||
|
||||
class UserViewSet(mixins.RetrieveModelMixin,
|
||||
mixins.ListModelMixin,
|
||||
GenericViewSet):
|
||||
queryset = User.objects.all().annotate(
|
||||
count_torrent=Count("torrents") + Count("torrents_shares")
|
||||
)
|
||||
serializer_class = UserSerializer
|
||||
|
||||
def get_queryset(self):
|
||||
qs = super().get_queryset()
|
||||
|
||||
only_friends = self.request.query_params.get("only_friends", "false") == "true"
|
||||
if only_friends:
|
||||
qs = qs.filter(friends=self.request.user)
|
||||
|
||||
return qs
|
||||
|
||||
@action(methods=["get"], detail=True)
|
||||
def add_friend_request(self, request, pk):
|
||||
# receiver = User.objects.get(pk=pk)
|
||||
if not User.objects.filter(username__iexact=pk).exists():
|
||||
return Response({"success": False, "message": f"User '{pk}' doesn't exist"})
|
||||
|
||||
receiver = User.objects.get(username__iexact=pk)
|
||||
user: User = self.request.user
|
||||
if user.friends.filter(id=receiver.id).exists():
|
||||
# déjà dans les amis
|
||||
return Response({"success": False, "message": "Already friend"})
|
||||
elif FriendRequest.objects.filter(sender=user, receiver=receiver).exists():
|
||||
# déjà une demande en attente
|
||||
return Response({"success": False, "message": "Friend request Already sent"})
|
||||
elif FriendRequest.objects.filter(sender=receiver, receiver=user).exists():
|
||||
# friend request en cours, on accepte
|
||||
FriendRequest.objects.filter(sender=receiver, receiver=user).delete()
|
||||
user.friends.add(receiver)
|
||||
return Response({"success": True, "message": f"{receiver.username} added to your friend list"})
|
||||
else:
|
||||
# aucune demande en cours, on créer un friend request
|
||||
FriendRequest.objects.create(
|
||||
sender=user,
|
||||
receiver=receiver
|
||||
)
|
||||
return Response({"success": True, "message": "Request sent"})
|
||||
|
||||
@action(methods=["get"], detail=True)
|
||||
def remove_friend(self, request, pk):
|
||||
friend = User.objects.get(pk=pk)
|
||||
if self.request.user.friends.filter(pk=friend.pk).exists():
|
||||
self.request.user.friends.remove(friend)
|
||||
return Response({"success": True, "message": f"The friend {friend.username} successfully removed"})
|
||||
return Response({"success": False, "message": f"error"})
|
||||
|
||||
|
||||
class FriendRequestViewSet(mixins.ListModelMixin,
|
||||
mixins.DestroyModelMixin,
|
||||
GenericViewSet):
|
||||
queryset = FriendRequest.objects.all()
|
||||
serializer_class = FriendRequestSerializer
|
||||
|
||||
def get_queryset(self):
|
||||
qs = super().get_queryset()
|
||||
|
||||
qs = qs.filter(receiver=self.request.user)
|
||||
|
||||
return qs
|
||||
Reference in New Issue
Block a user