You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
2.2 KiB

from rest_framework import status
from django.contrib.gis.geos import Polygon
from rest_framework.mixins import RetrieveModelMixin, ListModelMixin, DestroyModelMixin
from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet
from ..actions.update_cache import add_new_polygon_to_cache, delete_polygon_from_cache
from ..models import ServiceArea
from ..serializers import AreaValidationSerializer, ServiceAreaSerializer, AreaUpdateValidationSerializer
class ServiceAreaViewSet(RetrieveModelMixin, ListModelMixin, DestroyModelMixin, GenericViewSet):
queryset = ServiceArea.objects.all()
serializer_class = ServiceAreaSerializer
def create_service_area(self, request, *args, **kwargs):
payload = request.data
serializer = AreaValidationSerializer(data=payload)
serializer.is_valid(raise_exception=True)
service_area_obj = ServiceArea.objects.create(
name=payload.get('name'),
price=payload.get('price'),
polygon=Polygon(payload.get('polygon')),
provider_id=payload.get('provider')
)
add_new_polygon_to_cache(service_area_obj)
return Response(status=status.HTTP_201_CREATED)
def update_service_area(self, request, *args, **kwargs):
service_area_obj = self.get_object()
payload = request.data
serializer = AreaUpdateValidationSerializer(
data=payload,
context={'area_provider_id': service_area_obj.provider_id}
)
serializer.is_valid(raise_exception=True)
old_polygon = service_area_obj.polygon
_ = ServiceArea.objects.filter(id=service_area_obj.id).update(
name=payload.get('name'),
price=payload.get('price'),
polygon=Polygon(payload.get('polygon'))
)
service_area_obj.refresh_from_db()
add_new_polygon_to_cache(service_area_obj, delete_polygon=old_polygon)
return Response(status=status.HTTP_200_OK)
def destroy(self, request, *args, **kwargs):
service_area_obj = self.get_object()
delete_polygon_from_cache(service_area_obj, service_area_obj.polygon)
return super(ServiceAreaViewSet, self).destroy(request)