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 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) data = serializer.data if serializer.is_valid(): serializer.save() return JsonResponse(status=201) else: logger.info(serializer.errors) else: return JsonResponse("No item", status=400) except Exception as e: logger.error(e) raise e