Skip to content

Commit c1d792a

Browse files
committed
add temporary record check command
1 parent 4504d78 commit c1d792a

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
"""
2+
Management command to clean up orphaned metadata records.
3+
4+
This command removes DatasetMetadata and UseCaseMetadata records
5+
that reference non-existent Metadata items.
6+
"""
7+
8+
from typing import Any
9+
10+
from django.core.management.base import BaseCommand, CommandParser
11+
from django.db.models import Q
12+
13+
from api.models import DatasetMetadata, UseCaseMetadata
14+
15+
16+
class Command(BaseCommand):
17+
help = "Clean up orphaned metadata records that reference deleted Metadata items"
18+
19+
def add_arguments(self, parser: CommandParser) -> None:
20+
parser.add_argument(
21+
"--dry-run",
22+
action="store_true",
23+
help="Show what would be deleted without actually deleting",
24+
)
25+
26+
def handle(self, *args: Any, **options: Any) -> None:
27+
dry_run = options["dry_run"]
28+
29+
if dry_run:
30+
self.stdout.write(
31+
self.style.WARNING("DRY RUN MODE - No changes will be made\n")
32+
)
33+
34+
# Find orphaned DatasetMetadata records
35+
orphaned_dataset_metadata = DatasetMetadata.objects.filter(
36+
metadata_item__isnull=True
37+
)
38+
dataset_count = orphaned_dataset_metadata.count()
39+
40+
# Find orphaned UseCaseMetadata records
41+
orphaned_usecase_metadata = UseCaseMetadata.objects.filter(
42+
metadata_item__isnull=True
43+
)
44+
usecase_count = orphaned_usecase_metadata.count()
45+
46+
total_count = dataset_count + usecase_count
47+
48+
if total_count == 0:
49+
self.stdout.write(
50+
self.style.SUCCESS("✓ No orphaned metadata records found")
51+
)
52+
return
53+
54+
self.stdout.write(
55+
self.style.WARNING(f"Found {total_count} orphaned metadata record(s):")
56+
)
57+
self.stdout.write(f" - DatasetMetadata: {dataset_count}")
58+
self.stdout.write(f" - UseCaseMetadata: {usecase_count}\n")
59+
60+
if dry_run:
61+
# Show details of what would be deleted
62+
if dataset_count > 0:
63+
self.stdout.write("DatasetMetadata records that would be deleted:")
64+
for meta in orphaned_dataset_metadata[:10]: # Show first 10
65+
self.stdout.write(
66+
f" - ID: {meta.id}, Dataset: {meta.dataset.title}, Value: {meta.value}" # type: ignore
67+
)
68+
if dataset_count > 10:
69+
self.stdout.write(f" ... and {dataset_count - 10} more")
70+
71+
if usecase_count > 0:
72+
self.stdout.write("\nUseCaseMetadata records that would be deleted:")
73+
for meta in orphaned_usecase_metadata[:10]: # Show first 10
74+
self.stdout.write(
75+
f" - ID: {meta.id}, UseCase: {meta.usecase.title}, Value: {meta.value}" # type: ignore
76+
)
77+
if usecase_count > 10:
78+
self.stdout.write(f" ... and {usecase_count - 10} more")
79+
80+
self.stdout.write(
81+
self.style.WARNING(
82+
f"\nRun without --dry-run to delete these {total_count} record(s)"
83+
)
84+
)
85+
else:
86+
# Actually delete the records
87+
deleted_dataset = orphaned_dataset_metadata.delete()
88+
deleted_usecase = orphaned_usecase_metadata.delete()
89+
90+
self.stdout.write(
91+
self.style.SUCCESS(
92+
f"✓ Successfully deleted {total_count} orphaned metadata record(s)"
93+
)
94+
)
95+
self.stdout.write(f" - DatasetMetadata: {deleted_dataset[0]}")
96+
self.stdout.write(f" - UseCaseMetadata: {deleted_usecase[0]}")

0 commit comments

Comments
 (0)