1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Introduce UserPreference to define user preferences

This commit is contained in:
jeremystretch
2021-12-21 17:05:06 -05:00
parent 70f257b1ea
commit 36d2422eef
2 changed files with 71 additions and 35 deletions

View File

@ -2,9 +2,9 @@ from django import forms
from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm as DjangoPasswordChangeForm
from utilities.forms import BootstrapMixin, DateTimePicker
from utilities.paginator import EnhancedPaginator
from utilities.utils import flatten_dict
from .models import Token, UserConfig
from .preferences import PREFERENCES
class LoginForm(BootstrapMixin, AuthenticationForm):
@ -15,53 +15,45 @@ class PasswordChangeForm(BootstrapMixin, DjangoPasswordChangeForm):
pass
def get_page_lengths():
return [
(v, str(v)) for v in EnhancedPaginator.default_page_lengths
]
class UserConfigFormMetaclass(forms.models.ModelFormMetaclass):
def __new__(mcs, name, bases, attrs):
# Emulate a declared field for each supported user preference
preference_fields = {}
for field_name, preference in PREFERENCES.items():
field_kwargs = {
'label': preference.label,
'choices': preference.choices,
'help_text': preference.description,
'coerce': preference.coerce,
'required': False,
}
preference_fields[field_name] = forms.TypedChoiceField(**field_kwargs)
attrs.update(preference_fields)
return super().__new__(mcs, name, bases, attrs)
class UserConfigForm(BootstrapMixin, forms.ModelForm):
pagination__per_page = forms.TypedChoiceField(
label='Page length',
coerce=lambda val: int(val),
choices=get_page_lengths,
required=False
)
ui__colormode = forms.ChoiceField(
label='Color mode',
choices=(
('light', 'Light'),
('dark', 'Dark'),
),
required=False
)
extras__configcontext__format = forms.ChoiceField(
label='ConfigContext format',
choices=(
('json', 'JSON'),
('yaml', 'YAML'),
),
required=False
)
class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMetaclass):
class Meta:
model = UserConfig
fields = ()
fieldsets = (
('User Interface', (
'pagination__per_page',
'ui__colormode',
'pagination.per_page',
'ui.colormode',
)),
('Miscellaneous', (
'extras__configcontext__format',
'data_format',
)),
)
def __init__(self, *args, instance=None, **kwargs):
# Get initial data from UserConfig instance
initial_data = flatten_dict(instance.data, separator='__')
initial_data = flatten_dict(instance.data)
kwargs['initial'] = initial_data
super().__init__(*args, instance=instance, **kwargs)
@ -69,9 +61,7 @@ class UserConfigForm(BootstrapMixin, forms.ModelForm):
def save(self, *args, **kwargs):
# Set UserConfig data
for field_name, value in self.cleaned_data.items():
pref_name = field_name.replace('__', '.')
print(f'{pref_name}: {value}')
for pref_name, value in self.cleaned_data.items():
self.instance.set(pref_name, value, commit=False)
return super().save(*args, **kwargs)