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

81 lines
2.6 KiB
Python

import json
from rest_framework.parsers import JSONParser, MultiPartParser
from rest_framework.views import APIView
from django.http import JsonResponse
from api.tracer import parse_image, read_image, numpy_zip_str_to_arr
from .serializers import FloorplanSerializer, FloorplanListSerializer, ProductSerializer
from .models import Floorplan, 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,)
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=500)
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