demo-int-table/back/api/views.py

135 lines
4.5 KiB
Python

import json
from rest_framework.parsers import JSONParser, MultiPartParser
from rest_framework.views import APIView
from rest_framework import status
from django.http import JsonResponse
from django.shortcuts import get_object_or_404
from api.tracer import parse_image, read_image, numpy_zip_str_to_arr
from .serializers import (
FloorplanListSerializer,
FloorplanPointsSerializer,
FloorplanSerializer,
ProductSerializer,
)
from .models import Floorplan, FloorplanPoints, Product
import logging
logger = logging.getLogger("root")
class Products(APIView):
def get(self, request):
tasks = Product.objects.all()
serializer = ProductSerializer(tasks, many=True)
return JsonResponse(serializer.data, safe=False)
def post(self, request):
data = JSONParser().parse(request)
serializer = ProductSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
class FloorplanView(APIView):
parser_classes = (
MultiPartParser,
JSONParser,
)
def post(self, request):
try:
file = request.FILES["demo"]
logger.info(file.__dict__)
res = parse_image(read_image(file.read()))
serializer = FloorplanSerializer(
data={
"title": file.name,
"np_field": res["b64"].decode(),
"paths": json.dumps(res["paths"]),
}
)
if serializer.is_valid():
serializer.save()
return JsonResponse(
data={
"response": {
"np_field": res["array"],
"paths": res["paths"],
}
},
status=201,
)
else:
logger.info(serializer.errors)
return JsonResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
except Exception as e:
logger.error(e)
raise e
def get(self, request, id=None):
try:
if id is not None:
item = Floorplan.objects.get(id=id)
serializer = FloorplanSerializer(item, many=False)
data = serializer.data
data["np_field"] = numpy_zip_str_to_arr(data["np_field"])
return JsonResponse(data, safe=False)
else:
items = Floorplan.objects.only("id", "title").all()
serializer = FloorplanListSerializer(items, many=True)
return JsonResponse(serializer.data, safe=False)
except Exception as e:
logger.error(e)
raise e
def patch(self, request, id):
try:
if id is not None:
item = Floorplan.objects.get(id=id)
serializer = FloorplanSerializer(item, data=request.data, partial=True)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=status.HTTP_200_OK)
else:
logger.info(serializer.errors)
return JsonResponse(
serializer.errors, status=status.HTTP_400_BAD_REQUEST
)
else:
return JsonResponse("No item", status=status.HTTP_400_BAD_REQUEST)
except Exception as e:
logger.error(e)
raise e
class FloorplanPointsView(APIView):
def get(self, request, id):
if FloorplanPoints.objects.filter(plan=id).exists():
points = FloorplanPoints.objects.get(plan=id)
serializer = FloorplanPointsSerializer(points, many=False)
return JsonResponse(serializer.data, safe=False)
else:
return JsonResponse(
"No item", safe=False, status=status.HTTP_400_BAD_REQUEST
)
def post(self, request, id):
data = JSONParser().parse(request)
data["plan"] = id
floorplapoints_object = get_object_or_404(FloorplanPoints, plan=id)
serializer = FloorplanPointsSerializer(floorplapoints_object, data=data, partial=True)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=status.HTTP_201_CREATED)
else:
return JsonResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)