mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-26 09:16:10 -06:00
Render discrete form fields for backend parameters
This commit is contained in:
parent
521b30ffb7
commit
1000fe5a3d
@ -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):
|
||||||
|
@ -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)
|
||||||
|
@ -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 {}
|
||||||
|
@ -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">
|
||||||
|
{% for name, value in object.parameters.items %}
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row">Parameters</th>
|
<th scope="row">{{ name }}</th>
|
||||||
<td>
|
<td>{{ value|placeholder }}</td>
|
||||||
{% if object.parameters %}
|
|
||||||
<pre>{{ object.parameters }}</pre>
|
|
||||||
{% else %}
|
|
||||||
{{ ''|placeholder }}
|
|
||||||
{% endif %}</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
|
{% empty %}
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row">Ignore rules</th>
|
<td colspan="2" class="text-muted">
|
||||||
<td>
|
No parameters defined
|
||||||
{% if object.ignore_rules %}
|
</td>
|
||||||
<pre>{{ object.ignore_rules }}</pre>
|
|
||||||
{% else %}
|
|
||||||
{{ ''|placeholder }}
|
|
||||||
{% endif %}</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user