from rest_framework.decorators import api_view, authentication_classes, permission_classes from rest_framework.authentication import SessionAuthentication, TokenAuthentication from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework import status from core.models.Space import Space from core.models.AssetBundleRoom import AssetBundleRoom from core.serializers.SpaceSerializer import SpaceSerializer @api_view(['GET']) @authentication_classes([SessionAuthentication, TokenAuthentication]) @permission_classes([IsAuthenticated]) def getSpaces(request): # Get the spaces associated with the authenticated user and join with AssetBundleRoom data spaces = Space.objects.filter(userId=request.user).select_related('assetBundleRoomId') # Serialize the spaces and include all fields from the related AssetBundleRoom # Pass 'assetBundleRoomId' as it will be automatically included by select_related serializer = SpaceSerializer(spaces, many=True) # Return the serialized data as a response return Response({ "spaces": serializer.data }, status=status.HTTP_200_OK) @api_view(['POST']) @authentication_classes([SessionAuthentication, TokenAuthentication]) @permission_classes([IsAuthenticated]) def addSpace(request): # Make a mutable copy of the request data data = request.data.copy() data['userId'] = request.user.id # Automatically assign the authenticated user # Retrieve the AssetBundleRoom instance from the provided ID try: asset_bundle_room = AssetBundleRoom.objects.get(id=data['assetBundleRoomId']) except AssetBundleRoom.DoesNotExist: return Response({"detail": "AssetBundleRoom not found."}, status=status.HTTP_404_NOT_FOUND) # Assign the AssetBundleRoom instance to the data data['assetBundleRoomId'] = asset_bundle_room # Pass the request object to the serializer context serializer = SpaceSerializer(data=data) if serializer.is_valid(): # Save the space using the validated data space = serializer.save() # This automatically saves the space # Return the response with the space data return Response({ "message": "Space added successfully.", "space": serializer.data # This gives you the serialized data of the saved space }, status=status.HTTP_201_CREATED) else: # If validation fails, return the errors return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)