feat: filter device and rack lists by site prefix
Adds a site_prefix filter to the device and rack filtersets and filter forms. It matches the first word of the site name case-insensitively and accepts several comma-separated prefixes. Bumps version to 0.14.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -2,10 +2,52 @@ from types import SimpleNamespace
|
||||
|
||||
from django.test import SimpleTestCase
|
||||
|
||||
from netbox_utilities.site_prefix import COLUMN_NAME, SitePrefixColumn, first_word, prepend_to_default_columns
|
||||
from netbox_utilities.site_prefix import (
|
||||
COLUMN_NAME,
|
||||
SitePrefixColumn,
|
||||
first_word,
|
||||
insert_into_fieldsets,
|
||||
prepend_to_default_columns,
|
||||
site_prefix_query,
|
||||
split_prefixes,
|
||||
)
|
||||
|
||||
|
||||
class SitePrefixTest(SimpleTestCase):
|
||||
def test_split_prefixes_accepts_commas_and_repeated_values(self):
|
||||
self.assertEqual(split_prefixes(["Berlin, DC01", "HH", "DC01", " "]), ["Berlin", "DC01", "HH"])
|
||||
self.assertEqual(split_prefixes(None), [])
|
||||
|
||||
def test_prefix_query_matches_only_the_whole_first_word(self):
|
||||
query = str(site_prefix_query(["DC01"]))
|
||||
|
||||
self.assertIn("('site__name__iexact', 'DC01')", query)
|
||||
self.assertIn("('site__name__iregex', '^DC01\\\\s')", query)
|
||||
|
||||
def test_prefix_query_escapes_regex_characters(self):
|
||||
self.assertIn("^DC\\\\.1\\\\s", str(site_prefix_query(["DC.1"])))
|
||||
|
||||
def test_prefix_field_is_placed_after_site_filter(self):
|
||||
from utilities.forms.rendering import FieldSet
|
||||
|
||||
fieldsets = insert_into_fieldsets(
|
||||
(FieldSet("q", name="Suche"), FieldSet("region_id", "site_id", "location_id", name="Standort")),
|
||||
COLUMN_NAME,
|
||||
)
|
||||
|
||||
self.assertEqual(fieldsets[1].items, ("region_id", "site_id", COLUMN_NAME, "location_id"))
|
||||
self.assertEqual(fieldsets[1].name, "Standort")
|
||||
|
||||
def test_device_and_rack_filters_offer_prefix(self):
|
||||
from dcim.filtersets import DeviceFilterSet, RackFilterSet
|
||||
from dcim.forms import DeviceFilterForm, RackFilterForm
|
||||
|
||||
for filterset in (DeviceFilterSet, RackFilterSet):
|
||||
self.assertIn(COLUMN_NAME, filterset.base_filters)
|
||||
for form in (DeviceFilterForm, RackFilterForm):
|
||||
self.assertIn(COLUMN_NAME, form.base_fields)
|
||||
self.assertTrue(any(COLUMN_NAME in fieldset.items for fieldset in form.fieldsets))
|
||||
|
||||
def test_first_word(self):
|
||||
self.assertEqual(first_word("Berlin Campus West"), "Berlin")
|
||||
self.assertEqual(first_word(" DC01\tFrankfurt "), "DC01")
|
||||
|
||||
Reference in New Issue
Block a user