website/thaliawebsite/api/v2/admin/model/diff.py
from django.forms import model_to_dict
class ModelDiffCalculator:
def __init__(self, initial):
self.__initial = self._dict(initial)
self._new_object = None
def set_changed_model(self, new_object):
data = self._dict(new_object)
if self._new_object is not None:
self.__initial = data
self._new_object = data
return self
@property
def diff(self):
if not self._new_object:
return {}
d1 = self.__initial
d2 = self._new_object
diffs = [(k, (v, d2[k])) for k, v in d1.items() if v != d2[k]]
return dict(diffs)
@property
def has_changed(self):
return bool(self.diff)
@property
def changed_fields(self):
return list(self.diff.keys())
def get_field_diff(self, field_name):
return self.diff.get(field_name, None)
def _dict(self, model):
return model_to_dict(model, fields=[field.name for field in model._meta.fields])