Added initial study group creation, joining, and deletion functionality

This commit is contained in:
Keannu Bernasol 2023-09-24 21:54:14 +08:00
parent 268069eeb4
commit f9a3e7a440

View file

@ -9,15 +9,55 @@ from student_status.models import StudentStatus
from rest_framework import generics, viewsets, exceptions from rest_framework import generics, viewsets, exceptions
from django.contrib.gis.geos import fromstr from django.contrib.gis.geos import fromstr
from django.contrib.gis.db.models.functions import Distance from django.contrib.gis.db.models.functions import Distance
from rest_framework import status
from rest_framework.response import Response
# Create your views here. # Create your views here.
class StudyGroupListView(generics.ListAPIView): class StudyGroupListView(generics.ListCreateAPIView, generics.UpdateAPIView, generics.DestroyAPIView):
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
serializer_class = StudyGroupSerializer serializer_class = StudyGroupSerializer
queryset = StudyGroup.objects.all() 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): def get_queryset(self):
user = self.request.user user = self.request.user
@ -52,7 +92,6 @@ class StudyGroupListView(generics.ListAPIView):
group_radius = max(group_radius, 15) group_radius = max(group_radius, 15)
# Annotate the group with the radius # Annotate the group with the radius
group.radius = group_radius group.radius = group_radius
print('test', studygroups)
return studygroups return studygroups