From 80bd115012cf68a7965dcfc860fc60a9a481b2b0 Mon Sep 17 00:00:00 2001 From: Kevin Alberts Date: Wed, 18 Jan 2017 09:36:16 +0100 Subject: [PATCH] Move the value retrieval process to a separate function to make the diff code more DRY. --- src/auditlog/diff.py | 50 ++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/src/auditlog/diff.py b/src/auditlog/diff.py index 7486c80..d22d2e0 100644 --- a/src/auditlog/diff.py +++ b/src/auditlog/diff.py @@ -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))