From ff5e9e653f84fc8c89ccd450f0a55bf4179beabe Mon Sep 17 00:00:00 2001 From: JCWasmx86 Date: Wed, 24 Apr 2024 19:39:54 +0200 Subject: [PATCH] [TMP] Add a not that elegant way to show even better diffs for custom fields This works by manually messing around with the JSON and reindenting a bit. Please note that this is the best I could come up with. We create a new list with tuples of (cf_name, cf_value, modified: bool). If the modified bool is true, then color it correctly (Red/green) The new templatetag fixindent modifies multi-line custom fields (E.g. selections), so that the indentation of the object is ok again. --- netbox/extras/views.py | 16 ++++++++++++---- netbox/templates/extras/objectchange.html | 10 ++++++---- netbox/utilities/templatetags/helpers.py | 17 +++++++++++++++++ 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/netbox/extras/views.py b/netbox/extras/views.py index a09e002b0..aa8508e8a 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -722,17 +722,25 @@ class ObjectChangeView(generic.ObjectView): diff_added, diff_removed = deep_compare_dict(prechange_data, instance.postchange_data, exclude=('last_updated')) custom_fields_added = diff_added['custom_fields'] if 'custom_fields' in diff_added else None custom_fields_removed = diff_removed['custom_fields'] if 'custom_fields' in diff_removed else None + cfr_list = [] + if custom_fields_added: + for cf, cf_value in prechange_data['custom_fields'].items(): + cfr_list.append((cf, cf_value, cf in custom_fields_added)) + cfa_list = [] + if custom_fields_removed: + for cf, cf_value in instance.postchange_data['custom_fields'].items(): + cfa_list.append((cf, cf_value, cf in custom_fields_removed)) else: diff_added = None diff_removed = None - custom_fields_added = None - custom_fields_removed = None + cfa_list = None + cfr_list = None return { 'diff_added': diff_added, 'diff_removed': diff_removed, - 'custom_fields_added': custom_fields_added, - 'custom_fields_removed': custom_fields_removed, + "cfa_list": cfa_list, + "cfr_list": cfr_list, 'next_change': next_change, 'prev_change': prev_change, 'related_changes_table': related_changes_table, diff --git a/netbox/templates/extras/objectchange.html b/netbox/templates/extras/objectchange.html index f33fac37b..86a4e96d8 100644 --- a/netbox/templates/extras/objectchange.html +++ b/netbox/templates/extras/objectchange.html @@ -119,10 +119,11 @@
{% if object.prechange_data %}
{% for k, v in object.prechange_data.items %}{% spaceless %}
-                    {% if k != 'custom_fields' or not custom_fields_removed %}
+                    {% if k != 'custom_fields' or not cfr_list %}
                         {{ k }}: {{ v|json }}
                     {% else %}
-                        {{ k }}: {{ custom_fields_removed|json }}
+                    {{ k }}: {{% for cfr_data in cfr_list %}    {{ cfr_data.0|json }}: {{ cfr_data.1|json|fixindent }}
+                    {% endfor %}}
                     {% endif %}
                 {% endspaceless %}{% endfor %}
                 
@@ -142,10 +143,11 @@
{% if object.postchange_data %}
{% for k, v in object.postchange_data.items %}{% spaceless %}
-                        {% if k != 'custom_fields' or not custom_fields_added %}
+                        {% if k != 'custom_fields' or not cfa_list %}
                             {{ k }}: {{ v|json }}
                         {% else %}
-                            {{ k }}: {{ custom_fields_added|json }}
+                            {{ k }}: {{% for cfa_data in cfa_list %}    {{ cfa_data.0|json }}: {{ cfa_data.1|json|fixindent }}
+{% endfor %}}
                         {% endif %}
                         {% endspaceless %}{% endfor %}
                     
diff --git a/netbox/utilities/templatetags/helpers.py b/netbox/utilities/templatetags/helpers.py index aaee9679c..9660087b0 100644 --- a/netbox/utilities/templatetags/helpers.py +++ b/netbox/utilities/templatetags/helpers.py @@ -20,6 +20,7 @@ __all__ = ( 'applied_filters', 'as_range', 'divide', + 'fixindent', 'get_item', 'get_key', 'humanize_megabytes', @@ -331,3 +332,19 @@ def applied_filters(context, model, form, query_params): 'applied_filters': applied_filters, 'save_link': save_link, } + + +@register.filter +def fixindent(value: str) -> str: + """ + Fixes the indentation of multiline strings so they align well + within the changelog view. + """ + lines = value.splitlines(keepends=True) + # For 1 line, the indentation doesn't need to be fixed + if len(lines) == 1: + return value + ret = lines[0] + for line in lines[1:]: + ret += f' {line}' + return ret