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 , SpaceSerializerforadd from drf_yasg import openapi from drf_yasg.utils import swagger_auto_schema @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) @swagger_auto_schema( method='post', request_body=openapi.Schema( type=openapi.TYPE_OBJECT, required=['assetBundleRoomId', 'name', 'description', 'capacity'], properties={ 'assetBundleRoomId': openapi.Schema(type=openapi.TYPE_STRING, default='1'), 'name': openapi.Schema(type=openapi.TYPE_STRING, default='ROOM1'), 'description': openapi.Schema(type=openapi.TYPE_STRING, default='TEST DES'), 'capacity': openapi.Schema(type=openapi.TYPE_STRING, default='12'), } ) ) @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.id # Pass the request object to the serializer context serializer = SpaceSerializerforadd(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)