1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Fix form field ordering

This commit is contained in:
Jeremy Stretch
2019-08-09 16:34:01 -04:00
parent 4fc19742ec
commit 3f7f3f88f3
5 changed files with 48 additions and 9 deletions

View File

@@ -393,5 +393,5 @@ class ScriptForm(BootstrapMixin, forms.Form):
super().__init__(*args, **kwargs)
# Dynamically populate fields for variables
for name, var in vars:
for name, var in vars.items():
self.fields[name] = var.as_field()

View File

@@ -10,6 +10,15 @@ from .constants import LOG_DEFAULT, LOG_FAILURE, LOG_INFO, LOG_SUCCESS, LOG_WARN
from .forms import ScriptForm
__all__ = [
'Script',
'StringVar',
'IntegerVar',
'BooleanVar',
'ObjectVar',
]
class OptionalBooleanField(forms.BooleanField):
required = False
@@ -117,13 +126,24 @@ class Script:
self.source = inspect.getsource(self.__class__)
def __str__(self):
if hasattr(self, 'name'):
return self.name
if hasattr(self, 'script_name'):
return self.script_name
return self.__class__.__name__
def _get_vars(self):
# TODO: This should preserve var ordering
return inspect.getmembers(self, is_variable)
vars = OrderedDict()
# Infer order from script_fields (Python 3.5 and lower)
if hasattr(self, 'script_fields'):
for name in self.script_fields:
vars[name] = getattr(self, name)
# Default to order of declaration on class
for name, attr in self.__class__.__dict__.items():
if name not in vars and issubclass(attr.__class__, ScriptVariable):
vars[name] = attr
return vars
def run(self, data):
raise NotImplementedError("The script must define a run() method.")

View File

@@ -16,7 +16,7 @@
</div>
</div>
<h1>{{ script }}</h1>
<p>{{ script.description }}</p>
<p>{{ script.script_description }}</p>
<ul class="nav nav-tabs" role="tablist">
<li role="presentation" class="active">
<a href="#run" role="tab" data-toggle="tab" class="active">Run</a>

View File

@@ -22,7 +22,7 @@
<td>
<a href="{% url 'extras:script' module=module name=class_name %}" name="script.{{ class_name }}"><strong>{{ script }}</strong></a>
</td>
<td>{{ script.description }}</td>
<td>{{ script.script_description }}</td>
<td></td>
</tr>
{% endfor %}