From 8743c37016796485eaced7053e07947686854c9d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 2 Feb 2023 09:42:24 -0500 Subject: [PATCH] Render DataSourceForm fieldsets dynamically --- netbox/core/forms/model_forms.py | 37 ++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/netbox/core/forms/model_forms.py b/netbox/core/forms/model_forms.py index 518291aa8..786e71c3a 100644 --- a/netbox/core/forms/model_forms.py +++ b/netbox/core/forms/model_forms.py @@ -1,8 +1,11 @@ import copy +from django import forms + from core.models import * from netbox.forms import NetBoxModelForm, StaticSelect from netbox.registry import registry +from utilities.forms import CommentField __all__ = ( 'DataSourceForm', @@ -10,10 +13,7 @@ __all__ = ( class DataSourceForm(NetBoxModelForm): - # fieldsets = ( - # ('Source', ('name', 'type', 'source_url', 'enabled', 'description')), - # ('Backend', ('parameters', 'ignore_rules')), - # ) + comments = CommentField() class Meta: model = DataSource @@ -28,21 +28,44 @@ class DataSourceForm(NetBoxModelForm): 'hx-target': '#form_fields', } ), + 'ignore_rules': forms.Textarea( + attrs={ + 'rows': 5, + 'class': 'font-monospace', + 'placeholder': '.cache\n*.txt' + } + ), } + @property + def fieldsets(self): + fieldsets = [ + ('Source', ('name', 'type', 'source_url', 'enabled', 'description', 'tags', 'ignore_rules')), + ] + if self.backend_fields: + fieldsets.append( + ('Backend', self.backend_fields) + ) + + return fieldsets + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) backend_classes = registry['data_backends'] if self.is_bound and self.data.get('type') in backend_classes: - backend = backend_classes.get(self.data['type']) + type_ = self.data['type'] elif self.initial and self.initial.get('type') in backend_classes: - backend = backend_classes.get(self.initial['type']) + type_ = self.initial['type'] else: - backend = backend_classes.get(self.fields['type'].initial) + type_ = self.fields['type'].initial + backend = backend_classes.get(type_) + + self.backend_fields = [] for name, form_field in backend.parameters.items(): field_name = f'backend_{name}' + self.backend_fields.append(field_name) self.fields[field_name] = copy.copy(form_field) if self.instance and self.instance.parameters: self.fields[field_name].initial = self.instance.parameters.get(name)