mirror of
https://github.com/jazzband/django-auditlog.git
synced 2026-03-16 22:20:26 +00:00
Move the value retrieval process to a separate function to make the diff code more DRY.
This commit is contained in:
parent
6f4c6eb8a2
commit
80bd115012
1 changed files with 30 additions and 20 deletions
|
|
@ -49,6 +49,34 @@ def get_fields_in_model(instance):
|
|||
return instance._meta.fields
|
||||
|
||||
|
||||
def get_field_value(obj, field):
|
||||
"""
|
||||
Gets the value of a given model instance field.
|
||||
:param obj: The model instance.
|
||||
:type obj: Model
|
||||
:param field: The field you want to find the value of.
|
||||
:type field: Any
|
||||
:return: The value of the field as a string.
|
||||
:rtype: str
|
||||
"""
|
||||
if isinstance(field, DateTimeField):
|
||||
# DateTimeFields are timezone-aware, so we need to convert the field
|
||||
# to its naive form before we can accuratly compare them for changes.
|
||||
try:
|
||||
value = field.to_python(getattr(obj, field.name, None))
|
||||
if value is not None:
|
||||
value = timezone.make_naive(value, timezone=timezone.utc)
|
||||
except ObjectDoesNotExist:
|
||||
value = field.default if field.default is not NOT_PROVIDED else None
|
||||
else:
|
||||
try:
|
||||
value = smart_text(getattr(obj, field.name, None))
|
||||
except ObjectDoesNotExist:
|
||||
value = field.default if field.default is not NOT_PROVIDED else None
|
||||
|
||||
return value
|
||||
|
||||
|
||||
def model_instance_diff(old, new):
|
||||
"""
|
||||
Calculates the differences between two model instances. One of the instances may be ``None`` (i.e., a newly
|
||||
|
|
@ -98,26 +126,8 @@ def model_instance_diff(old, new):
|
|||
fields = filtered_fields
|
||||
|
||||
for field in fields:
|
||||
if isinstance(field, DateTimeField):
|
||||
# DateTimeFields are timezone-aware, so we need to convert the field
|
||||
# to its naive form before we can accuratly compare them for changes.
|
||||
old_value = field.to_python(getattr(old, field.name, None))
|
||||
if old_value is not None:
|
||||
old_value = timezone.make_naive(old_value, timezone.utc)
|
||||
|
||||
new_value = field.to_python(getattr(new, field.name, None))
|
||||
if new_value is not None:
|
||||
new_value = timezone.make_naive(new_value, timezone.utc)
|
||||
else:
|
||||
try:
|
||||
old_value = smart_text(getattr(old, field.name, None))
|
||||
except ObjectDoesNotExist:
|
||||
old_value = field.default if field.default is not NOT_PROVIDED else None
|
||||
|
||||
try:
|
||||
new_value = smart_text(getattr(new, field.name, None))
|
||||
except ObjectDoesNotExist:
|
||||
new_value = None
|
||||
old_value = get_field_value(old, field)
|
||||
new_value = get_field_value(new, field)
|
||||
|
||||
if old_value != new_value:
|
||||
diff[field.name] = (smart_text(old_value), smart_text(new_value))
|
||||
|
|
|
|||
Loading…
Reference in a new issue