From 92696a2a8604d981ce0cab325d7f05ba7f6f70d3 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Fri, 22 Mar 2024 10:34:09 +0100 Subject: [PATCH] [#3688] Add a `post_delete` signal to properly handle deletions --- src/openforms/submissions/signals.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/openforms/submissions/signals.py b/src/openforms/submissions/signals.py index b496e775b3..e2547f4cee 100644 --- a/src/openforms/submissions/signals.py +++ b/src/openforms/submissions/signals.py @@ -1,13 +1,18 @@ import logging +from django.db import transaction from django.db.models import F -from django.db.models.base import ModelBase from django.db.models.signals import post_delete from django.dispatch import Signal, receiver from django.utils import timezone from openforms.forms.models.form_statistics import FormStatistics -from openforms.submissions.models import Submission, SubmissionReport +from openforms.submissions.models import ( + Submission, + SubmissionFileAttachment, + SubmissionReport, +) +from openforms.utils.files import _delete_obj_files, get_file_field_names logger = logging.getLogger(__name__) @@ -53,9 +58,23 @@ """ +@receiver(post_delete, sender=SubmissionFileAttachment) +def delete_obj_files( + sender: type[SubmissionFileAttachment], instance: SubmissionFileAttachment, **kwargs +): + """A ``post_delete`` signal ensuring file deletion on database record deletion. + + The implementation is identical to the :class:`openforms.utils.files.DeleteFileFieldFilesMixin` class, + and is required as the Django deletion internals might not call the model's ``delete`` in all cases. + """ + file_field_names = get_file_field_names(sender) + with transaction.atomic(): + _delete_obj_files(file_field_names, instance) + + @receiver(post_delete, sender=SubmissionReport) def delete_submission_report_files( - sender: ModelBase, instance: SubmissionReport, **kwargs + sender: type[SubmissionReport], instance: SubmissionReport, **kwargs ) -> None: logger.debug("Deleting file %r", instance.content.name)