Coverage for website/thaliawebsite/api/v2/admin/model/diff.py: 81.82%

29 statements  

« prev     ^ index     » next       coverage.py v7.6.7, created at 2025-08-14 10:31 +0000

1from django.forms import model_to_dict 

2 

3 

4class ModelDiffCalculator: 

5 def __init__(self, initial): 

6 self.__initial = self._dict(initial) 

7 self._new_object = None 

8 

9 def set_changed_model(self, new_object): 

10 data = self._dict(new_object) 

11 if self._new_object is not None: 11 ↛ 12line 11 didn't jump to line 12 because the condition on line 11 was never true

12 self.__initial = data 

13 self._new_object = data 

14 return self 

15 

16 @property 

17 def diff(self): 

18 if not self._new_object: 18 ↛ 19line 18 didn't jump to line 19 because the condition on line 18 was never true

19 return {} 

20 d1 = self.__initial 

21 d2 = self._new_object 

22 diffs = [(k, (v, d2[k])) for k, v in d1.items() if v != d2[k]] 

23 return dict(diffs) 

24 

25 @property 

26 def has_changed(self): 

27 return bool(self.diff) 

28 

29 @property 

30 def changed_fields(self): 

31 return list(self.diff.keys()) 

32 

33 def get_field_diff(self, field_name): 

34 return self.diff.get(field_name, None) 

35 

36 def _dict(self, model): 

37 return model_to_dict(model, fields=[field.name for field in model._meta.fields])