|
| 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 | + ) |
0 commit comments