Moves the renaming triggered from a storage path change to be a background task

This commit is contained in:
Trenton H 2023-02-17 16:55:58 -08:00
parent 2daee375d0
commit 5e3ef94697
2 changed files with 56 additions and 5 deletions

View File

@ -21,6 +21,7 @@ from django.utils import timezone
from filelock import FileLock from filelock import FileLock
from .. import matching from .. import matching
from ..bulk_edit import bulk_update_documents
from ..file_handling import create_source_path_directory from ..file_handling import create_source_path_directory
from ..file_handling import delete_empty_directories from ..file_handling import delete_empty_directories
from ..file_handling import generate_unique_filename from ..file_handling import generate_unique_filename
@ -385,7 +386,7 @@ def validate_move(instance, old_path, new_path):
@receiver(models.signals.m2m_changed, sender=Document.tags.through) @receiver(models.signals.m2m_changed, sender=Document.tags.through)
@receiver(models.signals.post_save, sender=Document) @receiver(models.signals.post_save, sender=Document)
def update_filename_and_move_files(sender, instance, **kwargs): def update_filename_and_move_files(sender, instance: Document, **kwargs):
if not instance.filename: if not instance.filename:
# Can't update the filename if there is no filename to begin with # Can't update the filename if there is no filename to begin with
@ -497,13 +498,14 @@ def update_filename_and_move_files(sender, instance, **kwargs):
@receiver(models.signals.post_save, sender=StoragePath) @receiver(models.signals.post_save, sender=StoragePath)
def update_document_storage_path(sender, instance, **kwargs): def update_document_storage_path(sender, instance: StoragePath, **kwargs):
""" """
Triggers when a storage path is changed, running against any documents using Triggers when a storage path is changed, running against any documents using
the path, and checks to see if they need to be renamed the path, and checks to see if they need to be renamed
""" """
for document in instance.documents.all(): doc_ids = [doc.id for doc in instance.documents.all()]
update_filename_and_move_files(None, document) if len(doc_ids):
bulk_update_documents.delay(doc_ids)
def set_log_entry(sender, document=None, logging_group=None, **kwargs): def set_log_entry(sender, document=None, logging_group=None, **kwargs):

View File

@ -10,6 +10,7 @@ from django.test import override_settings
from django.test import TestCase from django.test import TestCase
from django.utils import timezone from django.utils import timezone
from ..bulk_edit import bulk_update_documents
from ..file_handling import create_source_path_directory from ..file_handling import create_source_path_directory
from ..file_handling import delete_empty_directories from ..file_handling import delete_empty_directories
from ..file_handling import generate_filename from ..file_handling import generate_filename
@ -1032,7 +1033,8 @@ class TestFilenameGeneration(DirectoriesMixin, TestCase):
self.assertEqual(generate_filename(doc_a), "0000002.pdf") self.assertEqual(generate_filename(doc_a), "0000002.pdf")
self.assertEqual(generate_filename(doc_b), "SomeImportantNone/2020-07-25.pdf") self.assertEqual(generate_filename(doc_b), "SomeImportantNone/2020-07-25.pdf")
def test_document_storage_path_changed(self): @mock.patch("documents.bulk_edit.bulk_update_documents.delay")
def test_document_storage_path_changed_with_doc(self, bulk_update_mock):
""" """
GIVEN: GIVEN:
- Document with a defined storage path - Document with a defined storage path
@ -1062,6 +1064,9 @@ class TestFilenameGeneration(DirectoriesMixin, TestCase):
document.save() document.save()
# Change format # Change format
bulk_update_mock.side_effect = (
bulk_update_documents # call through, no Redis needed
)
sp.path = "NewFolder/{created}" sp.path = "NewFolder/{created}"
sp.save() sp.save()
@ -1073,6 +1078,50 @@ class TestFilenameGeneration(DirectoriesMixin, TestCase):
) )
self.assertTrue(os.path.isfile(document.source_path)) self.assertTrue(os.path.isfile(document.source_path))
@mock.patch("documents.bulk_edit.bulk_update_documents.delay")
def test_document_storage_path_changed_with_no_doc(self, bulk_update_mock):
"""
GIVEN:
- Document with no storage path
- Storage path exist
WHEN:
- The storage path format is updated
THEN:
- No changes to document
"""
sp = StoragePath.objects.create(path="TestFolder/{created}")
document = Document.objects.create(
mime_type="application/pdf",
created=timezone.make_aware(datetime.datetime(2021, 6, 25, 7, 36, 51, 153)),
)
# Ensure that filename is properly generated
document.filename = generate_filename(document)
self.assertEqual(
document.source_path,
os.path.join(settings.ORIGINALS_DIR, f"{document.pk:07}.pdf"),
)
# Actually create the file
create_source_path_directory(document.source_path)
Path(document.source_path).touch()
self.assertTrue(os.path.isfile(document.source_path))
document.save()
# Change format
sp.path = "NewFolder/{created}"
sp.save()
bulk_update_mock.assert_not_called()
document.refresh_from_db()
self.assertEqual(
document.source_path,
os.path.join(settings.ORIGINALS_DIR, f"{document.pk:07}.pdf"),
)
self.assertTrue(os.path.isfile(document.source_path))
@override_settings( @override_settings(
FILENAME_FORMAT="{created_year_short}/{created_month_name_short}/{created_month_name}/{title}", FILENAME_FORMAT="{created_year_short}/{created_month_name_short}/{created_month_name}/{title}",
) )