catalog integrity check utility

This commit is contained in:
Your Name 2023-06-29 10:42:27 -04:00 committed by Henri Dickson
parent 9dc6de2069
commit 91d85a0a2a

View file

@ -1,6 +1,8 @@
from django.core.management.base import BaseCommand
from django.db.models import Count, F
import pprint
from catalog.models import *
from journal.models import update_journal_for_merged_item
class Command(BaseCommand):
@ -8,15 +10,106 @@ class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument(
"--cleanup",
"--verbose",
action="store_true",
help="purge invalid data (is_deleted=true)",
)
parser.add_argument(
"--fix",
action="store_true",
)
parser.add_argument(
"--purge",
action="store_true",
help="purge deleted items",
)
parser.add_argument(
"--integrity",
action="store_true",
help="check and fix integrity for merged and deleted items",
)
parser.add_argument(
"--journal",
action="store_true",
help="check and fix remaining journal for merged and deleted items",
)
def handle(self, *args, **options):
if options["cleanup"]:
for cls in Item.__subclasses__():
self.verbose = options["verbose"]
self.fix = options["fix"]
if options["purge"]:
self.purge()
if options["integrity"]:
self.integrity()
if options["journal"]:
self.journal()
self.stdout.write(self.style.SUCCESS(f"Done."))
def purge(self):
for cls in Item.__subclasses__():
if self.fix:
self.stdout.write(f"Cleaning up {cls}...")
cls.objects.filter(is_deleted=True).delete()
self.stdout.write(self.style.SUCCESS(f"Done."))
def integrity(self):
self.stdout.write(f"Checking circulated merge...")
for i in Item.objects.filter(merged_to_item=F("id")):
self.stdout.write(f"! {i} : {i.absolute_url}?skipcheck=1")
if self.fix:
i.merged_to_item = None
i.save()
self.stdout.write(f"Checking chained merge...")
for i in (
Item.objects.filter(merged_to_item__isnull=False)
.annotate(n=Count("merged_from_items"))
.exclude(n=0)
):
self.stdout.write(f"! {i} : {i.absolute_url}?skipcheck=1")
if self.fix:
for j in i.merged_from_items.all():
j.merged_to_item = i.merged_to_item
j.save()
self.stdout.write(f"Checking deleted merge...")
for i in Item.objects.filter(merged_to_item__isnull=False, is_deleted=True):
self.stdout.write(f"! {i} : {i.absolute_url}?skipcheck=1")
if self.fix:
i.is_deleted = False
i.save()
self.stdout.write(f"Checking deleted item with external resources...")
for i in (
Item.objects.filter(is_deleted=True)
.annotate(n=Count("external_resources"))
.exclude(n=0)
):
self.stdout.write(f"! {i} : {i.absolute_url}?skipcheck=1")
if self.fix:
for r in i.external_resources.all():
r.item = None
r.save()
self.stdout.write(f"Checking merged item with external resources...")
for i in (
Item.objects.filter(merged_to_item__isnull=False)
.annotate(n=Count("external_resources"))
.exclude(n=0)
):
self.stdout.write(f"! {i} : {i.absolute_url}?skipcheck=1")
if self.fix:
for r in i.external_resources.all():
r.item = i.merged_to_item
r.save()
def journal(self):
self.stdout.write(f"Checking deleted items with remaining journals...")
for i in Item.objects.filter(is_deleted=True):
if i.journal_exists():
self.stdout.write(f"! {i} : {i.absolute_url}?skipcheck=1")
self.stdout.write(f"Checking merged items with remaining journals...")
for i in Item.objects.filter(merged_to_item__isnull=False):
if i.journal_exists():
self.stdout.write(f"! {i} : {i.absolute_url}?skipcheck=1")
if self.fix:
update_journal_for_merged_item(i.url)