Add smarts to show display text for some version diff fields

e.g. show `str(customer)` along with `customer_uuid` since almost
nobody will "care" about the uuid so much, they just want the name
This commit is contained in:
Lance Edgar 2023-10-09 00:19:29 -05:00
parent edb5393cdc
commit 9efe767654
6 changed files with 118 additions and 95 deletions

View file

@ -1361,6 +1361,20 @@ class MasterView(View):
if newer:
next_url = self.request.route_url('{}.version'.format(route_prefix), uuid=instance.uuid, txnid=newer.id)
version_diffs = []
versions = self.get_relevant_versions(transaction, instance)
for version in versions:
old_data = {}
new_data = {}
fields = self.fields_for_version(version)
for field in fields:
if version.previous:
old_data[field] = getattr(version.previous, field)
new_data[field] = getattr(version, field)
diff = self.make_version_diff(version, old_data, new_data, fields=fields)
version_diffs.append(diff)
return self.render_to_response('view_version', {
'instance': instance,
'instance_title': "{} (history)".format(instance_title),
@ -1368,7 +1382,7 @@ class MasterView(View):
'instance_url': self.get_action_url('versions', instance),
'transaction': transaction,
'changed': localtime(self.rattail_config, transaction.issued_at, from_utc=True),
'versions': self.get_relevant_versions(transaction, instance),
'version_diffs': version_diffs,
'show_prev_next': True,
'prev_url': prev_url,
'next_url': next_url,
@ -4815,6 +4829,11 @@ class MasterView(View):
def make_diff(self, old_data, new_data, **kwargs):
return diffs.Diff(old_data, new_data, **kwargs)
def make_version_diff(self, version, old_data, new_data, **kwargs):
if 'title' not in kwargs:
kwargs['title'] = self.title_for_version(version)
return diffs.VersionDiff(version, old_data, new_data, **kwargs)
##############################
# Configuration Views
##############################

View file

@ -1398,25 +1398,15 @@ class PersonView(MasterView):
# also organize final transaction/versions (diff) map
vmap = {}
for version in versions:
if version.previous and version.operation_type == continuum.Operation.DELETE:
diff_class = 'deleted'
elif version.previous:
diff_class = 'dirty'
else:
diff_class = 'new'
# collect before/after field values for version
fields = self.fields_for_version(version)
values = {}
old_data = {}
new_data = {}
for field in fields:
before = ''
after = ''
if diff_class != 'new':
before = repr(getattr(version.previous, field))
if diff_class != 'deleted':
after = repr(getattr(version, field))
values[field] = {'before': before, 'after': after}
if version.previous:
old_data[field] = getattr(version.previous, field)
new_data[field] = getattr(version, field)
diff = self.make_version_diff(version, old_data, new_data, fields=fields)
if version.transaction_id not in vmap:
txn = version.transaction
@ -1439,13 +1429,7 @@ class PersonView(MasterView):
'versions': [],
}
vmap[version.transaction_id]['versions'].append({
'key': id(version),
'model_title': self.title_for_version(version),
'diff_class': diff_class,
'fields': fields,
'values': values,
})
vmap[version.transaction_id]['versions'].append(diff.as_struct())
return {'data': data, 'vmap': vmap}