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