Merge pull request #1093 from tcely/patch-13

Re-work the re-use of old metadata after deletion
This commit is contained in:
meeb 2025-06-11 20:46:00 +10:00 committed by GitHub
commit aa0b134407
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -4,7 +4,7 @@ from tempfile import TemporaryDirectory
from django.conf import settings
from django.db import IntegrityError
from django.db.models.signals import pre_save, post_save, pre_delete, post_delete
from django.db.transaction import on_commit
from django.db.transaction import atomic, on_commit
from django.dispatch import receiver
from django.utils.translation import gettext_lazy as _
from background_task.signals import task_failed
@ -435,13 +435,35 @@ def media_post_delete(sender, instance, **kwargs):
key=skipped_media.key,
)
try:
instance_qs.update(media=skipped_media)
if instance_qs.count():
with atomic(durable=False):
# clear the link to a media instance
Metadata.objects.filter(media=skipped_media).update(media=None)
# choose the oldest metadata for our key
md = instance_qs.filter(
key=skipped_media.key,
).order_by(
'key',
'created',
).first()
# set the link to a media instance only on our selected metadata
log.info(f'Reusing old metadata for "{skipped_media.key}": {skipped_media.name}')
instance_qs.filter(uuid=md.uuid).update(media=skipped_media)
# delete any metadata that we are no longer using
instance_qs.exclude(uuid=md.uuid).delete()
except IntegrityError:
# Delete the new metadata
Metadata.objects.filter(media=skipped_media).delete()
# this probably won't happen, but try it without a transaction
try:
instance_qs.update(media=skipped_media)
except IntegrityError:
# Delete the old metadata if it still failed
# clear the link to a media instance
Metadata.objects.filter(media=skipped_media).update(media=None)
# keep one metadata
md = instance_qs.order_by('created').first()
instance_qs.filter(uuid=md.uuid).update(media=skipped_media)
except IntegrityError as e:
log.exception(f'media_post_delete: could not update selected metadata: {e}')
finally:
log.debug(f'Deleting metadata for "{skipped_media.key}": {skipped_media.pk}')
# delete the old metadata
instance_qs.delete()