From 612f78e7ebf97e7464526d6787215a76203223b9 Mon Sep 17 00:00:00 2001 From: Alexey Kryuchkov Date: Sat, 27 May 2023 00:59:28 +0300 Subject: [PATCH] in cleanup_old_media, filter in database rather than in Python --- tubesync/sync/tasks.py | 18 ++++++++---------- tubesync/sync/tests.py | 32 +++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/tubesync/sync/tasks.py b/tubesync/sync/tasks.py index def7529..720f8ae 100644 --- a/tubesync/sync/tasks.py +++ b/tubesync/sync/tasks.py @@ -132,16 +132,14 @@ def cleanup_completed_tasks(): def cleanup_old_media(): - for media in Media.objects.filter(download_date__isnull=False): - if media.source.delete_old_media and media.source.days_to_keep > 0: - delta = timezone.now() - timedelta(days=media.source.days_to_keep) - if media.downloaded and media.download_date < delta: - # Media was downloaded after the cutoff date, delete it - log.info(f'Deleting expired media: {media.source} / {media} ' - f'(now older than {media.source.days_to_keep} days / ' - f'download_date before {delta})') - # .delete() also triggers a pre_delete signal that removes the files - media.delete() + for source in Source.objects.filter(delete_old_media=True, days_to_keep__gt=0): + delta = timezone.now() - timedelta(days=source.days_to_keep) + for media in source.media_source.filter(downloaded=True, download_date__lt=delta): + log.info(f'Deleting expired media: {source} / {media} ' + f'(now older than {source.days_to_keep} days / ' + f'download_date before {delta})') + # .delete() also triggers a pre_delete signal that removes the files + media.delete() @background(schedule=0) diff --git a/tubesync/sync/tests.py b/tubesync/sync/tests.py index 25fecc0..11cedf6 100644 --- a/tubesync/sync/tests.py +++ b/tubesync/sync/tests.py @@ -6,7 +6,7 @@ import logging -from datetime import datetime +from datetime import datetime, timedelta from urllib.parse import urlsplit from xml.etree import ElementTree from django.conf import settings @@ -14,6 +14,7 @@ from django.test import TestCase, Client from django.utils import timezone from background_task.models import Task from .models import Source, Media +from .tasks import cleanup_old_media class FrontEndTestCase(TestCase): @@ -1397,3 +1398,32 @@ class FormatMatchingTestCase(TestCase): match_type, format_code = self.media.get_best_video_format() self.assertEqual(format_code, expected_format_code) 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)