mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Enable setting/clearing of table column prefs
This commit is contained in:
@ -9,7 +9,7 @@
|
||||
<h4 class="modal-title">Table Configuration</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form action="?return_url={{ request.path }}" method="post" class="form-horizontal">
|
||||
<form action="" method="post" class="form-horizontal">
|
||||
{% csrf_token %}
|
||||
{% render_form table_config_form %}
|
||||
<div class="text-right">
|
||||
|
@ -137,27 +137,6 @@ def form_from_model(model, fields):
|
||||
return type('FormFromModel', (forms.Form,), form_fields)
|
||||
|
||||
|
||||
def apply_bootstrap_classes(form):
|
||||
"""
|
||||
Apply Bootstrap CSS classes to form elements.
|
||||
"""
|
||||
exempt_widgets = [
|
||||
forms.CheckboxInput,
|
||||
forms.ClearableFileInput,
|
||||
forms.FileInput,
|
||||
forms.RadioSelect
|
||||
]
|
||||
|
||||
for field_name, field in form.fields.items():
|
||||
if field.widget.__class__ not in exempt_widgets:
|
||||
css = field.widget.attrs.get('class', '')
|
||||
field.widget.attrs['class'] = ' '.join([css, 'form-control']).strip()
|
||||
if field.required and not isinstance(field.widget, forms.FileInput):
|
||||
field.widget.attrs['required'] = 'required'
|
||||
if 'placeholder' not in field.widget.attrs:
|
||||
field.widget.attrs['placeholder'] = field.label
|
||||
|
||||
|
||||
#
|
||||
# Widgets
|
||||
#
|
||||
@ -684,7 +663,22 @@ class BootstrapMixin(forms.BaseForm):
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
apply_bootstrap_classes(self)
|
||||
|
||||
exempt_widgets = [
|
||||
forms.CheckboxInput,
|
||||
forms.ClearableFileInput,
|
||||
forms.FileInput,
|
||||
forms.RadioSelect
|
||||
]
|
||||
|
||||
for field_name, field in self.fields.items():
|
||||
if field.widget.__class__ not in exempt_widgets:
|
||||
css = field.widget.attrs.get('class', '')
|
||||
field.widget.attrs['class'] = ' '.join([css, 'form-control']).strip()
|
||||
if field.required and not isinstance(field.widget, forms.FileInput):
|
||||
field.widget.attrs['required'] = 'required'
|
||||
if 'placeholder' not in field.widget.attrs:
|
||||
field.widget.attrs['placeholder'] = field.label
|
||||
|
||||
|
||||
class ReturnURLForm(forms.Form):
|
||||
@ -763,21 +757,20 @@ class ImportForm(BootstrapMixin, forms.Form):
|
||||
})
|
||||
|
||||
|
||||
class TableConfigForm(forms.Form):
|
||||
class TableConfigForm(BootstrapMixin, forms.Form):
|
||||
"""
|
||||
Form for configuring user's table preferences.
|
||||
"""
|
||||
columns = forms.MultipleChoiceField(
|
||||
choices=[],
|
||||
widget=forms.SelectMultiple(
|
||||
attrs={'size': 10}
|
||||
)
|
||||
)
|
||||
|
||||
def __init__(self, table, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
field_name = f"tables.{table.__class__.__name__}.columns"
|
||||
self.fields[field_name] = forms.MultipleChoiceField(
|
||||
choices=table.configurable_columns,
|
||||
initial=table.visible_columns,
|
||||
label='Columns',
|
||||
widget=forms.SelectMultiple(
|
||||
attrs={'size': 10}
|
||||
)
|
||||
)
|
||||
|
||||
apply_bootstrap_classes(self)
|
||||
# Initialize columns field based on table attributes
|
||||
self.fields['columns'].choices = table.configurable_columns
|
||||
self.fields['columns'].initial = table.visible_columns
|
||||
|
@ -176,22 +176,34 @@ class ObjectListView(View):
|
||||
}
|
||||
RequestConfig(request, paginate).configure(table)
|
||||
|
||||
table_config_form = TableConfigForm(
|
||||
table=table
|
||||
)
|
||||
|
||||
context = {
|
||||
'content_type': content_type,
|
||||
'table': table,
|
||||
'permissions': permissions,
|
||||
'action_buttons': self.action_buttons,
|
||||
'table_config_form': table_config_form,
|
||||
'table_config_form': TableConfigForm(table=table),
|
||||
'filter_form': self.filterset_form(request.GET, label_suffix='') if self.filterset_form else None,
|
||||
}
|
||||
context.update(self.extra_context())
|
||||
|
||||
return render(request, self.template_name, context)
|
||||
|
||||
def post(self, request):
|
||||
|
||||
# Update the user's table configuration
|
||||
table = self.table(self.queryset)
|
||||
form = TableConfigForm(table=table, data=request.POST)
|
||||
preference_name = f"tables.{self.table.__name__}.columns"
|
||||
|
||||
if form.is_valid():
|
||||
if 'set' in request.POST:
|
||||
request.user.config.set(preference_name, form.cleaned_data['columns'], commit=True)
|
||||
elif 'clear' in request.POST:
|
||||
request.user.config.clear(preference_name, commit=True)
|
||||
messages.success(request, "Your preferences have been updated.")
|
||||
|
||||
return redirect(request.path)
|
||||
|
||||
def alter_queryset(self, request):
|
||||
# .all() is necessary to avoid caching queries
|
||||
return self.queryset.all()
|
||||
|
Reference in New Issue
Block a user