mirror of
https://github.com/ansible/awx.git
synced 2026-05-12 20:07:37 -02:30
deleted related in activity stream tests/surfacing
This adds a test to replicate the scenario reported about bugs in activity stream entry generation in cascade delete chains. Also puts a new string in the entry that uses the deleted objects's primary key.
This commit is contained in:
@@ -8,9 +8,18 @@ from awx.main.models import (
|
|||||||
Organization,
|
Organization,
|
||||||
JobTemplate,
|
JobTemplate,
|
||||||
Credential,
|
Credential,
|
||||||
CredentialType
|
CredentialType,
|
||||||
|
InventorySource
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# other AWX
|
||||||
|
from awx.main.utils import model_to_dict
|
||||||
|
from awx.api.serializers import InventorySourceSerializer
|
||||||
|
|
||||||
|
|
||||||
|
model_serializer_mapping = {
|
||||||
|
InventorySource: InventorySourceSerializer
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class TestImplicitRolesOmitted:
|
class TestImplicitRolesOmitted:
|
||||||
@@ -140,3 +149,11 @@ class TestUserModels:
|
|||||||
entry = ActivityStream.objects.filter(user=alice)[0]
|
entry = ActivityStream.objects.filter(user=alice)[0]
|
||||||
assert entry.operation == 'create'
|
assert entry.operation == 'create'
|
||||||
assert json.loads(entry.changes)['password'] == 'hidden'
|
assert json.loads(entry.changes)['password'] == 'hidden'
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_missing_related_on_delete(inventory_source):
|
||||||
|
old_is = InventorySource.objects.get(name=inventory_source.name)
|
||||||
|
inventory_source.inventory.delete()
|
||||||
|
d = model_to_dict(old_is, serializer_mapping=model_serializer_mapping)
|
||||||
|
assert d['inventory'] == '<missing inventory source>-{}'.format(old_is.inventory_id)
|
||||||
|
|||||||
@@ -289,7 +289,10 @@ def get_allowed_fields(obj, serializer_mapping):
|
|||||||
def _convert_model_field_for_display(obj, field_name, password_fields=None):
|
def _convert_model_field_for_display(obj, field_name, password_fields=None):
|
||||||
# NOTE: Careful modifying the value of field_val, as it could modify
|
# NOTE: Careful modifying the value of field_val, as it could modify
|
||||||
# underlying model object field value also.
|
# underlying model object field value also.
|
||||||
field_val = getattr(obj, field_name, None)
|
try:
|
||||||
|
field_val = getattr(obj, field_name, None)
|
||||||
|
except ObjectDoesNotExist:
|
||||||
|
return '<missing {}>-{}'.format(obj._meta.verbose_name, getattr(obj, '{}_id'.format(field_name)))
|
||||||
if password_fields is None:
|
if password_fields is None:
|
||||||
password_fields = set(getattr(type(obj), 'PASSWORD_FIELDS', [])) | set(['password'])
|
password_fields = set(getattr(type(obj), 'PASSWORD_FIELDS', [])) | set(['password'])
|
||||||
if field_name in password_fields:
|
if field_name in password_fields:
|
||||||
@@ -355,10 +358,7 @@ def model_to_dict(obj, serializer_mapping=None):
|
|||||||
for field in obj._meta.fields:
|
for field in obj._meta.fields:
|
||||||
if field.name not in allowed_fields:
|
if field.name not in allowed_fields:
|
||||||
continue
|
continue
|
||||||
try:
|
attr_d[field.name] = _convert_model_field_for_display(obj, field.name, password_fields=password_fields)
|
||||||
attr_d[field.name] = _convert_model_field_for_display(obj, field.name, password_fields=password_fields)
|
|
||||||
except ObjectDoesNotExist:
|
|
||||||
logger.warn(_('%s no longer exists for %s') % (field.name, obj))
|
|
||||||
|
|
||||||
return attr_d
|
return attr_d
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user