Merge 6507b7e803
into 85db007ff5
This commit is contained in:
commit
de880be761
|
@ -22,7 +22,7 @@ from utilities.htmx import is_htmx
|
|||
from utilities.paginator import EnhancedPaginator, get_paginate_count
|
||||
from utilities.rqworker import get_workers_for_queue
|
||||
from utilities.templatetags.builtins.filters import render_markdown
|
||||
from utilities.utils import copy_safe_request, count_related, get_viewname, normalize_querydict, shallow_compare_dict
|
||||
from utilities.utils import copy_safe_request, count_related, deep_compare_dict, get_viewname, normalize_querydict
|
||||
from utilities.views import ContentTypePermissionRequiredMixin, register_model_view
|
||||
from . import filtersets, forms, tables
|
||||
from .forms.reports import ReportForm
|
||||
|
@ -719,21 +719,20 @@ class ObjectChangeView(generic.ObjectView):
|
|||
prechange_data = instance.prechange_data
|
||||
|
||||
if prechange_data and instance.postchange_data:
|
||||
diff_added = shallow_compare_dict(
|
||||
prechange_data or dict(),
|
||||
instance.postchange_data or dict(),
|
||||
exclude=['last_updated'],
|
||||
)
|
||||
diff_removed = {
|
||||
x: prechange_data.get(x) for x in diff_added
|
||||
} if prechange_data else {}
|
||||
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
|
||||
else:
|
||||
diff_added = None
|
||||
diff_removed = None
|
||||
custom_fields_added = None
|
||||
custom_fields_removed = None
|
||||
|
||||
return {
|
||||
'diff_added': diff_added,
|
||||
'diff_removed': diff_removed,
|
||||
'custom_fields_added': custom_fields_added,
|
||||
'custom_fields_removed': custom_fields_removed,
|
||||
'next_change': next_change,
|
||||
'prev_change': prev_change,
|
||||
'related_changes_table': related_changes_table,
|
||||
|
|
|
@ -119,7 +119,11 @@
|
|||
<div class="card-body">
|
||||
{% if object.prechange_data %}
|
||||
<pre class="change-data">{% for k, v in object.prechange_data.items %}{% spaceless %}
|
||||
<span{% if k in diff_removed %} class="removed"{% endif %}>{{ k }}: {{ v|json }}</span>
|
||||
{% if k != 'custom_fields' or not custom_fields_removed %}
|
||||
<span{% if k in diff_removed %} class="removed"{% endif %}>{{ k }}: {{ v|json }}</span>
|
||||
{% else %}
|
||||
<span class="removed">{{ k }}: {{ custom_fields_removed|json }}</span>
|
||||
{% endif %}
|
||||
{% endspaceless %}{% endfor %}
|
||||
</pre>
|
||||
{% elif non_atomic_change %}
|
||||
|
@ -138,7 +142,11 @@
|
|||
<div class="card-body">
|
||||
{% if object.postchange_data %}
|
||||
<pre class="change-data">{% for k, v in object.postchange_data.items %}{% spaceless %}
|
||||
<span{% if k in diff_added %} class="added"{% endif %}>{{ k }}: {{ v|json }}</span>
|
||||
{% if k != 'custom_fields' or not custom_fields_added %}
|
||||
<span{% if k in diff_added %} class="added"{% endif %}>{{ k }}: {{ v|json }}</span>
|
||||
{% else %}
|
||||
<span class="added">{{ k }}: {{ custom_fields_added|json }}</span>
|
||||
{% endif %}
|
||||
{% endspaceless %}{% endfor %}
|
||||
</pre>
|
||||
{% else %}
|
||||
|
|
|
@ -395,20 +395,34 @@ def prepare_cloned_fields(instance):
|
|||
return QueryDict(urlencode(params), mutable=True)
|
||||
|
||||
|
||||
def shallow_compare_dict(source_dict, destination_dict, exclude=tuple()):
|
||||
def deep_compare_dict(old, new, exclude=tuple()):
|
||||
"""
|
||||
Return a new dictionary of the different keys. The values of `destination_dict` are returned. Only the equality of
|
||||
the first layer of keys/values is checked. `exclude` is a list or tuple of keys to be ignored.
|
||||
Return a tuple of two dictionaries `(removed_diffs, added_diffs)` in a format
|
||||
that is compatible with the requirements of `ObjectChangeView`.
|
||||
`exclude` is a list or tuple of keys to be ignored.
|
||||
"""
|
||||
difference = {}
|
||||
added_diffs = {}
|
||||
removed_diffs = {}
|
||||
|
||||
for key, value in destination_dict.items():
|
||||
for key in old:
|
||||
if key in exclude:
|
||||
continue
|
||||
if source_dict.get(key) != value:
|
||||
difference[key] = value
|
||||
|
||||
return difference
|
||||
old_data = old[key]
|
||||
new_data = new[key]
|
||||
|
||||
if old_data != new_data:
|
||||
if isinstance(old_data, dict) and isinstance(new_data, dict):
|
||||
(sub_added, sub_removed) = deep_compare_dict(old_data, new_data, exclude=exclude)
|
||||
if len(sub_removed) > 0:
|
||||
removed_diffs[key] = sub_removed
|
||||
if len(sub_added) > 0:
|
||||
added_diffs[key] = sub_added
|
||||
else:
|
||||
removed_diffs[key] = old_data
|
||||
added_diffs[key] = new_data
|
||||
|
||||
return added_diffs, removed_diffs
|
||||
|
||||
|
||||
def flatten_dict(d, prefix='', separator='.'):
|
||||
|
|
Loading…
Reference in New Issue