def save(self, *args, **kwargs): # Signals and some bits of logic only happen on a new award. is_new = not self.pk if is_new: # Bail if this is an attempt to double-award a unique badge if self.badge.unique and self.badge.is_awarded_to(self.user): raise BadgeAlreadyAwardedException() # Only fire will-be-awarded signal on a new award. badge_will_be_awarded.send(sender=self.__class__, award=self) super(Award, self).save(*args, **kwargs) if is_new: # Only fire was-awarded signal on a new award. # TODO: we might not need this as there are no more notifications badge_was_awarded.send(sender=self.__class__, award=self)