refactor: Use post_delete for date override

Previously, using the bulk delete tool in the Django admin for
`CertificateDateOverride`s would not trigger the post to the credentials
service to delete the corresponding date override stored there. This was
because we were sending the COURSE_CERT_CHANGED signal from an
overridden version of the delete() method. But the Django docs warn:

"Note that the delete() method for an object is not necessarily called
when deleting objects in bulk using a QuerySet or as a result of a
cascading delete. To ensure customized delete logic gets executed, you
can use pre_delete and/or post_delete signals."

Now we use the post_delete signal instead of overriding the delete()
method to make sure the COURSE_CERT_CHANGED signal is sent for both
individual and bulk deletes.

MICROBA-1487
This commit is contained in:
oliviaruizknott
2021-08-31 13:08:34 -06:00
parent 14e2f29516
commit 703c917f2a

View File

@@ -1240,7 +1240,7 @@ class CertificateDateOverride(TimeStampedModel):
return "Certificate %s, date overridden to %s by %s on %s." % \
(self.generated_certificate, self.date, self.overridden_by, self.created)
def _send_course_cert_changed_signal(self):
def send_course_cert_changed_signal(self):
COURSE_CERT_CHANGED.send_robust(
sender=self.__class__,
user=self.generated_certificate.user,
@@ -1255,12 +1255,18 @@ class CertificateDateOverride(TimeStampedModel):
signal.
"""
super().save(*args, **kwargs)
transaction.on_commit(self._send_course_cert_changed_signal)
transaction.on_commit(self.send_course_cert_changed_signal)
def delete(self, *args, **kwargs): # pylint: disable=signature-differs
"""
After the base delete() method finishes, fire the COURSE_CERT_CHANGED
signal.
"""
super().delete(*args, **kwargs)
transaction.on_commit(self._send_course_cert_changed_signal)
@receiver(models.signals.post_delete, sender=CertificateDateOverride)
def handle_certificate_date_override_delete(sender, instance, **kwargs): # pylint: disable=unused-argument
"""
After a CertificateDateOverride is deleted, fire the COURSE_CERT_CHANGED
signal.
We do this in a signal handler instead of overriding the
CertificateDateOverride delete method so that this will be executed for both
individual and bulk deletes from the Django admin. (The delete() method for
an object is not necessarily called when deleting objects in bulk.)
"""
transaction.on_commit(instance.send_course_cert_changed_signal)