Render discrete form fields for backend parameters

This commit is contained in:
jeremystretch 2023-01-31 10:03:52 -05:00
parent 521b30ffb7
commit 1000fe5a3d
4 changed files with 70 additions and 28 deletions

View File

@ -4,12 +4,13 @@ import tempfile
from contextlib import contextmanager from contextlib import contextmanager
from urllib.parse import quote, urlunparse, urlparse from urllib.parse import quote, urlunparse, urlparse
from django import forms
from django.conf import settings from django.conf import settings
from .exceptions import SyncError from .exceptions import SyncError
__all__ = ( __all__ = (
'LocalBakend', 'LocalBackend',
'GitBackend', 'GitBackend',
) )
@ -17,6 +18,7 @@ logger = logging.getLogger('netbox.data_backends')
class DataBackend: class DataBackend:
parameters = {}
def __init__(self, url, **kwargs): def __init__(self, url, **kwargs):
self.url = url self.url = url
@ -31,7 +33,7 @@ class DataBackend:
raise NotImplemented() raise NotImplemented()
class LocalBakend(DataBackend): class LocalBackend(DataBackend):
@contextmanager @contextmanager
def fetch(self): def fetch(self):
@ -42,6 +44,17 @@ class LocalBakend(DataBackend):
class GitBackend(DataBackend): class GitBackend(DataBackend):
parameters = {
'username': forms.CharField(
required=False
),
'password': forms.CharField(
required=False
),
'branch': forms.CharField(
required=False
)
}
@contextmanager @contextmanager
def fetch(self): def fetch(self):

View File

@ -7,16 +7,42 @@ __all__ = (
class DataSourceForm(NetBoxModelForm): class DataSourceForm(NetBoxModelForm):
fieldsets = ( # fieldsets = (
('Source', ('name', 'type', 'url', 'enabled', 'description')), # ('Source', ('name', 'type', 'url', 'enabled', 'description')),
('Backend', ('parameters', 'ignore_rules')), # ('Backend', ('parameters', 'ignore_rules')),
) # )
class Meta: class Meta:
model = DataSource model = DataSource
fields = [ fields = [
'name', 'type', 'url', 'enabled', 'description', 'parameters', 'ignore_rules', 'name', 'type', 'url', 'enabled', 'description', 'ignore_rules',
] ]
widgets = { 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)

View File

@ -17,7 +17,7 @@ from netbox.models import ChangeLoggedModel
from utilities.files import sha256_hash from utilities.files import sha256_hash
from utilities.querysets import RestrictedQuerySet from utilities.querysets import RestrictedQuerySet
from ..choices import * from ..choices import *
from ..data_backends import GitBackend, LocalBakend from ..data_backends import GitBackend, LocalBackend
from ..exceptions import SyncError from ..exceptions import SyncError
__all__ = ( __all__ = (
@ -125,7 +125,7 @@ class DataSource(ChangeLoggedModel):
def get_backend(self): def get_backend(self):
backend_cls = { backend_cls = {
DataSourceTypeChoices.LOCAL: LocalBakend, DataSourceTypeChoices.LOCAL: LocalBackend,
DataSourceTypeChoices.GIT: GitBackend, DataSourceTypeChoices.GIT: GitBackend,
}.get(self.type) }.get(self.type)
backend_params = self.parameters or {} backend_params = self.parameters or {}

View File

@ -58,6 +58,15 @@
<a href="{{ object.url }}">{{ object.url }}</a> <a href="{{ object.url }}">{{ object.url }}</a>
</td> </td>
</tr> </tr>
<tr>
<th scope="row">Ignore rules</th>
<td>
{% if object.ignore_rules %}
<pre>{{ object.ignore_rules }}</pre>
{% else %}
{{ ''|placeholder }}
{% endif %}</td>
</tr>
<tr> <tr>
<th scope="row">File count</th> <th scope="row">File count</th>
<td>{{ object.datafiles.count }}</td> <td>{{ object.datafiles.count }}</td>
@ -72,24 +81,18 @@
<h5 class="card-header">Backend</h5> <h5 class="card-header">Backend</h5>
<div class="card-body"> <div class="card-body">
<table class="table table-hover attr-table"> <table class="table table-hover attr-table">
<tr> {% for name, value in object.parameters.items %}
<th scope="row">Parameters</th> <tr>
<td> <th scope="row">{{ name }}</th>
{% if object.parameters %} <td>{{ value|placeholder }}</td>
<pre>{{ object.parameters }}</pre> </tr>
{% else %} {% empty %}
{{ ''|placeholder }} <tr>
{% endif %}</td> <td colspan="2" class="text-muted">
</tr> No parameters defined
<tr> </td>
<th scope="row">Ignore rules</th> </tr>
<td> {% endfor %}
{% if object.ignore_rules %}
<pre>{{ object.ignore_rules }}</pre>
{% else %}
{{ ''|placeholder }}
{% endif %}</td>
</tr>
</table> </table>
</div> </div>
</div> </div>