def create(self, request): serializer = RouteSerializer( context={'request': request}, data=request.DATA, partial=True) if serializer.is_valid(): (exists, message) = check_if_rule_exists( {'source': serializer.object.source, 'destination': serializer.object.destination}, self.get_queryset()) if exists: return Response({"non_field_errors": [message]}, status=400) else: return super(RouteViewSet, self).create(request) else: return Response(serializer.errors, status=400)
def create(self, request): serializer = RouteSerializer(context={'request': request}, data=request.DATA, partial=True) if serializer.is_valid(): (exists, message) = check_if_rule_exists( { 'source': serializer.object.source, 'destination': serializer.object.destination }, self.get_queryset()) if exists: return Response({"non_field_errors": [message]}, status=400) else: return super(RouteViewSet, self).create(request) else: return Response(serializer.errors, status=400)
def retrieve(self, request, pk=None): route = get_object_or_404(self.get_queryset(), pk=pk) serializer = RouteSerializer(route) return Response(serializer.data)
def create(self, request): serializer = RouteSerializer(context={'request': request}) return super(RouteViewSet, self).create(request)
def list(self, request): serializer = RouteSerializer(self.get_queryset(), many=True, context={'request': request}) return Response(serializer.data)
def update(self, request, pk=None, partial=False): """ Overriden to customize `status` update behaviour. Changes in `status` need to be handled here, since we have to know the previous `status` of the object to choose the correct action. """ def set_object_pending(obj): """ Sets an object's status to "PENDING". This reflects that the object has not already been commited to the flowspec device, and the asynchronous job that will handle the sync will update the status accordingly :param obj: the object whose status will be changed :type obj: `flowspec.models.Route` """ obj.status = "PENDING" obj.response = "N/A" obj.save() def work_on_active_object(obj, new_status): """ Decides which `commit` action to choose depending on the requested status Cases: * `ACTIVE` ~> `INACTIVE`: The `Route` must be deleted from the flowspec device (`commit_delete`) * `ACTIVE` ~> `ACTIVE`: The `Route` is present, so it must be edited (`commit_edit`) :param new_status: the newly requested status :type new_status: str :param obj: the `Route` object :type obj: `flowspec.models.Route` """ set_object_pending(obj) if new_status == 'INACTIVE': obj.commit_delete() else: obj.commit_edit() def work_on_inactive_object(obj, new_status): """ Decides which `commit` action to choose depending on the requested status Cases: * `INACTIVE` ~> `ACTIVE`: The `Route` is not present on the device :param new_status: the newly requested status :type new_status: str :param obj: the `Route` object :type obj: `flowspec.models.Route` """ if new_status == 'ACTIVE': set_object_pending(obj) obj.commit_add() obj = get_object_or_404(self.queryset, pk=pk) old_status = obj.status serializer = RouteSerializer(obj, context={'request': request}, data=request.DATA, partial=partial) if serializer.is_valid(): new_status = serializer.object.status super(RouteViewSet, self).update(request, pk, partial=partial) if old_status == 'ACTIVE': work_on_active_object(obj, new_status) elif old_status in ['INACTIVE', 'ERROR']: work_on_inactive_object(obj, new_status) return Response(RouteSerializer(obj, context={ 'request': request }).data, status=200) else: return Response(serializer.errors, status=400)
def update(self, request, pk=None, partial=False): """ Overriden to customize `status` update behaviour. Changes in `status` need to be handled here, since we have to know the previous `status` of the object to choose the correct action. """ def set_object_pending(obj): """ Sets an object's status to "PENDING". This reflects that the object has not already been commited to the flowspec device, and the asynchronous job that will handle the sync will update the status accordingly :param obj: the object whose status will be changed :type obj: `flowspec.models.Route` """ obj.status = "PENDING" obj.response = "N/A" obj.save() def work_on_active_object(obj, new_status): """ Decides which `commit` action to choose depending on the requested status Cases: * `ACTIVE` ~> `INACTIVE`: The `Route` must be deleted from the flowspec device (`commit_delete`) * `ACTIVE` ~> `ACTIVE`: The `Route` is present, so it must be edited (`commit_edit`) :param new_status: the newly requested status :type new_status: str :param obj: the `Route` object :type obj: `flowspec.models.Route` """ set_object_pending(obj) if new_status == 'INACTIVE': obj.commit_delete() else: obj.commit_edit() def work_on_inactive_object(obj, new_status): """ Decides which `commit` action to choose depending on the requested status Cases: * `INACTIVE` ~> `ACTIVE`: The `Route` is not present on the device :param new_status: the newly requested status :type new_status: str :param obj: the `Route` object :type obj: `flowspec.models.Route` """ if new_status == 'ACTIVE': set_object_pending(obj) obj.commit_add() obj = get_object_or_404(self.queryset, pk=pk) old_status = obj.status serializer = RouteSerializer( obj, context={'request': request}, data=request.DATA, partial=partial) if serializer.is_valid(): new_status = serializer.object.status super(RouteViewSet, self).update(request, pk, partial=partial) if old_status == 'ACTIVE': work_on_active_object(obj, new_status) elif old_status in ['INACTIVE', 'ERROR']: work_on_inactive_object(obj, new_status) return Response( RouteSerializer(obj,context={'request': request}).data, status=200) else: return Response(serializer.errors, status=400)