diff --git a/authentik/lib/models.py b/authentik/lib/models.py index 644b7755de..ae496d468a 100644 --- a/authentik/lib/models.py +++ b/authentik/lib/models.py @@ -54,7 +54,7 @@ class InheritanceForeignKey(models.ForeignKey): forward_related_accessor_class = InheritanceForwardManyToOneDescriptor -class SoftDeleteQuerySet(models.query.QuerySet): +class SoftDeleteQuerySet(models.QuerySet): def delete(self): for obj in self.all(): @@ -70,6 +70,12 @@ class SoftDeleteManager(models.Manager): return SoftDeleteQuerySet(self.model, using=self._db).filter(deleted_at__isnull=True) +class DeletedSoftDeleteManager(models.Manager): + + def get_queryset(self): + return super().get_queryset().exclude(deleted_at__isnull=True) + + class SoftDeleteModel(models.Model): """Model which doesn't fully delete itself, but rather saved the delete status so cleanup events can run.""" @@ -77,6 +83,7 @@ class SoftDeleteModel(models.Model): deleted_at = models.DateTimeField(blank=True, null=True) objects = SoftDeleteManager() + deleted = DeletedSoftDeleteManager() class Meta: abstract = True diff --git a/authentik/outposts/tasks.py b/authentik/outposts/tasks.py index 71f73d1582..3564d32332 100644 --- a/authentik/outposts/tasks.py +++ b/authentik/outposts/tasks.py @@ -132,7 +132,11 @@ def outpost_controller_all(): def outpost_controller(self: SystemTask, outpost_pk: str, action: str = "up"): """Create/update/monitor/delete the deployment of an Outpost""" logs = [] - outpost: Outpost = Outpost.objects.filter(pk=outpost_pk).first() + outpost: Outpost = None + if action == "up": + outpost = Outpost.objects.filter(pk=outpost_pk).first() + elif action == "down": + outpost = Outpost.deleted.filter(pk=outpost_pk).first() if not outpost: LOGGER.warning("No outpost") return @@ -150,7 +154,7 @@ def outpost_controller(self: SystemTask, outpost_pk: str, action: str = "up"): else: self.set_status(TaskStatus.SUCCESSFUL, *logs) finally: - if action == "down": + if outpost.deleted_at: outpost.force_delete()