Skip to content

Commit a53208f

Browse files
committed
changelog extension model v1
1 parent dd810be commit a53208f

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from django.core.management.base import BaseCommand
2+
from extras.models import ObjectChange
3+
from .models import ChangeLogSummary
4+
5+
class Command(BaseCommand):
6+
help = 'Creates ChangeLogSummary objects for ObjectChanges that do not have one'
7+
8+
def handle(self, *args, **options):
9+
# Get all ObjectChanges that don't have a summary and have action='update'
10+
object_changes = ObjectChange.objects.filter(
11+
action='update'
12+
).exclude(
13+
id__in=ChangeLogSummary.objects.values_list('changelog_id', flat=True)
14+
)
15+
16+
count = 0
17+
for change in object_changes:
18+
summary = []
19+
if change.prechange_data and change.postchange_data:
20+
pre_keys = set(change.prechange_data.keys())
21+
post_keys = set(change.postchange_data.keys())
22+
23+
# Find added keys
24+
added_keys = post_keys - pre_keys
25+
for key in added_keys:
26+
summary.append(f"Added {key}")
27+
28+
# Find removed keys
29+
removed_keys = pre_keys - post_keys
30+
for key in removed_keys:
31+
summary.append(f"Removed {key}")
32+
33+
# Check for updated values in common keys
34+
common_keys = pre_keys & post_keys
35+
for key in common_keys:
36+
if change.prechange_data[key] != change.postchange_data[key]:
37+
summary.append(f"Updated {key}")
38+
39+
ChangeLogSummary.objects.create(
40+
changelog=change,
41+
summary=", ".join(summary) if summary else "No changes detected"
42+
)
43+
count += 1
44+
45+
self.stdout.write(
46+
self.style.SUCCESS(f'Successfully created {count} new changelog summaries')
47+
)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,27 @@
11
from django.db import models
22
from django.urls import reverse
33
from netbox.models import NetBoxModel
4+
5+
class ChangeLogSummary(NetBoxModel):
6+
"""Model to store human-readable summaries of changelogs"""
7+
8+
changelog = models.ForeignKey(
9+
to='extras.ObjectChange',
10+
on_delete=models.CASCADE,
11+
related_name='summaries'
12+
)
13+
14+
summary = models.TextField(
15+
help_text="Human readable summary of the changes made"
16+
)
17+
18+
class Meta:
19+
verbose_name = "Changelog Summary"
20+
verbose_name_plural = "Changelog Summaries"
21+
ordering = ['-changelog__time']
22+
23+
def __str__(self):
24+
return f"Summary for change {self.changelog.id}"
25+
26+
def get_absolute_url(self):
27+
return reverse('plugins:netbox_changelog_diff_plugin:changelogsummary', args=[self.pk])

0 commit comments

Comments
 (0)