def post(self, request, **kwargs):
        """Delete instances based on post request data."""
        model = self.queryset.model

        # Are we deleting *all* objects in the queryset or just a selected subset?
        if request.POST.get("_all"):
            if self.filterset is not None:
                pk_list = [obj.pk for obj in self.filterset(request.GET, model.objects.only("pk")).qs]
            else:
                pk_list = model.objects.values_list("pk", flat=True)
        else:
            pk_list = request.POST.getlist("pk")

        form_cls = self.get_form()

        obj_to_del = [item[0] for item in ConfigCompliance.objects.filter(pk__in=pk_list).values_list("device")]
        if "_confirm" in request.POST:
            form = form_cls(request.POST)
            if form.is_valid():
                LOGGER.debug("Form validation was successful")

                # Delete objects
                queryset = ConfigCompliance.objects.filter(device__in=obj_to_del)
                try:
                    deleted_count = queryset.delete()[1][model._meta.label]
                except ProtectedError as error:
                    LOGGER.info("Caught ProtectedError while attempting to delete objects")
                    handle_protectederror(queryset, request, error)
                    return redirect(self.get_return_url(request))

                msg = "Deleted {} {}".format(deleted_count, model._meta.verbose_name_plural)
                LOGGER.info(msg)
                messages.success(request, msg)
                return redirect(self.get_return_url(request))

            LOGGER.debug("Form validation failed")

        else:
            form = form_cls(initial={"pk": pk_list, "return_url": self.get_return_url(request)})

        table = self.table(ConfigCompliance.objects.filter(device__in=obj_to_del), orderable=False)
        if not table.rows:
            messages.warning(request, "No {} were selected for deletion.".format(model._meta.verbose_name_plural))
            return redirect(self.get_return_url(request))

        return render(
            request,
            self.template_name,
            {
                "form": form,
                "obj_type_plural": model._meta.verbose_name_plural,
                "table": table,
                "return_url": self.get_return_url(request),
            },
        )
示例#2
0
    def post(self, request, **kwargs):
        """Delete instances based on post request data."""
        # This is a deviation from standard Nautobot, since the objectlistview is shown on devices, but
        # displays elements from GoldenConfig model. We have to override attempting to delete from the Device model.

        model = self.queryset.model

        pk_list = request.POST.getlist("pk")

        form_cls = self.get_form()

        if "_confirm" in request.POST:
            form = form_cls(request.POST)
            if form.is_valid():
                LOGGER.debug("Form validation was successful")

                # Delete objects
                queryset = models.GoldenConfig.objects.filter(pk__in=pk_list)
                try:
                    deleted_count = queryset.delete()[1][
                        models.GoldenConfig._meta.label]
                except ProtectedError as error:
                    LOGGER.info(
                        "Caught ProtectedError while attempting to delete objects"
                    )
                    handle_protectederror(queryset, request, error)
                    return redirect(self.get_return_url(request))

                msg = f"Deleted {deleted_count} {models.GoldenConfig._meta.verbose_name_plural}"
                LOGGER.info(msg)
                messages.success(request, msg)
                return redirect(self.get_return_url(request))

            LOGGER.debug("Form validation failed")

        else:
            # From the list of Device IDs, get the GoldenConfig IDs
            obj_to_del = [
                item[0] for item in models.GoldenConfig.objects.filter(
                    device__pk__in=pk_list).values_list("id")
            ]

            form = form_cls(initial={
                "pk": obj_to_del,
                "return_url": self.get_return_url(request),
            })
        # Levarge a custom table just for deleting
        table = tables.DeleteGoldenConfigTable(
            models.GoldenConfig.objects.filter(pk__in=obj_to_del),
            orderable=False)
        if not table.rows:
            messages.warning(
                request,
                f"No {model._meta.verbose_name_plural} were selected for deletion.",
            )
            return redirect(self.get_return_url(request))

        context = {
            "form": form,
            "obj_type_plural": model._meta.verbose_name_plural,
            "table": table,
            "return_url": self.get_return_url(request),
        }
        return render(request, self.template_name, context)
示例#3
0
    def post(self, request, **kwargs):
        """Delete instances based on post request data."""
        # This is a deviation from standard Nautobot. Since the config compliance is pivot'd, the actual
        # pk is based on the device, this crux of the change is to get all actual config changes based on
        # the incoming device pk's.
        model = self.queryset.model

        # Are we deleting *all* objects in the queryset or just a selected subset?
        if request.POST.get("_all"):
            if self.filterset is not None:
                pk_list = [
                    obj.pk
                    for obj in self.filterset(request.GET,
                                              model.objects.only("pk")).qs
                ]
            else:
                pk_list = model.objects.values_list("pk", flat=True)
        else:
            pk_list = request.POST.getlist("pk")

        form_cls = self.get_form()

        # The difference between nautobot core is the creation and usage of obj_to_del
        obj_to_del = [
            item[0] for item in self.queryset.filter(
                device__pk__in=pk_list).values_list("id")
        ]
        if "_confirm" in request.POST:
            form = form_cls(request.POST)
            if form.is_valid():
                LOGGER.debug("Form validation was successful")

                # Delete objects
                queryset = self.queryset.filter(pk__in=pk_list)
                try:
                    deleted_count = queryset.delete()[1][model._meta.label]
                except ProtectedError as error:
                    LOGGER.info(
                        "Caught ProtectedError while attempting to delete objects"
                    )
                    handle_protectederror(queryset, request, error)
                    return redirect(self.get_return_url(request))

                msg = f"Deleted {deleted_count} {model._meta.verbose_name_plural}"
                LOGGER.info(msg)
                messages.success(request, msg)
                return redirect(self.get_return_url(request))

            LOGGER.debug("Form validation failed")

        else:
            form = form_cls(initial={
                "pk": obj_to_del,
                "return_url": self.get_return_url(request),
            })

        # Retrieve objects being deleted
        table = self.table(self.queryset.filter(pk__in=obj_to_del),
                           orderable=False)
        if not table.rows:
            messages.warning(
                request,
                f"No {model._meta.verbose_name_plural} were selected for deletion.",
            )
            return redirect(self.get_return_url(request))

        context = {
            "form": form,
            "obj_type_plural": model._meta.verbose_name_plural,
            "table": table,
            "return_url": self.get_return_url(request),
        }
        context.update(self.extra_context())
        return render(request, self.template_name, context)