Merge pull request #381 from a-kr/fix_cleanup_old_media

in cleanup_old_media, filter in database rather than in Python
This commit is contained in:
meeb 2023-05-27 14:03:35 +10:00 committed by GitHub
commit b9886a3b27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 11 deletions

View File

@ -132,16 +132,14 @@ def cleanup_completed_tasks():
def cleanup_old_media(): def cleanup_old_media():
for media in Media.objects.filter(download_date__isnull=False): for source in Source.objects.filter(delete_old_media=True, days_to_keep__gt=0):
if media.source.delete_old_media and media.source.days_to_keep > 0: delta = timezone.now() - timedelta(days=source.days_to_keep)
delta = timezone.now() - timedelta(days=media.source.days_to_keep) for media in source.media_source.filter(downloaded=True, download_date__lt=delta):
if media.downloaded and media.download_date < delta: log.info(f'Deleting expired media: {source} / {media} '
# Media was downloaded after the cutoff date, delete it f'(now older than {source.days_to_keep} days / '
log.info(f'Deleting expired media: {media.source} / {media} ' f'download_date before {delta})')
f'(now older than {media.source.days_to_keep} days / ' # .delete() also triggers a pre_delete signal that removes the files
f'download_date before {delta})') media.delete()
# .delete() also triggers a pre_delete signal that removes the files
media.delete()
@background(schedule=0) @background(schedule=0)

View File

@ -6,7 +6,7 @@
import logging import logging
from datetime import datetime from datetime import datetime, timedelta
from urllib.parse import urlsplit from urllib.parse import urlsplit
from xml.etree import ElementTree from xml.etree import ElementTree
from django.conf import settings from django.conf import settings
@ -14,6 +14,7 @@ from django.test import TestCase, Client
from django.utils import timezone from django.utils import timezone
from background_task.models import Task from background_task.models import Task
from .models import Source, Media from .models import Source, Media
from .tasks import cleanup_old_media
class FrontEndTestCase(TestCase): class FrontEndTestCase(TestCase):
@ -1397,3 +1398,32 @@ class FormatMatchingTestCase(TestCase):
match_type, format_code = self.media.get_best_video_format() match_type, format_code = self.media.get_best_video_format()
self.assertEqual(format_code, expected_format_code) self.assertEqual(format_code, expected_format_code)
self.assertEqual(match_type, expeceted_match_type) self.assertEqual(match_type, expeceted_match_type)
class TasksTestCase(TestCase):
def setUp(self):
# Disable general logging for test case
logging.disable(logging.CRITICAL)
def test_delete_old_media(self):
src1 = Source.objects.create(key='aaa', name='aaa', directory='/tmp/a', delete_old_media=False, days_to_keep=14)
src2 = Source.objects.create(key='bbb', name='bbb', directory='/tmp/b', delete_old_media=True, days_to_keep=14)
now = timezone.now()
m11 = Media.objects.create(source=src1, downloaded=True, key='a11', download_date=now - timedelta(days=5))
m12 = Media.objects.create(source=src1, downloaded=True, key='a12', download_date=now - timedelta(days=25))
m13 = Media.objects.create(source=src1, downloaded=False, key='a13')
m21 = Media.objects.create(source=src2, downloaded=True, key='a21', download_date=now - timedelta(days=5))
m22 = Media.objects.create(source=src2, downloaded=True, key='a22', download_date=now - timedelta(days=25))
m23 = Media.objects.create(source=src2, downloaded=False, key='a23')
self.assertEquals(src1.media_source.all().count(), 3)
self.assertEquals(src2.media_source.all().count(), 3)
cleanup_old_media()
self.assertEquals(src1.media_source.all().count(), 3)
self.assertEquals(src2.media_source.all().count(), 2)
self.assertEquals(Media.objects.filter(pk=m22.pk).exists(), False)