From c56090f9942f4dcc3acb148fa3878809b8eeec74 Mon Sep 17 00:00:00 2001 From: mburggraf Date: Thu, 2 Jul 2026 13:51:18 +0200 Subject: [PATCH] Fixes #22521: Honor RAM_BASE_UNIT for Virtual Machine Type default memory (#22550) Update VirtualMachineType default memory labels and display rendering to use the configured RAM base unit, matching the existing VirtualMachine and VirtualDisk behavior. Render default memory with the existing humanized RAM capacity helper and keep the model field metadata unit-agnostic. --------- Co-authored-by: Martin Hauser --- .../virtualmachinetype/attrs/default_memory.html | 2 ++ netbox/virtualization/forms/bulk_edit.py | 10 +++++++++- netbox/virtualization/forms/filtersets.py | 10 +++++++++- netbox/virtualization/forms/model_forms.py | 8 ++++++++ netbox/virtualization/models/virtualmachines.py | 2 +- netbox/virtualization/tables/virtualmachines.py | 4 ++++ netbox/virtualization/ui/panels.py | 6 +++++- 7 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 netbox/templates/virtualization/virtualmachinetype/attrs/default_memory.html diff --git a/netbox/templates/virtualization/virtualmachinetype/attrs/default_memory.html b/netbox/templates/virtualization/virtualmachinetype/attrs/default_memory.html new file mode 100644 index 000000000..62786d620 --- /dev/null +++ b/netbox/templates/virtualization/virtualmachinetype/attrs/default_memory.html @@ -0,0 +1,2 @@ +{% load helpers %} +{{ value|humanize_ram_capacity }} diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index 6f0feaf0e..f5f2e6e4a 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -91,7 +91,7 @@ class VirtualMachineTypeBulkEditForm(PrimaryModelBulkEditForm): required=False, ) default_memory = forms.IntegerField( - label=_('Default Memory (MB)'), + label=_('Default memory'), required=False, ) @@ -104,6 +104,14 @@ class VirtualMachineTypeBulkEditForm(PrimaryModelBulkEditForm): 'default_platform', 'default_vcpus', 'default_memory', 'description', 'comments', ) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Set unit label based on configured RAM_BASE_UNIT (MB vs MiB) + self.fields['default_memory'].label = _('Default memory ({unit})').format( + unit=get_capacity_unit_label(settings.RAM_BASE_UNIT) + ) + class VirtualMachineBulkEditForm(PrimaryModelBulkEditForm): virtual_machine_type = DynamicModelChoiceField( diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 9cabb8321..b1958c699 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -128,7 +128,7 @@ class VirtualMachineTypeFilterForm(PrimaryModelFilterSetForm): required=False, ) default_memory = forms.IntegerField( - label=_('Default memory (MB)'), + label=_('Default memory'), required=False, min_value=0, ) @@ -140,6 +140,14 @@ class VirtualMachineTypeFilterForm(PrimaryModelFilterSetForm): tag = TagFilterField(model) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Set unit label based on configured RAM_BASE_UNIT (MB vs MiB) + self.fields['default_memory'].label = _('Default memory ({unit})').format( + unit=get_capacity_unit_label(settings.RAM_BASE_UNIT) + ) + class VirtualMachineFilterForm( LocalConfigContextFilterForm, diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py index 3be14d396..aacf93d7d 100644 --- a/netbox/virtualization/forms/model_forms.py +++ b/netbox/virtualization/forms/model_forms.py @@ -192,6 +192,14 @@ class VirtualMachineTypeForm(PrimaryModelForm): 'owner', 'comments', 'tags', ) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Set unit label based on configured RAM_BASE_UNIT (MB vs MiB) + self.fields['default_memory'].label = _('Default memory ({unit})').format( + unit=get_capacity_unit_label(settings.RAM_BASE_UNIT) + ) + class VirtualMachineForm(TenancyForm, PrimaryModelForm): virtual_machine_type = forms.ModelChoiceField( diff --git a/netbox/virtualization/models/virtualmachines.py b/netbox/virtualization/models/virtualmachines.py index 5d6b59f83..16a32df96 100644 --- a/netbox/virtualization/models/virtualmachines.py +++ b/netbox/virtualization/models/virtualmachines.py @@ -62,7 +62,7 @@ class VirtualMachineType(ImageAttachmentsMixin, PrimaryModel): validators=(MinValueValidator(decimal.Decimal('0.01')),), ) default_memory = models.PositiveIntegerField( - verbose_name=_('default memory (MB)'), + verbose_name=_('default memory'), blank=True, null=True, ) diff --git a/netbox/virtualization/tables/virtualmachines.py b/netbox/virtualization/tables/virtualmachines.py index 8c01e3e85..8058a96e9 100644 --- a/netbox/virtualization/tables/virtualmachines.py +++ b/netbox/virtualization/tables/virtualmachines.py @@ -49,6 +49,10 @@ class VirtualMachineTypeTable(PrimaryModelTable): 'pk', 'name', 'default_platform', 'default_vcpus', 'default_memory', 'virtual_machine_count', 'description', ) + def render_default_memory(self, value): + return humanize_ram_capacity(value) + + # # Virtual machines # diff --git a/netbox/virtualization/ui/panels.py b/netbox/virtualization/ui/panels.py index 4132f0544..6ac0aa859 100644 --- a/netbox/virtualization/ui/panels.py +++ b/netbox/virtualization/ui/panels.py @@ -26,7 +26,11 @@ class VirtualMachineTypePanel(panels.ObjectAttributesPanel): name = attrs.TextAttr('name') default_platform = attrs.RelatedObjectAttr('default_platform', linkify=True) default_vcpus = attrs.TextAttr('default_vcpus', label=_('Default vCPUs')) - default_memory = attrs.TextAttr('default_memory', format_string=_('{0} MB'), label=_('Default memory')) + default_memory = attrs.TemplatedAttr( + 'default_memory', + template_name='virtualization/virtualmachinetype/attrs/default_memory.html', + label=_('Default memory') + ) description = attrs.TextAttr('description')