1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Extend ObjectChange to optionally indicate a related object (e.g. a parent device)

This commit is contained in:
Jeremy Stretch
2018-06-22 15:05:40 -04:00
parent 6c1b5fdf3a
commit 2d198403c7
8 changed files with 136 additions and 43 deletions

View File

@ -665,7 +665,9 @@ class ReportResult(models.Model):
@python_2_unicode_compatible
class ObjectChange(models.Model):
"""
Record a change to an object and the user account associated with that change.
Record a change to an object and the user account associated with that change. A change record may optionally
indicate an object related to the one being changed. For example, a change to an interface may also indicate the
parent device. This will ensure changes made to component models appear in the parent model's changelog.
"""
time = models.DateTimeField(
auto_now_add=True,
@ -688,14 +690,30 @@ class ObjectChange(models.Model):
action = models.PositiveSmallIntegerField(
choices=OBJECTCHANGE_ACTION_CHOICES
)
content_type = models.ForeignKey(
changed_object_type = models.ForeignKey(
to=ContentType,
on_delete=models.CASCADE
on_delete=models.PROTECT,
related_name='+'
)
object_id = models.PositiveIntegerField()
changed_object_id = models.PositiveIntegerField()
changed_object = GenericForeignKey(
ct_field='content_type',
fk_field='object_id'
ct_field='changed_object_type',
fk_field='changed_object_id'
)
related_object_type = models.ForeignKey(
to=ContentType,
on_delete=models.PROTECT,
related_name='+',
blank=True,
null=True
)
related_object_id = models.PositiveIntegerField(
blank=True,
null=True
)
related_object = GenericForeignKey(
ct_field='related_object_type',
fk_field='related_object_id'
)
object_repr = models.CharField(
max_length=200,
@ -706,14 +724,17 @@ class ObjectChange(models.Model):
)
serializer = 'extras.api.serializers.ObjectChangeSerializer'
csv_headers = ['time', 'user', 'request_id', 'action', 'content_type', 'object_id', 'object_repr', 'object_data']
csv_headers = [
'time', 'user', 'user_name', 'request_id', 'action', 'changed_object_type', 'changed_object_id',
'related_object_type', 'related_object_id', 'object_repr', 'object_data',
]
class Meta:
ordering = ['-time']
def __str__(self):
return '{} {} {} by {}'.format(
self.content_type,
self.changed_object_type,
self.object_repr,
self.get_action_display().lower(),
self.user_name
@ -722,8 +743,7 @@ class ObjectChange(models.Model):
def save(self, *args, **kwargs):
# Record the user's name and the object's representation as static strings
if self.user is not None:
self.user_name = self.user.username
self.user_name = self.user.username
self.object_repr = str(self.changed_object)
return super(ObjectChange, self).save(*args, **kwargs)
@ -734,11 +754,14 @@ class ObjectChange(models.Model):
def to_csv(self):
return (
self.time,
self.user or self.user_name,
self.user,
self.user_name,
self.request_id,
self.get_action_display(),
self.content_type,
self.object_id,
self.changed_object_type,
self.changed_object_id,
self.related_object_type,
self.related_object_id,
self.object_repr,
self.object_data,
)