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)