Misc cleanup & documentation for FieldSets

This commit is contained in:
Jeremy Stretch 2024-03-19 09:20:49 -04:00
parent 89150f4b27
commit 32edb8dfe6
3 changed files with 33 additions and 10 deletions

View File

@ -12,17 +12,31 @@ __all__ = (
class FieldSet: class FieldSet:
""" """
A generic grouping of fields, with an optional name. Each field will be rendered A generic grouping of fields, with an optional name. Each item will be rendered
on its own row under the heading (name). on its own row under the provided heading (name), if any. The following types
may be passed as items:
* Field name (string)
* InlineFields instance
* TabbedGroups instance
* ObjectAttribute instance
Parameters:
items: An iterable of items to be rendered (one per row)
name: The fieldset's name, displayed as a heading (optional)
""" """
def __init__(self, *fields, name=None): def __init__(self, *items, name=None):
self.fields = fields self.items = items
self.name = name self.name = name
class InlineFields: class InlineFields:
""" """
A set of fields rendered inline (side-by-side) with a shared label; typically nested within a FieldSet. A set of fields rendered inline (side-by-side) with a shared label.
Parameters:
fields: An iterable of form field names
label: The label text to render for the row (optional)
""" """
def __init__(self, *fields, label=None): def __init__(self, *fields, label=None):
self.fields = fields self.fields = fields
@ -31,7 +45,11 @@ class InlineFields:
class TabbedGroups: class TabbedGroups:
""" """
Two or more groups of fields (FieldSets) arranged under tabs among which the user can navigate. Two or more groups of fields (FieldSets) arranged under tabs among which the user can toggle.
Parameters:
fieldsets: An iterable of FieldSet instances, one per tab. Each FieldSet *must* have a
name assigned, which will be employed as the tab's label.
""" """
def __init__(self, *fieldsets): def __init__(self, *fieldsets):
for fs in fieldsets: for fs in fieldsets:
@ -50,14 +68,19 @@ class TabbedGroups:
{ {
'id': f'{self.id}_{i}', 'id': f'{self.id}_{i}',
'title': group.name, 'title': group.name,
'fields': group.fields, 'fields': group.items,
} for i, group in enumerate(self.groups, start=1) } for i, group in enumerate(self.groups, start=1)
] ]
class ObjectAttribute: class ObjectAttribute:
""" """
Renders the value for a specific attribute on the form's instance. Renders the value for a specific attribute on the form's instance. This may be used to
display a read-only value and convey additional context to the user. If the attribute has
a `get_absolute_url()` method, it will be rendered as a hyperlink.
Parameters:
name: The name of the attribute to be displayed
""" """
def __init__(self, name): def __init__(self, name):
self.name = name self.name = name

View File

@ -64,7 +64,7 @@ def render_fieldset(form, fieldset):
fieldset = FieldSet(*fields, name=name) fieldset = FieldSet(*fields, name=name)
rows = [] rows = []
for item in fieldset.fields: for item in fieldset.items:
# Multiple fields side-by-side # Multiple fields side-by-side
if type(item) is InlineFields: if type(item) is InlineFields:

View File

@ -234,7 +234,7 @@ class L2VPNFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
class L2VPNTerminationFilterForm(NetBoxModelFilterSetForm): class L2VPNTerminationFilterForm(NetBoxModelFilterSetForm):
model = L2VPNTermination model = L2VPNTermination
fieldsets = ( fieldsets = (
FieldSet('filter_id', 'l2vpn_id',), FieldSet('filter_id', 'l2vpn_id'),
FieldSet( FieldSet(
'assigned_object_type_id', 'region_id', 'site_id', 'device_id', 'virtual_machine_id', 'vlan_id', 'assigned_object_type_id', 'region_id', 'site_id', 'device_id', 'virtual_machine_id', 'vlan_id',
name=_('Assigned Object') name=_('Assigned Object')