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), }, )
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)
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)