179 lines
7.3 KiB
Python
179 lines
7.3 KiB
Python
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) |