Skip to content

Commit aab8ee5

Browse files
authored
Merge pull request #576 from marcanuy/master
fix #575 use django model_to_dict to detect changes in parent models
2 parents dcc695e + fe6331c commit aab8ee5

File tree

5 files changed

+31
-6
lines changed

5 files changed

+31
-6
lines changed

AUTHORS.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ Authors
5858
- Leticia Portella
5959
- Lucas Wiman
6060
- Maciej "RooTer" Urbański
61+
- Marcelo Canina (`marcanuy <https://github.com/marcanuy>`_)
6162
- Mark Davidoff
6263
- Martin Bachwerk
6364
- Marty Alchin

CHANGES.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ Changes
44
Unreleased
55
----------
66
- Fixed DoesNotExist error when trying to get instance if object is deleted (gh-571)
7+
- Fix `model_to_dict` to detect changes in a parent model when using
8+
`inherit=True` (backwards-incompatible for users who were directly
9+
using previous version) (gh-576)
710

811
2.7.3 (2019-07-15)
912
------------------

simple_history/models.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from django.db import models
1717
from django.db.models import Q
1818
from django.db.models.fields.proxy import OrderWrt
19+
from django.forms.models import model_to_dict
1920
from django.urls import reverse
2021
from django.utils.encoding import python_2_unicode_compatible, smart_text
2122
from django.utils.text import format_lazy
@@ -32,10 +33,6 @@
3233
registered_models = {}
3334

3435

35-
def _model_to_dict(model):
36-
return json.loads(serialize("json", [model]))[0]["fields"]
37-
38-
3936
def _default_get_user(request, **kwargs):
4037
try:
4138
return request.user
@@ -576,8 +573,8 @@ def diff_against(self, old_history):
576573

577574
changes = []
578575
changed_fields = []
579-
old_values = _model_to_dict(old_history.instance)
580-
current_values = _model_to_dict(self.instance)
576+
old_values = model_to_dict(old_history.instance)
577+
current_values = model_to_dict(self.instance)
581578
for field, new_value in current_values.items():
582579
if field in old_values:
583580
old_value = old_values[field]

simple_history/tests/models.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,15 @@ class InheritTracking4(TrackedAbstractBaseA):
483483
pass
484484

485485

486+
class BasePlace(models.Model):
487+
name = models.CharField(max_length=50)
488+
history = HistoricalRecords(inherit=True)
489+
490+
491+
class InheritedRestaurant(BasePlace):
492+
serves_hot_dogs = models.BooleanField(default=False)
493+
494+
486495
class BucketMember(models.Model):
487496
name = models.CharField(max_length=30)
488497
user = models.OneToOneField(

simple_history/tests/tests/test_models.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
from ..models import (
3636
AbstractBase,
3737
AdminProfile,
38+
BasePlace,
3839
Book,
3940
Bookcase,
4041
BucketData,
@@ -62,6 +63,7 @@
6263
HistoricalPoll,
6364
HistoricalPollWithHistoricalIPAddress,
6465
HistoricalState,
66+
InheritedRestaurant,
6567
OverrideModelNameAsCallable,
6668
OverrideModelNameUsingBaseModel1,
6769
MyOverrideModelNameRegisterMethod1,
@@ -594,6 +596,19 @@ def test_history_diff_does_not_include_unchanged_fields(self):
594596
delta = new_record.diff_against(old_record)
595597
self.assertNotIn("pub_date", delta.changed_fields)
596598

599+
def test_history_diff_includes_changed_fields_of_base_model(self):
600+
r = InheritedRestaurant.objects.create(name="McDonna", serves_hot_dogs=False)
601+
# change base model field
602+
r.name = "DonnutsKing"
603+
r.save()
604+
new_record, old_record = r.history.all()
605+
delta = new_record.diff_against(old_record)
606+
expected_change = ModelChange("name", "McDonna", "DonnutsKing")
607+
self.assertEqual(delta.changed_fields, ["name"])
608+
self.assertEqual(delta.old_record, old_record)
609+
self.assertEqual(delta.new_record, new_record)
610+
self.assertEqual(expected_change.field, delta.changes[0].field)
611+
597612
def test_history_diff_with_incorrect_type(self):
598613
p = Poll.objects.create(question="what's up?", pub_date=today)
599614
p.question = "what's up, man?"

0 commit comments

Comments
 (0)