Enable dynamic edit form for DataSource

This commit is contained in:
jeremystretch 2023-01-31 11:55:55 -05:00
parent 1000fe5a3d
commit 6f2786da0a
4 changed files with 38 additions and 24 deletions

View File

@ -6,6 +6,7 @@ from urllib.parse import quote, urlunparse, urlparse
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.utils.translation import gettext as _
from .exceptions import SyncError from .exceptions import SyncError
@ -46,13 +47,19 @@ class LocalBackend(DataBackend):
class GitBackend(DataBackend): class GitBackend(DataBackend):
parameters = { parameters = {
'username': forms.CharField( 'username': forms.CharField(
required=False required=False,
label=_('Username'),
widget=forms.TextInput(attrs={'class': 'form-control'})
), ),
'password': forms.CharField( 'password': forms.CharField(
required=False required=False,
label=_('Password'),
widget=forms.TextInput(attrs={'class': 'form-control'})
), ),
'branch': forms.CharField( 'branch': forms.CharField(
required=False required=False,
label=_('Branch'),
widget=forms.TextInput(attrs={'class': 'form-control'})
) )
} }

View File

@ -1,5 +1,8 @@
import copy
from core.models import * from core.models import *
from netbox.forms import NetBoxModelForm, StaticSelect from netbox.forms import NetBoxModelForm, StaticSelect
from ..models.data import BACKEND_CLASSES
__all__ = ( __all__ = (
'DataSourceForm', 'DataSourceForm',
@ -19,22 +22,28 @@ class DataSourceForm(NetBoxModelForm):
] ]
widgets = { widgets = {
'type': StaticSelect( 'type': StaticSelect(
# attrs={ attrs={
# 'hx-get': '.', 'hx-get': '.',
# 'hx-include': '#form_fields input', 'hx-include': '#form_fields input',
# 'hx-target': '#form_fields', 'hx-target': '#form_fields',
# } }
), ),
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
if self.instance: if self.is_bound and self.data.get('type') in BACKEND_CLASSES:
backend = self.instance.get_backend() 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(): for name, form_field in backend.parameters.items():
field_name = f'backend_{name}' field_name = f'backend_{name}'
self.fields[field_name] = form_field 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) self.fields[field_name].initial = self.instance.parameters.get(name)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):

View File

@ -27,6 +27,11 @@ __all__ = (
logger = logging.getLogger('netbox.core.data') logger = logging.getLogger('netbox.core.data')
BACKEND_CLASSES = {
DataSourceTypeChoices.LOCAL: LocalBackend,
DataSourceTypeChoices.GIT: GitBackend,
}
class DataSource(ChangeLoggedModel): class DataSource(ChangeLoggedModel):
""" """
@ -124,10 +129,7 @@ class DataSource(ChangeLoggedModel):
return job_result return job_result
def get_backend(self): def get_backend(self):
backend_cls = { backend_cls = BACKEND_CLASSES.get(self.type)
DataSourceTypeChoices.LOCAL: LocalBackend,
DataSourceTypeChoices.GIT: GitBackend,
}.get(self.type)
backend_params = self.parameters or {} backend_params = self.parameters or {}
return backend_cls(self.url, **backend_params) return backend_cls(self.url, **backend_params)

View File

@ -67,10 +67,6 @@
{{ ''|placeholder }} {{ ''|placeholder }}
{% endif %}</td> {% endif %}</td>
</tr> </tr>
<tr>
<th scope="row">File count</th>
<td>{{ object.datafiles.count }}</td>
</tr>
</table> </table>
</div> </div>
</div> </div>
@ -81,10 +77,10 @@
<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 %} {% for name, field in object.get_backend.parameters.items %}
<tr> <tr>
<th scope="row">{{ name }}</th> <th scope="row">{{ field.label }}</th>
<td>{{ value|placeholder }}</td> <td>{{ object.parameters|get_key:name|placeholder }}</td>
</tr> </tr>
{% empty %} {% empty %}
<tr> <tr>