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 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):

View File

@ -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)

View File

@ -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 {}

View File

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