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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user