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)