Просмотр исходного кода

Enable setting/clearing of table column prefs

Jeremy Stretch 5 лет назад
Родитель
Сommit
3442ec77a7
3 измененных файлов с 45 добавлено и 40 удалено
  1. 1 1
      netbox/templates/inc/table_config_form.html
  2. 27 34
      netbox/utilities/forms.py
  3. 17 5
      netbox/utilities/views.py

+ 1 - 1
netbox/templates/inc/table_config_form.html

@@ -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">

+ 27 - 34
netbox/utilities/forms.py

@@ -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

+ 17 - 5
netbox/utilities/views.py

@@ -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()