Add versioning display support for contact-related models
This commit is contained in:
parent
20ddf2687b
commit
85bdefc25b
8 changed files with 125 additions and 27 deletions
|
@ -346,8 +346,7 @@ class MasterView(View):
|
|||
return self.render_to_response('versions', {
|
||||
'instance': instance,
|
||||
'instance_title': instance_title,
|
||||
'index_title': "{}: {}".format(self.get_model_title_plural(), instance_title),
|
||||
'index_url': self.get_action_url('view', instance),
|
||||
'instance_url': self.get_action_url('view', instance),
|
||||
'grid': grid,
|
||||
})
|
||||
|
||||
|
@ -392,9 +391,27 @@ class MasterView(View):
|
|||
"""
|
||||
model_class = self.get_model_class()
|
||||
transaction_class = continuum.transaction_class(model_class)
|
||||
query = model_transaction_query(self.Session(), instance.uuid, model_class)
|
||||
query = model_transaction_query(self.Session(), instance, model_class,
|
||||
child_classes=self.normalize_version_child_classes())
|
||||
return query.order_by(transaction_class.issued_at.desc())
|
||||
|
||||
def get_version_child_classes(self):
|
||||
"""
|
||||
If applicable, should return a list of child classes which should be
|
||||
considered when querying for version history of an object.
|
||||
"""
|
||||
return []
|
||||
|
||||
def normalize_version_child_classes(self):
|
||||
classes = []
|
||||
for cls in self.get_version_child_classes():
|
||||
if not isinstance(cls, tuple):
|
||||
cls = (cls, 'uuid', 'uuid')
|
||||
elif len(cls) == 2:
|
||||
cls = tuple([cls[0], cls[1], 'uuid'])
|
||||
classes.append(cls)
|
||||
return classes
|
||||
|
||||
def make_version_grid_kwargs(self, **kwargs):
|
||||
"""
|
||||
Return a dictionary of kwargs to be passed to the factory when
|
||||
|
@ -440,7 +457,8 @@ class MasterView(View):
|
|||
instance = self.get_instance()
|
||||
model_class = self.get_model_class()
|
||||
Transaction = continuum.transaction_class(model_class)
|
||||
transactions = model_transaction_query(self.Session(), instance.uuid, model_class)
|
||||
transactions = model_transaction_query(self.Session(), instance, model_class,
|
||||
child_classes=self.normalize_version_child_classes())
|
||||
transaction_id = self.request.matchdict['txnid']
|
||||
transaction = transactions.filter(Transaction.id == transaction_id).first()
|
||||
if not transaction:
|
||||
|
@ -457,32 +475,45 @@ class MasterView(View):
|
|||
instance_title = self.get_instance_title(instance)
|
||||
return self.render_to_response('view_version', {
|
||||
'instance': instance,
|
||||
'instance_title': instance_title,
|
||||
'index_title': "{}: {} (History)".format(self.get_model_title_plural(), instance_title),
|
||||
'index_url': self.get_action_url('versions', instance),
|
||||
'instance_title': "{} (history)".format(instance_title),
|
||||
'instance_title_normal': instance_title,
|
||||
'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),
|
||||
'previous_transaction': older,
|
||||
'next_transaction': newer,
|
||||
'title_for_version': self.title_for_version,
|
||||
'fields_for_version': self.fields_for_version,
|
||||
'continuum': continuum,
|
||||
})
|
||||
|
||||
def title_for_version(self, version):
|
||||
cls = continuum.parent_class(version.__class__)
|
||||
return cls.get_model_title()
|
||||
|
||||
def fields_for_version(self, version):
|
||||
mapper = orm.class_mapper(version.__class__)
|
||||
fields = sorted(mapper.columns.keys())
|
||||
fields.remove('uuid')
|
||||
fields.remove('transaction_id')
|
||||
fields.remove('end_transaction_id')
|
||||
fields.remove('operation_type')
|
||||
return fields
|
||||
|
||||
def get_relevant_versions(self, transaction, instance):
|
||||
version_class = self.get_model_version_class()
|
||||
query = self.Session.query(version_class)\
|
||||
.filter(version_class.transaction == transaction)\
|
||||
.filter(version_class.uuid == instance.uuid)
|
||||
return query.all()
|
||||
versions = []
|
||||
version_cls = self.get_model_version_class()
|
||||
query = self.Session.query(version_cls)\
|
||||
.filter(version_cls.transaction == transaction)\
|
||||
.filter(version_cls.uuid == instance.uuid)
|
||||
versions.extend(query.all())
|
||||
for cls, foreign_attr, primary_attr in self.normalize_version_child_classes():
|
||||
version_cls = continuum.version_class(cls)
|
||||
query = self.Session.query(version_cls)\
|
||||
.filter(version_cls.transaction == transaction)\
|
||||
.filter(getattr(version_cls, foreign_attr) == getattr(instance, primary_attr))
|
||||
versions.extend(query.all())
|
||||
return versions
|
||||
|
||||
def mobile_view(self):
|
||||
"""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue