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 from .serializers import CodeSerializer from .permissions import IsOwnerOrMemberInCreateAndUpdateAndDelete, IsNotPublished from .services import NocodetoolObjectMapService, NocodetoolHitService 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, IsNotPublished, IsOwnerOrMemberInCreateAndUpdateAndDelete] @transaction.atomic def get(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 or not obj.code_id: return Response({"message": "Not validated type or no object"}, status=status.HTTP_400_BAD_REQUEST) if obj.is_published: NocodetoolHitService.hit_once(obj, 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) obj_serializer = NocodetoolObjectMapService.mapping_model_serializer(related_type) 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=data, context={'request': request}) if serializer.is_valid(): code = serializer.save() obj.code_id = str(code.id) obj.save(update_fields=["code_id"]) 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) if not obj.code_id: return Response({'message': 'No code object'}, 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, context={'request': request}) 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) if not obj.code_id: return Response({'message': 'No code object'}, 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(update_fields=["code_id", "thumbnail"]) 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 = '' 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)