mirror of
https://github.com/meeb/tubesync.git
synced 2025-06-26 15:06:36 +00:00
Merge pull request #1093 from tcely/patch-13
Re-work the re-use of old metadata after deletion
This commit is contained in:
commit
aa0b134407
@ -4,7 +4,7 @@ from tempfile import TemporaryDirectory
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import IntegrityError
|
from django.db import IntegrityError
|
||||||
from django.db.models.signals import pre_save, post_save, pre_delete, post_delete
|
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.dispatch import receiver
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from background_task.signals import task_failed
|
from background_task.signals import task_failed
|
||||||
@ -435,13 +435,35 @@ def media_post_delete(sender, instance, **kwargs):
|
|||||||
key=skipped_media.key,
|
key=skipped_media.key,
|
||||||
)
|
)
|
||||||
try:
|
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:
|
except IntegrityError:
|
||||||
# Delete the new metadata
|
# this probably won't happen, but try it without a transaction
|
||||||
Metadata.objects.filter(media=skipped_media).delete()
|
|
||||||
try:
|
try:
|
||||||
instance_qs.update(media=skipped_media)
|
# clear the link to a media instance
|
||||||
except IntegrityError:
|
Metadata.objects.filter(media=skipped_media).update(media=None)
|
||||||
# Delete the old metadata if it still failed
|
# 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()
|
instance_qs.delete()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user