135 lines
4.5 KiB
Python
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)
|