Closes #8423: Allow assigning Service to FHRP Group, in addition to Device and VirtualMachine (#19005)

This commit is contained in:
Jason Novinger
2025-04-11 09:27:31 -05:00
committed by GitHub
parent fc0acb020f
commit f96df73093
23 changed files with 537 additions and 140 deletions

View File

@@ -21,7 +21,7 @@ from utilities.forms.rendering import FieldSet, InlineFields, ObjectAttribute, T
from utilities.forms.utils import get_field_value
from utilities.forms.widgets import DatePicker, HTMXSelect
from utilities.templatetags.builtins.filters import bettertitle
from virtualization.models import VirtualMachine, VMInterface
from virtualization.models import VMInterface
__all__ = (
'AggregateForm',
@@ -759,16 +759,17 @@ class ServiceTemplateForm(NetBoxModelForm):
class ServiceForm(NetBoxModelForm):
device = DynamicModelChoiceField(
label=_('Device'),
queryset=Device.objects.all(),
required=False,
selector=True
parent_object_type = ContentTypeChoiceField(
queryset=ContentType.objects.filter(SERVICE_ASSIGNMENT_MODELS),
widget=HTMXSelect(),
required=True,
label=_('Parent type')
)
virtual_machine = DynamicModelChoiceField(
label=_('Virtual machine'),
queryset=VirtualMachine.objects.all(),
required=False,
parent = DynamicModelChoiceField(
label=_('Parent'),
queryset=Device.objects.none(), # Initial queryset
required=True,
disabled=True,
selector=True
)
ports = NumericArrayField(
@@ -792,11 +793,7 @@ class ServiceForm(NetBoxModelForm):
fieldsets = (
FieldSet(
TabbedGroups(
FieldSet('device', name=_('Device')),
FieldSet('virtual_machine', name=_('Virtual Machine')),
),
'name',
'parent_object_type', 'parent', 'name',
InlineFields('protocol', 'ports', label=_('Port(s)')),
'ipaddresses', 'description', 'tags', name=_('Service')
),
@@ -805,9 +802,38 @@ class ServiceForm(NetBoxModelForm):
class Meta:
model = Service
fields = [
'device', 'virtual_machine', 'name', 'protocol', 'ports', 'ipaddresses', 'description', 'comments', 'tags',
'name', 'protocol', 'ports', 'ipaddresses', 'description', 'comments', 'tags',
'parent_object_type',
]
def __init__(self, *args, **kwargs):
initial = kwargs.get('initial', {}).copy()
if (instance := kwargs.get('instance', None)) and instance.parent:
initial['parent'] = instance.parent
kwargs['initial'] = initial
super().__init__(*args, **kwargs)
if (parent_object_type_id := get_field_value(self, 'parent_object_type')):
try:
parent_type = ContentType.objects.get(pk=parent_object_type_id)
model = parent_type.model_class()
self.fields['parent'].queryset = model.objects.all()
self.fields['parent'].widget.attrs['selector'] = model._meta.label_lower
self.fields['parent'].disabled = False
self.fields['parent'].label = _(bettertitle(model._meta.verbose_name))
except ObjectDoesNotExist:
pass
if self.instance and parent_object_type_id != self.instance.parent_object_type_id:
self.initial['parent'] = None
def clean(self):
super().clean()
self.instance.parent = self.cleaned_data.get('parent')
class ServiceCreateForm(ServiceForm):
service_template = DynamicModelChoiceField(
@@ -818,10 +844,7 @@ class ServiceCreateForm(ServiceForm):
fieldsets = (
FieldSet(
TabbedGroups(
FieldSet('device', name=_('Device')),
FieldSet('virtual_machine', name=_('Virtual Machine')),
),
'parent_object_type', 'parent',
TabbedGroups(
FieldSet('service_template', name=_('From Template')),
FieldSet('name', 'protocol', 'ports', name=_('Custom')),
@@ -832,8 +855,8 @@ class ServiceCreateForm(ServiceForm):
class Meta(ServiceForm.Meta):
fields = [
'device', 'virtual_machine', 'service_template', 'name', 'protocol', 'ports', 'ipaddresses', 'description',
'comments', 'tags',
'service_template', 'name', 'protocol', 'ports', 'ipaddresses', 'description',
'comments', 'tags', 'parent_object_type',
]
def __init__(self, *args, **kwargs):