Files
netbox/netbox/netbox/preferences.py
2025-10-27 08:54:38 -05:00

113 lines
3.2 KiB
Python

from django.conf import settings
from django.utils.translation import gettext_lazy as _
from netbox.registry import registry
from users.preferences import UserPreference
from utilities.constants import CSV_DELIMITERS
from utilities.paginator import EnhancedPaginator
def get_page_lengths():
return [
(v, str(v)) for v in EnhancedPaginator.default_page_lengths
]
def get_csv_delimiters():
choices = []
for k, v in CSV_DELIMITERS.items():
label = _(k.title())
if v.strip():
label = f'{label} ({v})'
choices.append((k, label))
return choices
PREFERENCES = {
# User interface
'ui.htmx_navigation': UserPreference(
label=_('HTMX Navigation'),
choices=(
('', _('Disabled')),
('true', _('Enabled')),
),
description=_('Enable dynamic UI navigation'),
default=False,
warning=_('Experimental feature')
),
'locale.language': UserPreference(
label=_('Language'),
choices=(
('', _('Auto')),
*settings.LANGUAGES,
),
description=_('Forces UI translation to the specified language'),
warning=(
_("Support for translation has been disabled locally")
if not settings.TRANSLATION_ENABLED
else ''
)
),
'ui.copilot_enabled': UserPreference(
label=_('NetBox Copilot'),
choices=(
('', _('Disabled')),
('true', _('Enabled')),
),
description=_('Enable the NetBox Copilot AI agent'),
default=False,
),
'pagination.per_page': UserPreference(
label=_('Page length'),
choices=get_page_lengths(),
description=_('The default number of objects to display per page'),
coerce=lambda x: int(x)
),
'pagination.placement': UserPreference(
label=_('Paginator placement'),
choices=(
('bottom', _('Bottom')),
('top', _('Top')),
('both', _('Both')),
),
default='bottom',
description=_('Where the paginator controls will be displayed relative to a table')
),
'ui.tables.striping': UserPreference(
label=_('Striped table rows'),
choices=(
('', _('Disabled')),
('true', _('Enabled')),
),
description=_('Render table rows with alternating colors to increase readability'),
),
# Miscellaneous
'data_format': UserPreference(
label=_('Data format'),
choices=(
('json', 'JSON'),
('yaml', 'YAML'),
),
description=_('The preferred syntax for displaying generic data within the UI')
),
'csv_delimiter': UserPreference(
label=_('CSV delimiter'),
choices=get_csv_delimiters(),
default='comma',
description=_('The character used to separate fields in CSV data')
),
}
# Register plugin preferences
if registry['plugins']['preferences']:
plugin_preferences = {}
for plugin_name, preferences in registry['plugins']['preferences'].items():
for name, userpreference in preferences.items():
PREFERENCES[f'plugins.{plugin_name}.{name}'] = userpreference
PREFERENCES.update(plugin_preferences)