From 1000fe5a3d2c2c1d6e516436c734889a9d48b4ce Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 31 Jan 2023 10:03:52 -0500 Subject: [PATCH] Render discrete form fields for backend parameters --- netbox/core/data_backends.py | 17 ++++++++++-- netbox/core/forms/model_forms.py | 38 +++++++++++++++++++++----- netbox/core/models/data.py | 4 +-- netbox/templates/core/datasource.html | 39 ++++++++++++++------------- 4 files changed, 70 insertions(+), 28 deletions(-) diff --git a/netbox/core/data_backends.py b/netbox/core/data_backends.py index c14f836b3..1ddbcb37d 100644 --- a/netbox/core/data_backends.py +++ b/netbox/core/data_backends.py @@ -4,12 +4,13 @@ import tempfile from contextlib import contextmanager from urllib.parse import quote, urlunparse, urlparse +from django import forms from django.conf import settings from .exceptions import SyncError __all__ = ( - 'LocalBakend', + 'LocalBackend', 'GitBackend', ) @@ -17,6 +18,7 @@ logger = logging.getLogger('netbox.data_backends') class DataBackend: + parameters = {} def __init__(self, url, **kwargs): self.url = url @@ -31,7 +33,7 @@ class DataBackend: raise NotImplemented() -class LocalBakend(DataBackend): +class LocalBackend(DataBackend): @contextmanager def fetch(self): @@ -42,6 +44,17 @@ class LocalBakend(DataBackend): class GitBackend(DataBackend): + parameters = { + 'username': forms.CharField( + required=False + ), + 'password': forms.CharField( + required=False + ), + 'branch': forms.CharField( + required=False + ) + } @contextmanager def fetch(self): diff --git a/netbox/core/forms/model_forms.py b/netbox/core/forms/model_forms.py index 64d18febc..d8f0e5258 100644 --- a/netbox/core/forms/model_forms.py +++ b/netbox/core/forms/model_forms.py @@ -7,16 +7,42 @@ __all__ = ( class DataSourceForm(NetBoxModelForm): - fieldsets = ( - ('Source', ('name', 'type', 'url', 'enabled', 'description')), - ('Backend', ('parameters', 'ignore_rules')), - ) + # fieldsets = ( + # ('Source', ('name', 'type', 'url', 'enabled', 'description')), + # ('Backend', ('parameters', 'ignore_rules')), + # ) class Meta: model = DataSource fields = [ - 'name', 'type', 'url', 'enabled', 'description', 'parameters', 'ignore_rules', + 'name', 'type', 'url', 'enabled', 'description', 'ignore_rules', ] widgets = { - 'type': StaticSelect(), + 'type': StaticSelect( + # 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 + self.fields[field_name].initial = self.instance.parameters.get(name) + + def save(self, *args, **kwargs): + + parameters = {} + for name in self.fields: + if name.startswith('backend_'): + parameters[name[8:]] = self.cleaned_data[name] + self.instance.parameters = parameters + + return super().save(*args, **kwargs) diff --git a/netbox/core/models/data.py b/netbox/core/models/data.py index 6f30eb71c..478c03a4d 100644 --- a/netbox/core/models/data.py +++ b/netbox/core/models/data.py @@ -17,7 +17,7 @@ from netbox.models import ChangeLoggedModel from utilities.files import sha256_hash from utilities.querysets import RestrictedQuerySet from ..choices import * -from ..data_backends import GitBackend, LocalBakend +from ..data_backends import GitBackend, LocalBackend from ..exceptions import SyncError __all__ = ( @@ -125,7 +125,7 @@ class DataSource(ChangeLoggedModel): def get_backend(self): backend_cls = { - DataSourceTypeChoices.LOCAL: LocalBakend, + DataSourceTypeChoices.LOCAL: LocalBackend, DataSourceTypeChoices.GIT: GitBackend, }.get(self.type) backend_params = self.parameters or {} diff --git a/netbox/templates/core/datasource.html b/netbox/templates/core/datasource.html index e835f9e33..0798e351d 100644 --- a/netbox/templates/core/datasource.html +++ b/netbox/templates/core/datasource.html @@ -58,6 +58,15 @@ {{ object.url }} + + Ignore rules + + {% if object.ignore_rules %} +
{{ object.ignore_rules }}
+ {% else %} + {{ ''|placeholder }} + {% endif %} + File count {{ object.datafiles.count }} @@ -72,24 +81,18 @@
Backend
- - - - - - - - + {% for name, value in object.parameters.items %} + + + + + {% empty %} + + + + {% endfor %}
Parameters - {% if object.parameters %} -
{{ object.parameters }}
- {% else %} - {{ ''|placeholder }} - {% endif %}
Ignore rules - {% if object.ignore_rules %} -
{{ object.ignore_rules }}
- {% else %} - {{ ''|placeholder }} - {% endif %}
{{ name }}{{ value|placeholder }}
+ No parameters defined +