Last active
September 8, 2017 18:27
-
-
Save alexphelps/1ac8308bdf3bd53fb6dea1712ec7297e to your computer and use it in GitHub Desktop.
Event save
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ModelDiffMixin(object): | |
""" | |
Ref: https://stackoverflow.com/questions/1355150/django-when-saving-how-can-you-check-if-a-field-has-changed | |
""" | |
def __init__(self, *args, **kwargs): | |
super(ModelDiffMixin, self).__init__(*args, **kwargs) | |
self.__initial = self._dict | |
@property | |
def _dict(self): | |
return model_to_dict( | |
self, | |
fields=[field.name for field in self._meta.fields] | |
) | |
@property | |
def model_diff(self): | |
initial_data = self.__initial | |
new_data = self._dict | |
data_diff = diff(new_data, initial_data, dump=True) | |
return json.loads(data_diff) | |
@property | |
def has_changed(self): | |
return bool(self.model_diff) | |
class Mid(Timestampable, ModelDiffMixin, models.Model): | |
... | |
@receiver(post_save, sender=Mid) | |
def save_events(sender, instance, created, *args, **kwargs): | |
user = CuserMiddleware.get_user() | |
object_data = serialize('json', [instance, ]) | |
object_json = json.loads(object_data) | |
if created: | |
event_type = 'mid:created' | |
save_data = object_json | |
log_event( | |
user=user, | |
event_type=event_type, | |
content_type=instance, | |
event_object_id=instance.id, | |
data=save_data | |
) | |
elif not created and instance.has_changed: | |
event_type = 'mid:updated' | |
previous_attributes = instance.model_diff | |
object_json[0]['previous_attributes'] = previous_attributes | |
save_data = object_json | |
log_event( | |
user=user, | |
event_type=event_type, | |
content_type=instance, | |
event_object_id=instance.id, | |
data=save_data | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment