From f9a3e7a440c83a779155ce41525d5bd2ea4a974a Mon Sep 17 00:00:00 2001 From: Keannu Bernasol Date: Sun, 24 Sep 2023 21:54:14 +0800 Subject: [PATCH] Added initial study group creation, joining, and deletion functionality --- stude/study_groups/views.py | 45 ++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/stude/study_groups/views.py b/stude/study_groups/views.py index 4f92cab..e517e58 100644 --- a/stude/study_groups/views.py +++ b/stude/study_groups/views.py @@ -9,15 +9,55 @@ from student_status.models import StudentStatus from rest_framework import generics, viewsets, exceptions from django.contrib.gis.geos import fromstr from django.contrib.gis.db.models.functions import Distance - +from rest_framework import status +from rest_framework.response import Response # Create your views here. -class StudyGroupListView(generics.ListAPIView): +class StudyGroupListView(generics.ListCreateAPIView, generics.UpdateAPIView, generics.DestroyAPIView): permission_classes = [IsAuthenticated] serializer_class = StudyGroupSerializer queryset = StudyGroup.objects.all() + def partial_update(self, instance, request, *args, **kwargs): + # Ensure only "users" field is being updated + if set(request.data.keys()) != {"users"}: + return Response({"detail": "Only the 'users' field can be updated."}, status=status.HTTP_400_BAD_REQUEST) + + # Get the current list of users + instance = self.get_object() + current_users = set(instance.users.values_list('id', flat=True)) + + # Get the new list of users from the request + new_users = set(request.data['users']) + + # Check if the only difference between the two sets is the current user + diff = current_users.symmetric_difference(new_users) + if len(diff) > 1 or (len(diff) == 1 and request.user.id not in diff): + return Response({"detail": "You can only add or remove yourself from the study group."}, status=status.HTTP_400_BAD_REQUEST) + + # Delete the study group if there are no users left + instance = self.get_object() + if not instance.users.exists(): + instance.delete() + + return super().partial_update(request, *args, **kwargs) + + def destroy(self, request, *args, **kwargs): + instance = self.get_object() + + # Check if the current user is the creator of the study group + # Assuming 'date_joined' is a field in your User model + creator = instance.users.all().first() + if request.user != creator: + return Response({"detail": "Only the creator can delete the study group."}, status=status.HTTP_400_BAD_REQUEST) + + # Check if the current user is the only one in the study group + if instance.users.count() > 1: + return Response({"detail": "The study group cannot be deleted if there are other users in it."}, status=status.HTTP_400_BAD_REQUEST) + + return super().destroy(request, *args, **kwargs) + def get_queryset(self): user = self.request.user @@ -52,7 +92,6 @@ class StudyGroupListView(generics.ListAPIView): group_radius = max(group_radius, 15) # Annotate the group with the radius group.radius = group_radius - print('test', studygroups) return studygroups