Provide a way to show enum display text for some version diff fields

master view must explicitly declare which enums for which fields
This commit is contained in:
Lance Edgar 2023-11-30 18:23:47 -06:00
parent 2a9d5f74ce
commit 35131c8732
7 changed files with 172 additions and 26 deletions

View file

@ -597,7 +597,6 @@ class MasterView(View):
return defaults
def configure_row_grid(self, grid):
# super(MasterView, self).configure_row_grid(grid)
self.set_row_labels(grid)
self.configure_column_customer_key(grid)
@ -1528,6 +1527,15 @@ class MasterView(View):
})
def title_for_version(self, version):
"""
Must return the title text for the given version. By default
this will be the :term:`rattail:model title` for the version's
data class.
:param version: Reference to a Continuum version object.
:returns: Title text for the version, as string.
"""
cls = continuum.parent_class(version.__class__)
return cls.get_model_title()
@ -4962,13 +4970,52 @@ class MasterView(View):
return diffs.Diff(old_data, new_data, **kwargs)
def get_version_diff_factory(self, **kwargs):
"""
Must return the factory to be used when creating version diff
objects.
By default this returns the
:class:`tailbone.diffs.VersionDiff` class, unless
:attr:`version_diff_factory` is set, in which case that is
returned as-is.
:returns: A factory which can produce
:class:`~tailbone.diffs.VersionDiff` objects.
"""
if hasattr(self, 'version_diff_factory'):
return self.version_diff_factory
return diffs.VersionDiff
def get_version_diff_enums(self, version):
"""
This can optionally return a dict of field enums, to be passed
to the version diff factory. This method is called as part of
:meth:`make_version_diff()`.
"""
def make_version_diff(self, version, *args, **kwargs):
"""
Make a version diff object, using the factory returned by
:meth:`get_version_diff_factory()`.
:param version: Reference to a Continuum version object.
:param title: If specified, must be as a kwarg. Optional
override for the version title text. If not specified,
:meth:`title_for_version()` is called for the title.
:param \*args: Additional args to pass to the factory.
:param \*\*kwargs: Additional kwargs to pass to the factory.
:returns: A :class:`~tailbone.diffs.VersionDiff` object.
"""
if 'title' not in kwargs:
kwargs['title'] = self.title_for_version(version)
if 'enums' not in kwargs:
kwargs['enums'] = self.get_version_diff_enums(version)
factory = self.get_version_diff_factory()
return factory(version, *args, **kwargs)

View file

@ -27,6 +27,7 @@ Member Views
from collections import OrderedDict
import sqlalchemy as sa
import sqlalchemy_continuum as continuum
from rattail.db import model
from rattail.db.model import MembershipType, Member, MemberEquityPayment
@ -71,6 +72,7 @@ class MembershipTypeView(MasterView):
]
def configure_grid(self, g):
""" """
super().configure_grid(g)
g.set_sort_defaults('number')
@ -79,6 +81,7 @@ class MembershipTypeView(MasterView):
g.set_link('name')
def get_row_data(self, memtype):
""" """
model = self.model
return self.Session.query(model.Member)\
.filter(model.Member.membership_type == memtype)
@ -102,7 +105,7 @@ class MemberView(MasterView):
"""
Master view for the Member class.
"""
model_class = model.Member
model_class = Member
is_contact = True
touchable = True
has_versions = True
@ -169,6 +172,7 @@ class MemberView(MasterView):
return app.get_people_handler().get_quickie_search_placeholder()
def configure_grid(self, g):
""" """
super().configure_grid(g)
route_prefix = self.get_route_prefix()
model = self.model
@ -263,13 +267,16 @@ class MemberView(MasterView):
default=False)
def grid_extra_class(self, member, i):
""" """
if not member.active:
return 'warning'
if member.equity_current is False:
return 'notice'
def configure_form(self, f):
""" """
super().configure_form(f)
model = self.model
member = f.model_instance
# date fields
@ -342,6 +349,7 @@ class MemberView(MasterView):
return app.render_currency(total)
def template_kwargs_view(self, **kwargs):
""" """
kwargs = super().template_kwargs_view(**kwargs)
app = self.get_rattail_app()
member = kwargs['instance']
@ -360,10 +368,12 @@ class MemberView(MasterView):
return kwargs
def render_default_email(self, member, field):
""" """
if member.emails:
return member.emails[0].address
def render_default_phone(self, member, field):
""" """
if member.phones:
return member.phones[0].number
@ -376,6 +386,7 @@ class MemberView(MasterView):
return tags.link_to(text, url)
def get_row_data(self, member):
""" """
model = self.model
return self.Session.query(model.MemberEquityPayment)\
.filter(model.MemberEquityPayment.member == member)
@ -395,6 +406,7 @@ class MemberView(MasterView):
uuid=payment.uuid)
def configure_get_simple_settings(self):
""" """
return [
# General
@ -417,7 +429,7 @@ class MemberEquityPaymentView(MasterView):
"""
Master view for the MemberEquityPayment class.
"""
model_class = model.MemberEquityPayment
model_class = MemberEquityPayment
route_prefix = 'member_equity_payments'
url_prefix = '/member-equity-payments'
supports_grid_totals = True
@ -450,6 +462,7 @@ class MemberEquityPaymentView(MasterView):
]
def query(self, session):
""" """
query = super().query(session)
model = self.model
@ -458,6 +471,7 @@ class MemberEquityPaymentView(MasterView):
return query
def configure_grid(self, g):
""" """
super().configure_grid(g)
model = self.model
@ -502,6 +516,7 @@ class MemberEquityPaymentView(MasterView):
return {'totals_display': app.render_currency(total)}
def configure_form(self, f):
""" """
super().configure_form(f)
model = self.model
payment = f.model_instance
@ -543,6 +558,14 @@ class MemberEquityPaymentView(MasterView):
# status_code
f.set_enum('status_code', model.MemberEquityPayment.STATUS)
def get_version_diff_enums(self, version):
""" """
model = self.model
cls = continuum.parent_class(version.__class__)
if cls is model.MemberEquityPayment:
return {'status_code': model.MemberEquityPayment.STATUS}
def defaults(config, **kwargs):
base = globals()