Source code for apps.api.views.area_view

from rest_framework.views import APIView
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from django.db.models.deletion import ProtectedError
from django.db.models import Q
from apps.core.models.area import Area
from apps.core.models.device import Device
from apps.api.exceptions import ApiException, ValidationException
from apps.api.serializers.serializers import AreaSerializer, DeviceSerializer
from apps.api.model_helper import get_area, get_deleted_area_by_name, get_devices_by_area


[docs]class AreaViewManagement(APIView): # permission_classes = (IsAuthenticated,)
[docs] def post(self, request): data = request.data area = get_deleted_area_by_name(data['office_name']) if area: serializer = AreaSerializer(area, data=data) else: serializer = AreaSerializer(data=data) if not serializer.is_valid(): raise ValidationException( f"Validation error: {serializer.errors}", status.HTTP_400_BAD_REQUEST ) serializer.save() return Response(status=status.HTTP_201_CREATED, data=serializer.data)
[docs] def get(self, request): # if 'root' parameter is present, then 'office_name' is igonred if 'root' in request.query_params: # input validation if request.query_params.get('root').lower() == 'true': areas = Area.objects.filter(deleted_at__isnull=True, parent_area__isnull=True) serializer = AreaSerializer(areas, many=True) return Response(status=status.HTTP_200_OK, data=serializer.data) if 'office_name' in request.query_params: #input validation try: area = Area.objects.get(deleted_at__isnull=True, office_name=request.query_params.get('office_name')) except Area.DoesNotExist: return Response(status=status.HTTP_200_OK, data="Office name doesn't exists.") serializer = AreaSerializer(area) return Response(status=status.HTTP_200_OK, data=serializer.data['id']) areas = Area.objects.filter(deleted_at__isnull=True) serializer = AreaSerializer(areas, many=True) return Response(status=status.HTTP_200_OK, data=serializer.data)
[docs]class AreaViewDetail(APIView): # permission_classes = (IsAuthenticated,)
[docs] def get(self, request, area_id): #return detail of area and it's direct descendants area_with_direct_descendants = Area.objects.filter(Q(deleted_at__isnull=True, id=area_id) | Q(parent_area=area_id)) serializer = AreaSerializer(area_with_direct_descendants, many=True) return Response(status=status.HTTP_200_OK, data=serializer.data)
[docs] def put(self, request, area_id): data = request.data area = get_area(area_id) serializer = AreaSerializer(area, data=data) if not serializer.is_valid(): raise ValidationException( f"Validation error: {serializer.errors}", status.HTTP_400_BAD_REQUEST ) serializer.save() return Response(status=status.HTTP_200_OK, data=serializer.data)
[docs] def delete(self, request, area_id): try: area = get_area(area_id) # CASCADE delete removed parent and all its children. devices = Device.objects.filter(area_id=area_id) #return Response(status=status.HTTP_200_OK, data=str(len(devices))) resp = [] devs = [] for dev in devices: devs.append(dev.id) dev.soft_delete() resp.append({'devs':devs}) area.soft_delete() return Response(status=status.HTTP_200_OK, data=resp) except Exception as e: return Response(status=status.HTTP_200_OK, data=str(e))
[docs]class AreaViewDevices(APIView):
[docs] def get(self, request, area_id): devices = get_devices_by_area(area_id) serializer = DeviceSerializer(devices, many=True) return Response(status=status.HTTP_200_OK, data=serializer.data)