Move inventory delete activity stream into view

This commit is contained in:
Aaron Tan
2017-08-03 17:55:34 -04:00
parent 278e0335ca
commit bba1e46218
3 changed files with 14 additions and 5 deletions

View File

@@ -378,11 +378,13 @@ class Inventory(CommonModelNameNotUnique, ResourceMixin):
@transaction.atomic @transaction.atomic
def schedule_deletion(self, user_id=None): def schedule_deletion(self, user_id=None):
from awx.main.tasks import delete_inventory from awx.main.tasks import delete_inventory
from awx.main.signals import activity_stream_delete
if self.pending_deletion is True: if self.pending_deletion is True:
raise RuntimeError("Inventory is already pending deletion.") raise RuntimeError("Inventory is already pending deletion.")
self.pending_deletion = True self.pending_deletion = True
self.save(update_fields=['pending_deletion']) self.save(update_fields=['pending_deletion'])
self.jobtemplates.clear() self.jobtemplates.clear()
activity_stream_delete(Inventory, self, inventory_delete_flag=True)
self.websocket_emit_status('pending_deletion') self.websocket_emit_status('pending_deletion')
delete_inventory.delay(self.pk, user_id) delete_inventory.delay(self.pk, user_id)

View File

@@ -434,6 +434,12 @@ def activity_stream_delete(sender, instance, **kwargs):
# Skip recording any inventory source directly associated with a group. # Skip recording any inventory source directly associated with a group.
if isinstance(instance, InventorySource) and instance.deprecated_group: if isinstance(instance, InventorySource) and instance.deprecated_group:
return return
# Inventory delete happens in the task system rather than request-response-cycle.
# If we trigger this handler there we may fall into db-integrity-related race conditions.
# So we add flag verification to prevent normal signal handling. This funciton will be
# explicitly called with flag on in Inventory.schedule_deletion.
if isinstance(instance, Inventory) and not kwargs.get('inventory_delete_flag', False):
return
changes = model_to_dict(instance) changes = model_to_dict(instance)
object1 = camelcase_to_underscore(instance.__class__.__name__) object1 = camelcase_to_underscore(instance.__class__.__name__)
activity_entry = ActivityStream( activity_entry = ActivityStream(

View File

@@ -5,7 +5,7 @@ from django.core.exceptions import ValidationError
from awx.api.versioning import reverse from awx.api.versioning import reverse
from awx.main.models import InventorySource, Inventory from awx.main.models import InventorySource, Inventory, ActivityStream
import json import json
@@ -83,6 +83,7 @@ def test_async_inventory_deletion(delete, get, inventory, alice):
inventory.admin_role.members.add(alice) inventory.admin_role.members.add(alice)
resp = delete(reverse('api:inventory_detail', kwargs={'pk': inventory.id}), alice) resp = delete(reverse('api:inventory_detail', kwargs={'pk': inventory.id}), alice)
assert resp.status_code == 202 assert resp.status_code == 202
assert ActivityStream.objects.filter(operation='delete').exists()
resp = get(reverse('api:inventory_detail', kwargs={'pk': inventory.id}), alice) resp = get(reverse('api:inventory_detail', kwargs={'pk': inventory.id}), alice)
assert resp.status_code == 200 assert resp.status_code == 200