netbox/netbox/utilities/tables.py
Jeremy Stretch bb5057c063
Closes #14591: Saved table configurations (#19101)
* Add SavedTableConfig

* Update table configuration logic to support TableConfigs

* Update table config link when updating table

* Correct docstring

* Misc cleanup

* Use multi-select widgets for column selection

* Return null config params for tables with no model

* Fix auto-selection of selected columns

* Update migration

* Clean up template

* Enforce enabled/shared flags

* Search/filter by table name

* Misc cleanup

* Fix population of selected columns

* Ordering field should not be required

* Enable cloning for TableConfig

* Misc cleanup

* Add model documentation for TableConfig

* Drop slug field from TableConfig

* Improve TableConfig validation

* Remove add button from TableConfig list view

* Fix ordering validation to account for leading hyphens
2025-04-10 15:48:02 -05:00

62 lines
1.7 KiB
Python

from django.utils.module_loading import import_string
from django.utils.translation import gettext_lazy as _
from netbox.registry import registry
__all__ = (
'get_table_for_model',
'get_table_ordering',
'linkify_phone',
'register_table_column'
)
def get_table_for_model(model, name=None):
name = name or f'{model.__name__}Table'
try:
return import_string(f'{model._meta.app_label}.tables.{name}')
except ImportError:
return
def get_table_ordering(request, table):
"""
Given a request, return the prescribed table ordering, if any. This may be necessary to determine prior to rendering
the table itself.
"""
# Check for an explicit ordering
if 'sort' in request.GET:
return request.GET['sort'] or None
# Check for a configured preference
if request.user.is_authenticated:
if preference := request.user.config.get(f'tables.{table.__name__}.ordering'):
return preference
def linkify_phone(value):
"""
Render a telephone number as a hyperlink.
"""
if value is None:
return None
return f"tel:{value.replace(' ', '')}"
def register_table_column(column, name, *tables):
"""
Register a custom column for use on one or more tables.
Args:
column: The column instance to register
name: The name of the table column
tables: One or more table classes
"""
for table in tables:
reg = registry['tables'][table]
if name in reg:
raise ValueError(_("A column named {name} is already defined for table {table_name}").format(
name=name, table_name=table.__name__
))
reg[name] = column