mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-26 18:38:38 -06:00
Improve TableConfig validation
This commit is contained in:
parent
ea2fa5cbf1
commit
e5e548f784
@ -613,6 +613,31 @@ class TableConfig(CloningMixin, ChangeLoggedModel):
|
|||||||
items.append((col, ascending))
|
items.append((col, ascending))
|
||||||
return items
|
return items
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
super().clean()
|
||||||
|
|
||||||
|
# Validate table
|
||||||
|
if self.table_class is None:
|
||||||
|
raise ValidationError({
|
||||||
|
'table': _("Unknown table: {name}").format(name=self.table)
|
||||||
|
})
|
||||||
|
|
||||||
|
table = self.table_class([])
|
||||||
|
|
||||||
|
# Validate ordering columns
|
||||||
|
for name in self.ordering:
|
||||||
|
if name not in table.columns:
|
||||||
|
raise ValidationError({
|
||||||
|
'ordering': _('Unknown column: {name}').format(name=name)
|
||||||
|
})
|
||||||
|
|
||||||
|
# Validate selected columns
|
||||||
|
for name in self.columns:
|
||||||
|
if name not in table.columns:
|
||||||
|
raise ValidationError({
|
||||||
|
'columns': _('Unknown column: {name}').format(name=name)
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
class ImageAttachment(ChangeLoggedModel):
|
class ImageAttachment(ChangeLoggedModel):
|
||||||
"""
|
"""
|
||||||
|
@ -3,49 +3,46 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
|
||||||
{% block form %}
|
{% block form %}
|
||||||
{% render_errors form %}
|
<div class="field-group my-5">
|
||||||
|
<div class="row">
|
||||||
<div class="field-group my-5">
|
<h2 class="col-9 offset-3">{% trans "Device" %}</h2>
|
||||||
<div class="row">
|
|
||||||
<h2 class="col-9 offset-3">{% trans "Device" %}</h2>
|
|
||||||
</div>
|
|
||||||
{% render_field form.name %}
|
|
||||||
{% render_field form.object_type %}
|
|
||||||
{% render_field form.table %}
|
|
||||||
{% render_field form.description %}
|
|
||||||
{% render_field form.weight %}
|
|
||||||
{% render_field form.enabled %}
|
|
||||||
{% render_field form.shared %}
|
|
||||||
{% render_field form.ordering %}
|
|
||||||
</div>
|
</div>
|
||||||
|
{% render_field form.name %}
|
||||||
<div class="field-group my-5">
|
{% render_field form.object_type %}
|
||||||
<div class="row">
|
{% render_field form.table %}
|
||||||
<div class="col-5 text-center">
|
{% render_field form.description %}
|
||||||
{{ form.available_columns.label }}
|
{% render_field form.weight %}
|
||||||
{{ form.available_columns }}
|
{% render_field form.enabled %}
|
||||||
</div>
|
{% render_field form.shared %}
|
||||||
<div class="col-2 d-flex align-items-center">
|
{% render_field form.ordering %}
|
||||||
<div>
|
|
||||||
<a tabindex="0" class="btn btn-success btn-sm w-100 my-2" id="add_columns">
|
|
||||||
<i class="mdi mdi-arrow-right-bold"></i> {% trans "Add" %}
|
|
||||||
</a>
|
|
||||||
<a tabindex="0" class="btn btn-danger btn-sm w-100 my-2" id="remove_columns">
|
|
||||||
<i class="mdi mdi-arrow-left-bold"></i> {% trans "Remove" %}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-5 text-center">
|
|
||||||
{{ form.columns.label }}
|
|
||||||
{{ form.columns }}
|
|
||||||
<a tabindex="0" class="btn btn-primary btn-sm mt-2" id="move-option-up" data-target="id_columns">
|
|
||||||
<i class="mdi mdi-arrow-up-bold"></i> {% trans "Move Up" %}
|
|
||||||
</a>
|
|
||||||
<a tabindex="0" class="btn btn-primary btn-sm mt-2" id="move-option-down" data-target="id_columns">
|
|
||||||
<i class="mdi mdi-arrow-down-bold"></i> {% trans "Move Down" %}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="field-group my-5">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-5 text-center">
|
||||||
|
{{ form.available_columns.label }}
|
||||||
|
{{ form.available_columns }}
|
||||||
|
</div>
|
||||||
|
<div class="col-2 d-flex align-items-center">
|
||||||
|
<div>
|
||||||
|
<a tabindex="0" class="btn btn-success btn-sm w-100 my-2" id="add_columns">
|
||||||
|
<i class="mdi mdi-arrow-right-bold"></i> {% trans "Add" %}
|
||||||
|
</a>
|
||||||
|
<a tabindex="0" class="btn btn-danger btn-sm w-100 my-2" id="remove_columns">
|
||||||
|
<i class="mdi mdi-arrow-left-bold"></i> {% trans "Remove" %}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-5 text-center">
|
||||||
|
{{ form.columns.label }}
|
||||||
|
{{ form.columns }}
|
||||||
|
<a tabindex="0" class="btn btn-primary btn-sm mt-2" id="move-option-up" data-target="id_columns">
|
||||||
|
<i class="mdi mdi-arrow-up-bold"></i> {% trans "Move Up" %}
|
||||||
|
</a>
|
||||||
|
<a tabindex="0" class="btn btn-primary btn-sm mt-2" id="move-option-down" data-target="id_columns">
|
||||||
|
<i class="mdi mdi-arrow-down-bold"></i> {% trans "Move Down" %}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -13,7 +13,10 @@ __all__ = (
|
|||||||
|
|
||||||
def get_table_for_model(model, name=None):
|
def get_table_for_model(model, name=None):
|
||||||
name = name or f'{model.__name__}Table'
|
name = name or f'{model.__name__}Table'
|
||||||
return import_string(f'{model._meta.app_label}.tables.{name}')
|
try:
|
||||||
|
return import_string(f'{model._meta.app_label}.tables.{name}')
|
||||||
|
except ImportError:
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
def get_table_ordering(request, table):
|
def get_table_ordering(request, table):
|
||||||
|
Loading…
Reference in New Issue
Block a user