瀏覽代碼

Move deleting old image / document files to task

Jake Howard 9 月之前
父節點
當前提交
bc9d5da38f
共有 4 個文件被更改,包括 23 次插入5 次删除
  1. 6 2
      wagtail/documents/signal_handlers.py
  2. 2 1
      wagtail/images/apps.py
  3. 6 2
      wagtail/images/signal_handlers.py
  4. 9 0
      wagtail/tasks.py

+ 6 - 2
wagtail/documents/signal_handlers.py

@@ -2,11 +2,15 @@ from django.db import transaction
 from django.db.models.signals import post_delete
 
 from wagtail.documents import get_document_model
+from wagtail.tasks import delete_file_from_storage_task
 
 
 def post_delete_file_cleanup(instance, **kwargs):
-    # Pass false so FileField doesn't save the model.
-    transaction.on_commit(lambda: instance.file.delete(False))
+    transaction.on_commit(
+        lambda: delete_file_from_storage_task.enqueue(
+            instance.file.storage.deconstruct(), instance.file.name
+        )
+    )
 
 
 def register_signal_handlers():

+ 2 - 1
wagtail/images/apps.py

@@ -3,7 +3,6 @@ from django.db.models import ForeignKey
 from django.utils.translation import gettext_lazy as _
 
 from . import checks, get_image_model  # NOQA: F401
-from .signal_handlers import register_signal_handlers
 
 
 class WagtailImagesAppConfig(AppConfig):
@@ -14,6 +13,8 @@ class WagtailImagesAppConfig(AppConfig):
     default_attrs = {}
 
     def ready(self):
+        from .signal_handlers import register_signal_handlers
+
         register_signal_handlers()
 
         # Set up model forms to use AdminImageChooser for any ForeignKey to the image model

+ 6 - 2
wagtail/images/signal_handlers.py

@@ -3,13 +3,17 @@ from django.db import transaction
 from django.db.models.signals import post_delete, post_save
 
 from wagtail.images import get_image_model
+from wagtail.tasks import delete_file_from_storage_task
 
 from .tasks import set_image_focal_point_task
 
 
 def post_delete_file_cleanup(instance, **kwargs):
-    # Pass false so FileField doesn't save the model.
-    transaction.on_commit(lambda: instance.file.delete(False))
+    transaction.on_commit(
+        lambda: delete_file_from_storage_task.enqueue(
+            instance.file.storage.deconstruct(), instance.file.name
+        )
+    )
 
 
 def post_delete_purge_rendition_cache(instance, **kwargs):

+ 9 - 0
wagtail/tasks.py

@@ -1,5 +1,6 @@
 from django.apps import apps
 from django.db import transaction
+from django.utils.module_loading import import_string
 from django_tasks import task
 from modelcluster.fields import ParentalKey
 
@@ -30,3 +31,11 @@ def update_reference_index_task(app_label, model_name, pk):
     if ReferenceIndex.is_indexed(instance._meta.model):
         with transaction.atomic():
             ReferenceIndex.create_or_update_for_object(instance)
+
+
+@task()
+def delete_file_from_storage_task(deconstructed_storage, path):
+    storage_module, storage_args, storage_kwargs = deconstructed_storage
+    storage = import_string(storage_module)(*storage_args, **storage_kwargs)
+
+    storage.delete(path)