From e84ecabe72083c56fbcca2aba0aee79fe611b45f Mon Sep 17 00:00:00 2001 From: Wayne Witzel III Date: Thu, 29 Jun 2017 00:15:11 -0400 Subject: [PATCH] add schedule_deletion method and signal --- awx/api/views.py | 14 ++++++-------- awx/main/models/inventory.py | 10 ++++++++++ awx/main/signals.py | 10 ++++++++++ 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/awx/api/views.py b/awx/api/views.py index a63f762297..b0ec02791e 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -59,7 +59,7 @@ import ansiconv from social.backends.utils import load_backends # AWX -from awx.main.tasks import send_notifications, update_host_smart_inventory_memberships, delete_inventory +from awx.main.tasks import send_notifications, update_host_smart_inventory_memberships from awx.main.access import get_user_queryset from awx.main.ha import is_ha_environment from awx.api.authentication import TaskAuthentication, TokenGetAuthentication @@ -1839,15 +1839,13 @@ class InventoryDetail(ControlledByScmMixin, RetrieveUpdateDestroyAPIView): def destroy(self, request, *args, **kwargs): obj = self.get_object() - if obj.pending_deletion is True: - return Response(dict(error=_("Inventory is already being deleted.")), status=status.HTTP_400_BAD_REQUEST) if not request.user.can_access(self.model, 'delete', obj): raise PermissionDenied() - obj.websocket_emit_status('pending_deletion') - delete_inventory.delay(obj.id) - obj.pending_deletion = True - obj.save(update_fields=['pending_deletion']) - return Response(status=status.HTTP_202_ACCEPTED) + try: + obj.schedule_deletion() + return Response(status=status.HTTP_202_ACCEPTED) + except RuntimeError, e: + return Response(dict(error=_("{0}".format(e))), status=status.HTTP_400_BAD_REQUEST) class InventoryActivityStreamList(ActivityStreamEnforcementMixin, SubListAPIView): diff --git a/awx/main/models/inventory.py b/awx/main/models/inventory.py index 6190ebbb5c..e2a2a86337 100644 --- a/awx/main/models/inventory.py +++ b/awx/main/models/inventory.py @@ -373,6 +373,16 @@ class Inventory(CommonModelNameNotUnique, ResourceMixin): raise ValidationError(_("Credential kind must be 'insights'.")) return self.insights_credential + @transaction.atomic + def schedule_deletion(self): + from awx.main.tasks import delete_inventory + if self.pending_deletion is True: + raise RuntimeError("Inventory is already pending deletion.") + self.websocket_emit_status('pending_deletion') + delete_inventory.delay(self.pk) + self.pending_deletion = True + self.save(update_fields=['pending_deletion']) + class SmartInventoryMembership(BaseModel): ''' diff --git a/awx/main/signals.py b/awx/main/signals.py index 3dda0873b1..da477706e2 100644 --- a/awx/main/signals.py +++ b/awx/main/signals.py @@ -510,3 +510,13 @@ def get_current_user_from_drf_request(sender, **kwargs): request = get_current_request() drf_request = getattr(request, 'drf_request', None) return (getattr(drf_request, 'user', False), 0) + + +@receiver(pre_delete, sender=Organization) +def delete_inventory_for_org(sender, instance, **kwargs): + inventories = Inventory.objects.filter(organization__pk=instance.pk) + for inventory in inventories: + try: + inventory.schedule_deletion() + except RuntimeError, e: + logger.debug(e)