Pass SavedFilter initial parameters as JSON & relocate test

This commit is contained in:
jeremystretch 2023-03-30 10:36:32 -04:00
parent 677722d0c9
commit da0ad35c25
4 changed files with 26 additions and 26 deletions

View File

@ -2,7 +2,6 @@ import json
from django import forms from django import forms
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.http import QueryDict
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup 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): 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 initial and 'parameters' in initial:
if type(initial['parameters']) is str: 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) super().__init__(*args, initial=initial, **kwargs)

View File

@ -10,7 +10,6 @@ from dcim.models import DeviceRole, DeviceType, Manufacturer, Platform, Rack, Re
from dcim.models import Location from dcim.models import Location
from extras.choices import * from extras.choices import *
from extras.filtersets import * from extras.filtersets import *
from extras.forms import SavedFilterForm
from extras.models import * from extras.models import *
from ipam.models import IPAddress from ipam.models import IPAddress
from tenancy.models import Tenant, TenantGroup from tenancy.models import Tenant, TenantGroup
@ -316,27 +315,6 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests):
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) 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): class ExportTemplateTestCase(TestCase, BaseFilterSetTests):
queryset = ExportTemplate.objects.all() queryset = ExportTemplate.objects.all()
filterset = ExportTemplateFilterSet filterset = ExportTemplateFilterSet

View File

@ -4,6 +4,7 @@ from django.test import TestCase
from dcim.forms import SiteForm from dcim.forms import SiteForm
from dcim.models import Site from dcim.models import Site
from extras.choices import CustomFieldTypeChoices from extras.choices import CustomFieldTypeChoices
from extras.forms import SavedFilterForm
from extras.models import CustomField from extras.models import CustomField
@ -77,3 +78,24 @@ class CustomFieldModelFormTest(TestCase):
for field_type, _ in CustomFieldTypeChoices.CHOICES: for field_type, _ in CustomFieldTypeChoices.CHOICES:
self.assertIn(field_type, instance.custom_field_data) self.assertIn(field_type, instance.custom_field_data)
self.assertIsNone(instance.custom_field_data[field_type]) 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()

View File

@ -1,5 +1,6 @@
import datetime import datetime
import decimal import decimal
import json
from urllib.parse import quote from urllib.parse import quote
from typing import Dict, Any from typing import Dict, Any
@ -321,7 +322,7 @@ def applied_filters(context, model, form, query_params):
save_link = None save_link = None
if user.has_perm('extras.add_savedfilter') and 'filter_id' not in context['request'].GET: if user.has_perm('extras.add_savedfilter') and 'filter_id' not in context['request'].GET:
content_type = ContentType.objects.get_for_model(model).pk 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') url = reverse('extras:savedfilter_add')
save_link = f"{url}?content_types={content_type}&parameters={quote(parameters)}" save_link = f"{url}?content_types={content_type}&parameters={quote(parameters)}"