Feat: [#64] 노코드툴 CRUD 및 시작, 끝 요청 로직 구현

This commit is contained in:
sm4640
2025-06-05 18:34:08 +09:00
parent 13fb4d3743
commit be8ecab163

View File

@@ -1 +1,163 @@
# views.py from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status, mixins, viewsets
from rest_framework.permissions import AllowAny, IsAuthenticated
from django.db import transaction
from .models import Code, Page, Element
from .serializers import CodeSerializer
from .permissions import IsOwnerOrMemberInCreateAndUpdateAndDelete
from .services import NocodetoolObjectMapService
from users.models import User
from portfolios.models import Portfolio
from projects.models import Project
from bson import ObjectId
class NoCodeToolAPIView(APIView):
permission_classes = [IsAuthenticated, IsOwnerOrMemberInCreateAndUpdateAndDelete]
def get(self, request):
related_type = request.query_params.get("type")
related_id = request.query_params.get("id")
code_id = None
if obj := NocodetoolObjectMapService.mapping_model_instance(related_type, related_id):
code_id = ObjectId(obj.code_id)
if not code_id:
return Response({"message": "Not validated type or no object"}, status=status.HTTP_400_BAD_REQUEST)
obj_serializer = NocodetoolObjectMapService.mapping_model_serializer(related_type)
code = Code.objects.get(id=code_id)
return Response({
"obj_info": obj_serializer(obj).data,
"codes": CodeSerializer(code).data
}, status=status.HTTP_200_OK)
@transaction.atomic
def post(self, request):
related_type = request.query_params.get("type")
related_id = request.query_params.get("id")
obj = NocodetoolObjectMapService.mapping_model_instance(related_type, related_id)
if not obj:
return Response({"message": "No object"}, status=status.HTTP_400_BAD_REQUEST)
if not obj.now_worker:
return Response({"message": "start edit first"}, status=status.HTTP_400_BAD_REQUEST)
if obj.now_worker != request.user.nickname:
return Response({"message": f"{obj.now_worker} is working now"}, status=status.HTTP_400_BAD_REQUEST)
data = request.data.copy()
thumbnail_file = data.pop("thumbnail", None)
obj_serializer = NocodetoolObjectMapService.mapping_model_serializer(related_type)
serializer = CodeSerializer(data=request.data)
if serializer.is_valid():
code = serializer.save()
obj.code_id = str(code.id)
obj.save()
if thumbnail_file:
obj.thumbnail = thumbnail_file
obj.save(update_fields=["thumbnail"])
return Response({
"obj_info": obj_serializer(obj).data,
"codes": CodeSerializer(code).data
}, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@transaction.atomic
def patch(self, request):
related_type = request.query_params.get("type")
related_id = request.query_params.get("id")
obj = NocodetoolObjectMapService.mapping_model_instance(related_type, related_id)
if not obj:
return Response({"message": "No object"}, status=status.HTTP_400_BAD_REQUEST)
if not obj.now_worker:
return Response({"message": "start edit first"}, status=status.HTTP_400_BAD_REQUEST)
if obj.now_worker != request.user.nickname:
return Response({"message": f"{obj.now_worker} is working now"}, status=status.HTTP_400_BAD_REQUEST)
code = Code.objects.filter(id=ObjectId(obj.code_id)).first()
if not code:
return Response({'message': 'No code object'}, status=status.HTTP_400_BAD_REQUEST)
data = request.data.copy()
thumbnail_file = data.pop("thumbnail", None)
obj_serializer = NocodetoolObjectMapService.mapping_model_serializer(related_type)
serializer = CodeSerializer(code, data=data, partial=True)
if serializer.is_valid():
updated_code = serializer.save()
if thumbnail_file:
obj.thumbnail = thumbnail_file
obj.save(update_fields=["thumbnail"])
return Response({
"obj_info": obj_serializer(obj).data,
"codes": CodeSerializer(updated_code).data
}, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@transaction.atomic
def delete(self, request):
related_type = request.query_params.get("type")
related_id = request.query_params.get("id")
obj = NocodetoolObjectMapService.mapping_model_instance(related_type, related_id)
if not obj:
return Response({"message": "No object"}, status=status.HTTP_400_BAD_REQUEST)
if not obj.now_worker:
return Response({"message": "start edit first"}, status=status.HTTP_400_BAD_REQUEST)
if obj.now_worker != request.user.nickname:
return Response({"message": f"{obj.now_worker} is working now"}, status=status.HTTP_400_BAD_REQUEST)
code = Code.objects.filter(id=ObjectId(obj.code_id)).first()
if not code:
return Response({'message': 'No code object'}, status=status.HTTP_400_BAD_REQUEST)
code.delete()
obj.code_id = None
obj.thumbnail = None
obj.save()
return Response({"message": "delete code success"}, status=status.HTTP_200_OK)
class NocodeToolWorkingAPIView(APIView):
permission_classes = [IsAuthenticated, IsOwnerOrMemberInCreateAndUpdateAndDelete]
@transaction.atomic
def patch(self, request): # 수정 시작 or 종료
related_type = request.query_params.get("type")
related_id = request.query_params.get("id")
action = request.query_params.get("action")
obj = NocodetoolObjectMapService.mapping_model_instance(related_type, related_id)
if not obj:
return Response({"message": "No object"}, status=status.HTTP_400_BAD_REQUEST)
if action == "start":
if obj.now_worker:
return Response({"message": f"{obj.now_worker} is working"}, status=status.HTTP_400_BAD_REQUEST)
obj.now_worker = request.user.nickname
elif action == "end":
if obj.now_worker and obj.now_worker == request.user.nickname:
obj.now_worker = None
else:
return Response(
{
"message": f"{obj.now_worker} is working" if obj.now_worker else "nobody working now"
}, status=status.HTTP_400_BAD_REQUEST)
else:
return Response({"message": "Not supported action"}, status=status.HTTP_400_BAD_REQUEST)
obj.save()
return Response({"message": f"work {action}"}, status=status.HTTP_200_OK)