From da0ad35c251968a55b835b1ea40d8b913651c430 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 30 Mar 2023 10:36:32 -0400 Subject: [PATCH] Pass SavedFilter initial parameters as JSON & relocate test --- netbox/extras/forms/model_forms.py | 5 ++--- netbox/extras/tests/test_filtersets.py | 22 ---------------------- netbox/extras/tests/test_forms.py | 22 ++++++++++++++++++++++ netbox/utilities/templatetags/helpers.py | 3 ++- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 105d5ee07..040882d27 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -2,7 +2,6 @@ import json from django import forms from django.contrib.contenttypes.models import ContentType -from django.http import QueryDict from django.utils.translation import gettext as _ from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup @@ -130,10 +129,10 @@ class SavedFilterForm(BootstrapMixin, forms.ModelForm): def __init__(self, *args, initial=None, **kwargs): - # Convert any parameters delivered via initial data to dict + # Convert any parameters delivered via initial data to JSON data if initial and 'parameters' in initial: if type(initial['parameters']) is str: - initial['parameters'] = dict(QueryDict(initial['parameters']).lists()) + initial['parameters'] = json.loads(initial['parameters']) super().__init__(*args, initial=initial, **kwargs) diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index bfdfca365..d537b733a 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -10,7 +10,6 @@ from dcim.models import DeviceRole, DeviceType, Manufacturer, Platform, Rack, Re from dcim.models import Location from extras.choices import * from extras.filtersets import * -from extras.forms import SavedFilterForm from extras.models import * from ipam.models import IPAddress from tenancy.models import Tenant, TenantGroup @@ -316,27 +315,6 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) -class SavedFilterFormTest(TestCase): - - def test_basic_submit(self): - """ - Test form submission and validation - """ - form = SavedFilterForm({ - 'name': 'test-sf', - 'slug': 'test-sf', - 'content_types': [ContentType.objects.get_for_model(Site).pk], - 'weight': 100, - 'parameters': { - "status": [ - "active" - ] - } - }) - self.assertTrue(form.is_valid()) - instance = form.save() - - class ExportTemplateTestCase(TestCase, BaseFilterSetTests): queryset = ExportTemplate.objects.all() filterset = ExportTemplateFilterSet diff --git a/netbox/extras/tests/test_forms.py b/netbox/extras/tests/test_forms.py index 35402bda3..dee2127dd 100644 --- a/netbox/extras/tests/test_forms.py +++ b/netbox/extras/tests/test_forms.py @@ -4,6 +4,7 @@ from django.test import TestCase from dcim.forms import SiteForm from dcim.models import Site from extras.choices import CustomFieldTypeChoices +from extras.forms import SavedFilterForm from extras.models import CustomField @@ -77,3 +78,24 @@ class CustomFieldModelFormTest(TestCase): for field_type, _ in CustomFieldTypeChoices.CHOICES: self.assertIn(field_type, instance.custom_field_data) self.assertIsNone(instance.custom_field_data[field_type]) + + +class SavedFilterFormTest(TestCase): + + def test_basic_submit(self): + """ + Test form submission and validation + """ + form = SavedFilterForm({ + 'name': 'test-sf', + 'slug': 'test-sf', + 'content_types': [ContentType.objects.get_for_model(Site).pk], + 'weight': 100, + 'parameters': { + "status": [ + "active" + ] + } + }) + self.assertTrue(form.is_valid()) + form.save() diff --git a/netbox/utilities/templatetags/helpers.py b/netbox/utilities/templatetags/helpers.py index 5f6e80a3e..6cdf33dd1 100644 --- a/netbox/utilities/templatetags/helpers.py +++ b/netbox/utilities/templatetags/helpers.py @@ -1,5 +1,6 @@ import datetime import decimal +import json from urllib.parse import quote from typing import Dict, Any @@ -321,7 +322,7 @@ def applied_filters(context, model, form, query_params): save_link = None if user.has_perm('extras.add_savedfilter') and 'filter_id' not in context['request'].GET: content_type = ContentType.objects.get_for_model(model).pk - parameters = context['request'].GET.urlencode() + parameters = json.dumps(context['request'].GET) url = reverse('extras:savedfilter_add') save_link = f"{url}?content_types={content_type}¶meters={quote(parameters)}"