From be8ecab1636a999f6b6b90cb7cd532d0e9a1566b Mon Sep 17 00:00:00 2001 From: sm4640 Date: Thu, 5 Jun 2025 18:34:08 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Feat:=20[#64]=20=EB=85=B8=EC=BD=94?= =?UTF-8?q?=EB=93=9C=ED=88=B4=20CRUD=20=EB=B0=8F=20=EC=8B=9C=EC=9E=91,=20?= =?UTF-8?q?=EB=81=9D=20=EC=9A=94=EC=B2=AD=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nocodetools/views.py | 164 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 163 insertions(+), 1 deletion(-) diff --git a/nocodetools/views.py b/nocodetools/views.py index d43f642..839149a 100644 --- a/nocodetools/views.py +++ b/nocodetools/views.py @@ -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) \ No newline at end of file