fix: render rack width fields in grouped device forms
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import decimal
|
||||
from contextvars import ContextVar
|
||||
from copy import deepcopy
|
||||
from fractions import Fraction
|
||||
from functools import wraps
|
||||
|
||||
@@ -26,6 +27,8 @@ CORE_RACK_POSITION_CONSTRAINT = "dcim_device_unique_rack_position_face"
|
||||
|
||||
_validated_device = ContextVar("netbox_utilities_width_validated_device", default=None)
|
||||
|
||||
RACK_WIDTH_FORM_FIELDS = ("utilities_rack_width", "utilities_horizontal_position")
|
||||
|
||||
|
||||
def normalize_width_position(width, horizontal_position):
|
||||
try:
|
||||
@@ -114,6 +117,40 @@ def stage_width_position(device, width, horizontal_position):
|
||||
return width, horizontal_position
|
||||
|
||||
|
||||
def include_rack_width_in_fieldsets(fieldsets):
|
||||
"""Return an isolated fieldset layout which renders both rack width fields."""
|
||||
if not fieldsets:
|
||||
return fieldsets
|
||||
|
||||
copied_fieldsets = deepcopy(fieldsets)
|
||||
|
||||
def insert_after_position(group):
|
||||
items = list(getattr(group, "items", ()))
|
||||
if "position" in items:
|
||||
index = items.index("position") + 1
|
||||
for field_name in reversed(RACK_WIDTH_FORM_FIELDS):
|
||||
if field_name not in items:
|
||||
items.insert(index, field_name)
|
||||
group.items = tuple(items)
|
||||
return True
|
||||
|
||||
for item in items:
|
||||
nested_groups = getattr(item, "groups", ())
|
||||
if any(insert_after_position(nested_group) for nested_group in nested_groups):
|
||||
return True
|
||||
return False
|
||||
|
||||
if any(insert_after_position(fieldset) for fieldset in copied_fieldsets):
|
||||
return tuple(copied_fieldsets)
|
||||
|
||||
from utilities.forms.rendering import FieldSet
|
||||
|
||||
return (
|
||||
*copied_fieldsets,
|
||||
FieldSet(*RACK_WIDTH_FORM_FIELDS, name="Rackbreite im Rack"),
|
||||
)
|
||||
|
||||
|
||||
def _vertical_interval(device, position=None):
|
||||
start = decimal.Decimal(position if position is not None else device.position)
|
||||
height = decimal.Decimal(str(device.device_type.u_height))
|
||||
@@ -330,6 +367,10 @@ def _install_device_form():
|
||||
help_text="Position von links; bei halber Breite sind Position 1 und 2 möglich.",
|
||||
)
|
||||
|
||||
@property
|
||||
def fieldsets(self):
|
||||
return include_rack_width_in_fieldsets(super().fieldsets)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
width, horizontal_position = _stored_width_position(self.instance)
|
||||
|
||||
Reference in New Issue
Block a user