mirror of
https://github.com/netbox-community/netbox.git
synced 2026-04-23 17:28:49 +02:00
NetBox now accepts case-insensitive model identifiers in configuration, allowing both lowercase (e.g. "dcim.site") and PascalCase (e.g. "dcim.Site") for DEFAULT_DASHBOARD, CUSTOM_VALIDATORS, and PROTECTION_RULES. This makes model name handling consistent with FIELD_CHOICES. - Add a shared case-insensitive config lookup helper (get_config_value_ci()) - Use the helper in extras/signals.py and core/signals.py - Update FIELD_CHOICES ChoiceSetMeta to support case-insensitive replace/extend (only compute extend choices if no replacement is defined) - Add unit tests for get_config_value_ci() - Add integration tests for case-insensitive FIELD_CHOICES replacement/extension - Update documentation examples to use PascalCase consistently
59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
from django.test import TestCase, override_settings
|
|
|
|
from utilities.choices import ChoiceSet
|
|
|
|
|
|
class ExampleChoices(ChoiceSet):
|
|
|
|
CHOICE_A = 'a'
|
|
CHOICE_B = 'b'
|
|
CHOICE_C = 'c'
|
|
CHOICE_1 = 1
|
|
CHOICE_2 = 2
|
|
CHOICE_3 = 3
|
|
|
|
CHOICES = (
|
|
('Letters', (
|
|
(CHOICE_A, 'A'),
|
|
(CHOICE_B, 'B'),
|
|
(CHOICE_C, 'C'),
|
|
)),
|
|
('Digits', (
|
|
(CHOICE_1, 'One'),
|
|
(CHOICE_2, 'Two'),
|
|
(CHOICE_3, 'Three'),
|
|
)),
|
|
)
|
|
|
|
|
|
class ChoiceSetTestCase(TestCase):
|
|
|
|
def test_values(self):
|
|
self.assertListEqual(ExampleChoices.values(), ['a', 'b', 'c', 1, 2, 3])
|
|
|
|
|
|
class FieldChoicesCaseInsensitiveTestCase(TestCase):
|
|
"""
|
|
Integration tests for FIELD_CHOICES case-insensitive key lookup.
|
|
"""
|
|
|
|
def test_replace_choices_with_different_casing(self):
|
|
"""Test that replacement works when config key casing differs."""
|
|
# Config uses lowercase, but code constructs PascalCase key
|
|
with override_settings(FIELD_CHOICES={'utilities.teststatus': [('new', 'New')]}):
|
|
class TestStatusChoices(ChoiceSet):
|
|
key = 'TestStatus' # Code will look up 'utilities.TestStatus'
|
|
CHOICES = [('old', 'Old')]
|
|
|
|
self.assertEqual(TestStatusChoices.CHOICES, [('new', 'New')])
|
|
|
|
def test_extend_choices_with_different_casing(self):
|
|
"""Test that extension works with the + suffix under casing differences."""
|
|
# Config uses lowercase with + suffix
|
|
with override_settings(FIELD_CHOICES={'utilities.teststatus+': [('extra', 'Extra')]}):
|
|
class TestStatusChoices(ChoiceSet):
|
|
key = 'TestStatus' # Code will look up 'utilities.TestStatus+'
|
|
CHOICES = [('base', 'Base')]
|
|
|
|
self.assertEqual(TestStatusChoices.CHOICES, [('base', 'Base'), ('extra', 'Extra')])
|