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:
2026-09-25 11:07:03 +02:00
co-authored by Claude Opus 5.5
parent ae4b05d539
commit 337cd28c23
5 changed files with 127 additions and 4 deletions
+43 -1
View File
@@ -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")