From 6f2786da0aa9b197f5ad396cc265ca0cd7632da8 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 31 Jan 2023 11:55:55 -0500 Subject: [PATCH] Enable dynamic edit form for DataSource --- netbox/core/data_backends.py | 13 +++++++++--- netbox/core/forms/model_forms.py | 29 ++++++++++++++++++--------- netbox/core/models/data.py | 10 +++++---- netbox/templates/core/datasource.html | 10 +++------ 4 files changed, 38 insertions(+), 24 deletions(-) diff --git a/netbox/core/data_backends.py b/netbox/core/data_backends.py index 1ddbcb37d..c0063a34f 100644 --- a/netbox/core/data_backends.py +++ b/netbox/core/data_backends.py @@ -6,6 +6,7 @@ from urllib.parse import quote, urlunparse, urlparse from django import forms from django.conf import settings +from django.utils.translation import gettext as _ from .exceptions import SyncError @@ -46,13 +47,19 @@ class LocalBackend(DataBackend): class GitBackend(DataBackend): parameters = { 'username': forms.CharField( - required=False + required=False, + label=_('Username'), + widget=forms.TextInput(attrs={'class': 'form-control'}) ), 'password': forms.CharField( - required=False + required=False, + label=_('Password'), + widget=forms.TextInput(attrs={'class': 'form-control'}) ), 'branch': forms.CharField( - required=False + required=False, + label=_('Branch'), + widget=forms.TextInput(attrs={'class': 'form-control'}) ) } diff --git a/netbox/core/forms/model_forms.py b/netbox/core/forms/model_forms.py index d8f0e5258..b84cbf932 100644 --- a/netbox/core/forms/model_forms.py +++ b/netbox/core/forms/model_forms.py @@ -1,5 +1,8 @@ +import copy + from core.models import * from netbox.forms import NetBoxModelForm, StaticSelect +from ..models.data import BACKEND_CLASSES __all__ = ( 'DataSourceForm', @@ -19,22 +22,28 @@ class DataSourceForm(NetBoxModelForm): ] widgets = { 'type': StaticSelect( - # attrs={ - # 'hx-get': '.', - # 'hx-include': '#form_fields input', - # 'hx-target': '#form_fields', - # } + attrs={ + 'hx-get': '.', + 'hx-include': '#form_fields input', + 'hx-target': '#form_fields', + } ), } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - if self.instance: - backend = self.instance.get_backend() - for name, form_field in backend.parameters.items(): - field_name = f'backend_{name}' - self.fields[field_name] = form_field + if self.is_bound and self.data.get('type') in BACKEND_CLASSES: + backend_type = self.data['type'] + elif self.initial and self.initial.get('type') in BACKEND_CLASSES: + backend_type = self.initial['type'] + else: + backend_type = self.fields['type'].initial + backend = BACKEND_CLASSES.get(backend_type) + for name, form_field in backend.parameters.items(): + field_name = f'backend_{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) def save(self, *args, **kwargs): diff --git a/netbox/core/models/data.py b/netbox/core/models/data.py index 478c03a4d..d3a70f67a 100644 --- a/netbox/core/models/data.py +++ b/netbox/core/models/data.py @@ -27,6 +27,11 @@ __all__ = ( logger = logging.getLogger('netbox.core.data') +BACKEND_CLASSES = { + DataSourceTypeChoices.LOCAL: LocalBackend, + DataSourceTypeChoices.GIT: GitBackend, +} + class DataSource(ChangeLoggedModel): """ @@ -124,10 +129,7 @@ class DataSource(ChangeLoggedModel): return job_result def get_backend(self): - backend_cls = { - DataSourceTypeChoices.LOCAL: LocalBackend, - DataSourceTypeChoices.GIT: GitBackend, - }.get(self.type) + backend_cls = BACKEND_CLASSES.get(self.type) backend_params = self.parameters or {} return backend_cls(self.url, **backend_params) diff --git a/netbox/templates/core/datasource.html b/netbox/templates/core/datasource.html index 0798e351d..4abfacbbc 100644 --- a/netbox/templates/core/datasource.html +++ b/netbox/templates/core/datasource.html @@ -67,10 +67,6 @@ {{ ''|placeholder }} {% endif %} - - File count - {{ object.datafiles.count }} - @@ -81,10 +77,10 @@
Backend
- {% for name, value in object.parameters.items %} + {% for name, field in object.get_backend.parameters.items %} - - + + {% empty %}
{{ name }}{{ value|placeholder }}{{ field.label }}{{ object.parameters|get_key:name|placeholder }}