Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion share/management/commands/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def rollback_unless_commit(self, commit):
except Rollback:
pass

def input_confirm(self, prompt, default=None):
def input_confirm(self, prompt, default=None) -> bool:
result = input(prompt)
if not result and default is not None:
return default
Expand Down
38 changes: 38 additions & 0 deletions share/management/commands/delete_pretrove_data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from django.db.models import OuterRef, Exists
from django.utils.translation import gettext as _

from share.management.commands import BaseShareCommand
from share import models as _db


class Command(BaseShareCommand):
def add_arguments(self, parser):
parser.add_argument('--really-really', action='store_true', help='skip final confirmation prompt before really deleting')

def handle(self, *args, really_really: bool, **kwargs):
_pretrove_configs = _db.SourceConfig.objects.exclude(transformer_key='rdf')
_pretrove_configs_with_rawdata = (
_pretrove_configs
.annotate(has_rawdata=Exists(
_db.RawDatum.objects
.filter(suid__source_config_id=OuterRef('pk'))
))
.filter(has_rawdata=True)
)
if not _pretrove_configs_with_rawdata.exists():
self.stdout.write(self.style.SUCCESS(_('nothing to delete')))
return
self.stdout.write(self.style.WARNING(_('pre-trove source-configs with deletable rawdata:')))
for _label in _pretrove_configs_with_rawdata.values_list('label', flat=True):
self.stdout.write(f'\t{_label}')
if really_really or self.input_confirm(self.style.WARNING(_('really DELETE ALL raw metadata records belonging to these source-configs? (y/n)'))):
self.stdout.write(_('deleting...'))
_rawdata_to_delete = (
_db.RawDatum.objects
.filter(suid__source_config_id__in=_pretrove_configs)
)
_deleted_total, _deleted_counts = _rawdata_to_delete.delete()
for _name, _count in _deleted_counts.items():
self.stdout.write(self.style.SUCCESS(f'{_name}: deleted {_count}'))
else:
self.stdout.write(self.style.SUCCESS('deleted nothing'))
30 changes: 30 additions & 0 deletions trove/migrations/0007_rawdata_fks_do_nothing.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Generated by Django 3.2.25 on 2025-04-21 14:59

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('share', '0077_big_cleanup_2025'),
('trove', '0006_supplementary_indexcard_rdf'),
]

operations = [
migrations.AlterField(
model_name='archivedindexcardrdf',
name='from_raw_datum',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='share.rawdatum'),
),
migrations.AlterField(
model_name='latestindexcardrdf',
name='from_raw_datum',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='share.rawdatum'),
),
migrations.AlterField(
model_name='supplementaryindexcardrdf',
name='from_raw_datum',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='share.rawdatum'),
),
]
2 changes: 1 addition & 1 deletion trove/models/indexcard.py
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ class IndexcardRdf(models.Model):
# required:
from_raw_datum = models.ForeignKey(
share_db.RawDatum,
on_delete=models.CASCADE,
on_delete=models.DO_NOTHING, # allows faster bulk-deletion of unused RawDatum (but errors deleting used RawDatum)
related_name='+',
)
indexcard = models.ForeignKey(
Expand Down