Skip to content

Instantly share code, notes, and snippets.

@alexphelps
Last active September 8, 2017 18:27
Show Gist options
  • Save alexphelps/1ac8308bdf3bd53fb6dea1712ec7297e to your computer and use it in GitHub Desktop.
Save alexphelps/1ac8308bdf3bd53fb6dea1712ec7297e to your computer and use it in GitHub Desktop.
Event save
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