Guest User

Untitled

a guest
Apr 23rd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.20 KB | None | 0 0
  1. # django
  2. from django.forms import model_to_dict
  3.  
  4.  
  5. class ModelDiffMixin(object):
  6. """
  7. A model mixin that tracks model fields' values and provide some useful api
  8. to know what fields have been changed.
  9. """
  10. def __init__(self, *args, **kwargs):
  11. super(ModelDiffMixin, self).__init__(*args, **kwargs)
  12. self.__initial = self._dict
  13.  
  14. @property
  15. def diff(self):
  16. d1 = self.__initial
  17. d2 = self._dict
  18. diffs = [(k, (v, d2[k])) for k, v in d1.items() if v != d2[k]]
  19. return dict(diffs)
  20.  
  21. @property
  22. def has_changed(self):
  23. return bool(self.diff)
  24.  
  25. @property
  26. def changed_fields(self):
  27. return self.diff.keys()
  28.  
  29. def get_field_diff(self, field_name):
  30. """
  31. Returns a diff for field if it's changed and None otherwise.
  32. """
  33. return self.diff.get(field_name, None)
  34.  
  35. def save(self, *args, **kwargs):
  36. """
  37. Saves model and set initial state.
  38. """
  39. super(ModelDiffMixin, self).save(*args, **kwargs)
  40. self.__initial = self._dict
  41.  
  42. @property
  43. def _dict(self):
  44. return model_to_dict(
  45. self,
  46. fields=[field.name for field in self._meta.fields]
  47. )
Add Comment
Please, Sign In to add comment