fix: render rack width fields in device template

This commit is contained in:
2026-08-12 14:28:35 +02:00
parent 008a69ed79
commit c38ab30acc
7 changed files with 180 additions and 28 deletions
+40 -25
View File
@@ -2,9 +2,12 @@ from importlib import import_module
from types import SimpleNamespace
from unittest.mock import MagicMock, patch
from django.conf import settings
from django.contrib.auth.context_processors import PermWrapper
from django.contrib.auth.models import AnonymousUser
from django.core.exceptions import ValidationError
from django.template.loader import render_to_string
from django.test import SimpleTestCase
from django.test import RequestFactory, SimpleTestCase
from django.urls import resolve, reverse
from netbox_utilities.rack_width import (
@@ -56,12 +59,13 @@ class RackWidthTest(SimpleTestCase):
self.assertEqual(edit_view.__name__, "RackWidthDeviceEditView")
self.assertEqual(edit_view.form.__name__, "RackWidthDeviceForm")
self.assertEqual(edit_view.template_name, "netbox_utilities/device_edit.html")
self.assertEqual(edit_view.htmx_template_name, "netbox_utilities/device_edit_form.html")
self.assertIn("utilities_rack_width", edit_view.form.base_fields)
self.assertIn("utilities_horizontal_position", edit_view.form.base_fields)
def test_resolved_device_edit_page_renders_rack_width_fields(self):
from dcim.models import Device
from utilities.forms.rendering import FieldSet
object_type = SimpleNamespace(pk=1, model_class=lambda: Device)
with (
@@ -78,32 +82,43 @@ class RackWidthTest(SimpleTestCase):
):
url = reverse("dcim:device_edit", kwargs={"pk": 1})
view_class = resolve(url).func.view_class
base_form = view_class.form.__mro__[1]
with patch.object(
base_form,
"fieldsets",
(FieldSet("site", "rack", "position", "face", "latitude", name="Location"),),
):
form = view_class.form()
rendered_fieldsets = form.fieldsets
html = render_to_string("htmx/form.html", {"form": form})
form = view_class.form()
request = self._anonymous_request()
context = {
"form": form,
"object": SimpleNamespace(
pk=None,
_meta=Device._meta,
device_type=SimpleNamespace(is_child_device=False),
parent_bay=None,
),
"return_url": "/dcim/devices/",
"request": request,
"settings": settings,
"csrf_token": "",
"perms": PermWrapper(request.user),
}
rendered_pages = (
render_to_string(view_class.htmx_template_name, context),
render_to_string(view_class.template_name, context),
)
rack_position = 'name="position"'
width = 'name="utilities_rack_width"'
horizontal_position = 'name="utilities_horizontal_position"'
self.assertIn(width, html)
self.assertIn(horizontal_position, html)
self.assertEqual(
rendered_fieldsets[0].items,
(
"site",
"rack",
"position",
"utilities_rack_width",
"utilities_horizontal_position",
"face",
"latitude",
),
)
latitude = 'name="latitude"'
for html in rendered_pages:
self.assertIn(width, html)
self.assertIn(horizontal_position, html)
self.assertLess(html.index(rack_position), html.index(width))
self.assertLess(html.index(width), html.index(horizontal_position))
self.assertLess(html.index(horizontal_position), html.index(latitude))
@staticmethod
def _anonymous_request():
request = RequestFactory().get("/dcim/devices/1/edit/")
request.user = AnonymousUser()
return request
def test_normalizes_full_width_to_first_position(self):
self.assertEqual(normalize_width_position(1, 4), (1, 1))