Clean up object edit forms

This commit is contained in:
jeremystretch 2021-08-24 13:59:54 -04:00
parent b63c838c74
commit 545474a1a3
21 changed files with 610 additions and 566 deletions

View File

@ -1422,6 +1422,10 @@ class VLANGroupForm(BootstrapMixin, CustomFieldModelForm):
'name', 'slug', 'description', 'scope_type', 'region', 'sitegroup', 'site', 'location', 'rack', 'name', 'slug', 'description', 'scope_type', 'region', 'sitegroup', 'site', 'location', 'rack',
'clustergroup', 'cluster', 'clustergroup', 'cluster',
] ]
fieldsets = (
('VLAN Group', ('name', 'slug', 'description')),
('Scope', ('scope_type', 'region', 'sitegroup', 'site', 'location', 'rack', 'clustergroup', 'cluster')),
)
widgets = { widgets = {
'scope_type': StaticSelect, 'scope_type': StaticSelect,
} }

View File

@ -769,7 +769,6 @@ class VLANGroupView(generic.ObjectView):
class VLANGroupEditView(generic.ObjectEditView): class VLANGroupEditView(generic.ObjectEditView):
queryset = VLANGroup.objects.all() queryset = VLANGroup.objects.all()
model_form = forms.VLANGroupForm model_form = forms.VLANGroupForm
template_name = 'ipam/vlangroup_edit.html'
class VLANGroupDeleteView(generic.ObjectDeleteView): class VLANGroupDeleteView(generic.ObjectDeleteView):

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -725,15 +725,6 @@ div.paginator > form > div.input-group {
div.field-group:not(:first-of-type) { div.field-group:not(:first-of-type) {
margin-top: $spacer * 3; margin-top: $spacer * 3;
h1,
h2,
h3,
h4,
h5,
h6 {
margin-bottom: $spacer;
}
} }
label.required { label.required {

View File

@ -6,54 +6,62 @@
{% block form %} {% block form %}
<div class="field-group"> <div class="field-group">
<h4 class="mb-3">Termination</h4> <div class="row mb-2">
<div class="row mb-3"> <h5 class="offset-sm-3">Circuit Termination</h5>
<label class="col-sm-3 col-form-label">Provider</label> </div>
<div class="col"> <div class="row mb-3">
<input class="form-control" value="{{ obj.circuit.provider }}" disabled /> <label class="col-sm-3 col-form-label text-lg-end">Provider</label>
</div> <div class="col">
<input class="form-control" value="{{ obj.circuit.provider }}" disabled />
</div> </div>
<div class="row mb-3"> </div>
<label class="col-sm-3 col-form-label">Circuit</label> <div class="row mb-3">
<div class="col"> <label class="col-sm-3 col-form-label text-lg-end">Circuit</label>
<input class="form-control" value="{{ obj.circuit.cid }}" disabled /> <div class="col">
</div> <input class="form-control" value="{{ obj.circuit.cid }}" disabled />
</div> </div>
<div class="row mb-3"> </div>
<label class="col-sm-3 col-form-label">Termination</label> <div class="row mb-3">
<div class="col"> <label class="col-sm-3 col-form-label text-lg-end">Termination</label>
<input class="form-control" value="{{ form.term_side.value }}" disabled /> <div class="col">
</div> <input class="form-control" value="{{ form.term_side.value }}" disabled />
</div> </div>
{% render_field form.mark_connected %} </div>
{% with providernetwork_tab_active=form.initial.provider_network %} {% render_field form.mark_connected %}
<ul class="nav nav-tabs" role="tablist"> {% with providernetwork_tab_active=form.initial.provider_network %}
<div class="row mb-2">
<div class="offset-sm-3">
<ul class="nav nav-pills" role="tablist">
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="nav-link{% if not providernetwork_tab_active %} active{% endif %}" role="tab" type="button" data-bs-target="#site" data-bs-toggle="tab">Site</button> <button class="nav-link{% if not providernetwork_tab_active %} active{% endif %}" role="tab" type="button" data-bs-target="#site" data-bs-toggle="tab">Site</button>
</li> </li>
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="nav-link{% if providernetwork_tab_active %} active{% endif %}" role="tab" type="button" data-bs-toggle="tab" data-bs-target="#providernetwork">Provider Network</button> <button class="nav-link{% if providernetwork_tab_active %} active{% endif %}" role="tab" type="button" data-bs-toggle="tab" data-bs-target="#providernetwork">Provider Network</button>
</li> </li>
</ul> </ul>
<div class="tab-content"> </div>
<div class="tab-pane{% if not providernetwork_tab_active %} active{% endif %}" id="site"> </div>
{% render_field form.region %} <div class="tab-content p-0">
{% render_field form.site_group %} <div class="tab-pane{% if not providernetwork_tab_active %} active{% endif %}" id="site">
{% render_field form.site %} {% render_field form.region %}
</div> {% render_field form.site_group %}
<div class="tab-pane{% if providernetwork_tab_active %} active{% endif %}" id="providernetwork"> {% render_field form.site %}
{% render_field form.provider_network %} </div>
</div> <div class="tab-pane{% if providernetwork_tab_active %} active{% endif %}" id="providernetwork">
</div> {% render_field form.provider_network %}
{% endwith %} </div>
</div>
{% endwith %}
</div> </div>
<div class="field-group"> <div class="field-group">
<h4 class="mb-3">Termination Details</h4> <div class="row mb-2">
{% render_field form.port_speed %} <h5 class="offset-sm-3">Termination Details</h5>
{% render_field form.upstream_speed %} </div>
{% render_field form.xconnect_id %} {% render_field form.port_speed %}
{% render_field form.pp_info %} {% render_field form.upstream_speed %}
{% render_field form.description %} {% render_field form.xconnect_id %}
{% render_field form.pp_info %}
{% render_field form.description %}
</div> </div>
{% endblock %} {% endblock %}

View File

@ -5,162 +5,169 @@
{% block title %}Connect {{ form.instance.termination_a.device }} {{ form.instance.termination_a }} to {{ termination_b_type|bettertitle }}{% endblock %} {% block title %}Connect {{ form.instance.termination_a.device }} {{ form.instance.termination_a }} to {{ termination_b_type|bettertitle }}{% endblock %}
{% block content %} {% block content-wrapper %}
{% with termination_a=form.instance.termination_a %} <div class="tab-content">
{% render_errors form %} {% with termination_a=form.instance.termination_a %}
<form method="post"> {% render_errors form %}
{% csrf_token %} <form method="post">
{% for field in form.hidden_fields %} {% csrf_token %}
{{ field }} {% for field in form.hidden_fields %}
{% endfor %} {{ field }}
<div class="row my-3"> {% endfor %}
<div class="col col-md-5"> <div class="row my-3">
<div class="card h-100"> <div class="col col-md-5">
<h5 class="card-header"> <div class="card h-100">
A Side <h5 class="card-header">
</h5> A Side
<div class="card-body"> </h5>
{% if termination_a.device %} <div class="card-body">
{# Device component #} {% if termination_a.device %}
<div class="row mb-3"> {# Device component #}
<label class="col-sm-3 col-form-label text-lg-end">Region</label> <div class="row mb-3">
<div class="col"> <label class="col-sm-3 col-form-label text-lg-end">Region</label>
<input class="form-control" value="{{ termination_a.device.site.region }}" disabled /> <div class="col">
</div> <input class="form-control" value="{{ termination_a.device.site.region }}" disabled />
</div> </div>
<div class="row mb-3"> </div>
<label class="col-sm-3 col-form-label text-lg-end">Site</label> <div class="row mb-3">
<div class="col"> <label class="col-sm-3 col-form-label text-lg-end">Site</label>
<input class="form-control" value="{{ termination_a.device.site }}" disabled /> <div class="col">
</div> <input class="form-control" value="{{ termination_a.device.site }}" disabled />
</div> </div>
<div class="row mb-3"> </div>
<label class="col-sm-3 col-form-label text-lg-end">Location</label> <div class="row mb-3">
<div class="col"> <label class="col-sm-3 col-form-label text-lg-end">Location</label>
<input class="form-control" value="{{ termination_a.device.location|default:"None" }}" disabled /> <div class="col">
</div> <input class="form-control" value="{{ termination_a.device.location|default:"None" }}" disabled />
</div> </div>
<div class="row mb-3"> </div>
<label class="col-sm-3 col-form-label text-lg-end">Rack</label> <div class="row mb-3">
<div class="col"> <label class="col-sm-3 col-form-label text-lg-end">Rack</label>
<input class="form-control" value="{{ termination_a.device.rack|default:"None" }}" disabled /> <div class="col">
</div> <input class="form-control" value="{{ termination_a.device.rack|default:"None" }}" disabled />
</div> </div>
<div class="row mb-3"> </div>
<label class="col-sm-3 col-form-label text-lg-end">Device</label> <div class="row mb-3">
<div class="col"> <label class="col-sm-3 col-form-label text-lg-end">Device</label>
<input class="form-control" value="{{ termination_a.device }}" disabled /> <div class="col">
</div> <input class="form-control" value="{{ termination_a.device }}" disabled />
</div> </div>
<div class="row mb-3"> </div>
<label class="col-sm-3 col-form-label text-lg-end">Type</label> <div class="row mb-3">
<div class="col"> <label class="col-sm-3 col-form-label text-lg-end">Type</label>
<input class="form-control" value="{{ termination_a|meta:"verbose_name"|capfirst }}" disabled /> <div class="col">
</div> <input class="form-control" value="{{ termination_a|meta:"verbose_name"|capfirst }}" disabled />
</div> </div>
<div class="row mb-3"> </div>
<label class="col-sm-3 col-form-label text-lg-end">Name</label> <div class="row mb-3">
<div class="col"> <label class="col-sm-3 col-form-label text-lg-end">Name</label>
<input class="form-control" value="{{ termination_a }}" disabled /> <div class="col">
</div> <input class="form-control" value="{{ termination_a }}" disabled />
</div> </div>
{% else %} </div>
{# Circuit termination #} {% else %}
<div class="row mb-3"> {# Circuit termination #}
<label class="col-sm-3 col-form-label">Site</label> <div class="row mb-3">
<div class="col"> <label class="col-sm-3 col-form-label">Site</label>
<input class="form-control" value="{{ termination_a.site }}" disabled /> <div class="col">
</div> <input class="form-control" value="{{ termination_a.site }}" disabled />
</div> </div>
<div class="row mb-3"> </div>
<label class="col-sm-3 col-form-label">Provider</label> <div class="row mb-3">
<div class="col"> <label class="col-sm-3 col-form-label">Provider</label>
<input class="form-control" value="{{ termination_a.circuit.provider }}" disabled /> <div class="col">
</div> <input class="form-control" value="{{ termination_a.circuit.provider }}" disabled />
</div> </div>
<div class="row mb-3"> </div>
<label class="col-sm-3 col-form-label">Circuit</label> <div class="row mb-3">
<div class="col"> <label class="col-sm-3 col-form-label">Circuit</label>
<input class="form-control" value="{{ termination_a.circuit.cid }}" disabled /> <div class="col">
</div> <input class="form-control" value="{{ termination_a.circuit.cid }}" disabled />
</div> </div>
<div class="row mb-3"> </div>
<label class="col-sm-3 col-form-label">Side</label> <div class="row mb-3">
<div class="col"> <label class="col-sm-3 col-form-label">Side</label>
<input class="form-control" value="{{ termination_a.term_side }}" disabled /> <div class="col">
</div> <input class="form-control" value="{{ termination_a.term_side }}" disabled />
</div> </div>
{% endif %} </div>
</div> {% endif %}
</div> </div>
</div> </div>
<div class="col col-md-2 flex-column justify-content-center align-items-center d-none d-md-flex"> </div>
<i class="mdi mdi-swap-horizontal-bold mdi-48px"></i> <div class="col col-md-2 flex-column justify-content-center align-items-center d-none d-md-flex">
</div> <i class="mdi mdi-swap-horizontal-bold mdi-48px"></i>
<div class="col col-md-5"> </div>
<div class="card h-100"> <div class="col col-md-5">
<h5 class="card-header"> <div class="card h-100">
B Side <h5 class="card-header">
</h5> B Side
<div class="card-body"> </h5>
{% if tabs %} <div class="card-body">
<ul class="nav nav-tabs"> {% if tabs %}
{% for url, link in tabs %} <ul class="nav nav-tabs">
<li class="nav-item" role="presentation"> {% for url, link in tabs %}
<a class="nav-link" href="{{ url }}">{{ link }}</a> <li class="nav-item" role="presentation">
</li> <a class="nav-link" href="{{ url }}">{{ link }}</a>
{% endfor %} </li>
</ul> {% endfor %}
{% endif %} </ul>
{% if 'termination_b_provider' in form.fields %} {% endif %}
{% render_field form.termination_b_provider %} {% if 'termination_b_provider' in form.fields %}
{% endif %} {% render_field form.termination_b_provider %}
{% if 'termination_b_region' in form.fields %} {% endif %}
{% render_field form.termination_b_region %} {% if 'termination_b_region' in form.fields %}
{% endif %} {% render_field form.termination_b_region %}
{% if 'termination_b_site' in form.fields %} {% endif %}
{% render_field form.termination_b_site %} {% if 'termination_b_site' in form.fields %}
{% endif %} {% render_field form.termination_b_site %}
{% if 'termination_b_location' in form.fields %} {% endif %}
{% render_field form.termination_b_location %} {% if 'termination_b_location' in form.fields %}
{% endif %} {% render_field form.termination_b_location %}
{% if 'termination_b_rack' in form.fields %} {% endif %}
{% render_field form.termination_b_rack %} {% if 'termination_b_rack' in form.fields %}
{% endif %} {% render_field form.termination_b_rack %}
{% if 'termination_b_device' in form.fields %} {% endif %}
{% render_field form.termination_b_device %} {% if 'termination_b_device' in form.fields %}
{% endif %} {% render_field form.termination_b_device %}
{% if 'termination_b_type' in form.fields %} {% endif %}
{% render_field form.termination_b_type %} {% if 'termination_b_type' in form.fields %}
{% endif %} {% render_field form.termination_b_type %}
{% if 'termination_b_powerpanel' in form.fields %} {% endif %}
{% render_field form.termination_b_powerpanel %} {% if 'termination_b_powerpanel' in form.fields %}
{% endif %} {% render_field form.termination_b_powerpanel %}
{% if 'termination_b_circuit' in form.fields %} {% endif %}
{% render_field form.termination_b_circuit %} {% if 'termination_b_circuit' in form.fields %}
{% endif %} {% render_field form.termination_b_circuit %}
<div class="row mb-3"> {% endif %}
<label class="col-sm-3 col-form-label text-lg-end">Type</label> <div class="row mb-3">
<div class="col"> <label class="col-sm-3 col-form-label text-lg-end">Type</label>
<input class="form-control" value="{{ termination_b_type|capfirst }}" disabled /> <div class="col">
</div> <input class="form-control" value="{{ termination_b_type|capfirst }}" disabled />
</div> </div>
{% render_field form.termination_b_id %} </div>
</div> {% render_field form.termination_b_id %}
</div> </div>
</div> </div>
</div> </div>
<div class="row my-3 justify-content-center"> </div>
<div class="row my-3 justify-content-center">
<div class="col col-md-8"> <div class="col col-md-8">
{% include 'dcim/inc/cable_form.html' %} <div class="card">
<h5 class="card-header">Cable</h5>
<div class="card-body">
{% include 'dcim/inc/cable_form.html' %}
</div>
</div>
</div> </div>
</div> </div>
<div class="row my-3"> <div class="row my-3">
<div class="col col-md-12 text-center"> <div class="col col-md-12 text-center">
<a href="{{ return_url }}" class="btn btn-outline-danger">Cancel</a> <a href="{{ return_url }}" class="btn btn-outline-danger">Cancel</a>
<button type="submit" name="_update" class="btn btn-primary">Connect</button> <button type="submit" name="_update" class="btn btn-primary">Connect</button>
</div> </div>
</div> </div>
</form> </form>
{% endwith %} {% endwith %}
</div>
{% endblock %} {% endblock %}

View File

@ -1,5 +1,5 @@
{% extends 'generic/object_edit.html' %} {% extends 'generic/object_edit.html' %}
{% block form %} {% block form %}
{% include 'dcim/inc/cable_form.html' %} {% include 'dcim/inc/cable_form.html' %}
{% endblock %} {% endblock %}

View File

@ -5,14 +5,18 @@
{% render_errors form %} {% render_errors form %}
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Device</h5> <div class="row mb-2">
<h5 class="offset-sm-3">Device</h5>
</div>
{% render_field form.name %} {% render_field form.name %}
{% render_field form.device_role %} {% render_field form.device_role %}
{% render_field form.tags %} {% render_field form.tags %}
</div> </div>
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Hardware</h5> <div class="row mb-2">
<h5 class="offset-sm-3">Hardware</h5>
</div>
{% render_field form.manufacturer %} {% render_field form.manufacturer %}
{% render_field form.device_type %} {% render_field form.device_type %}
{% render_field form.serial %} {% render_field form.serial %}
@ -20,7 +24,9 @@
</div> </div>
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Location</h5> <div class="row mb-2">
<h5 class="offset-sm-3">Location</h5>
</div>
{% render_field form.region %} {% render_field form.region %}
{% render_field form.site_group %} {% render_field form.site_group %}
{% render_field form.site %} {% render_field form.site %}
@ -52,7 +58,9 @@
</div> </div>
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Management</h5> <div class="row mb-2">
<h5 class="offset-sm-3">Management</h5>
</div>
{% render_field form.status %} {% render_field form.status %}
{% render_field form.platform %} {% render_field form.platform %}
{% if obj.pk %} {% if obj.pk %}
@ -62,20 +70,26 @@
</div> </div>
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Virtualization</h5> <div class="row mb-2">
<h5 class="offset-sm-3">Virtualization</h5>
</div>
{% render_field form.cluster_group %} {% render_field form.cluster_group %}
{% render_field form.cluster %} {% render_field form.cluster %}
</div> </div>
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Tenancy</h5> <div class="row mb-2">
<h5 class="offset-sm-3">Tenancy</h5>
</div>
{% render_field form.tenant_group %} {% render_field form.tenant_group %}
{% render_field form.tenant %} {% render_field form.tenant %}
</div> </div>
{% if form.custom_fields %} {% if form.custom_fields %}
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Custom Fields</h5> <div class="row mb-2">
<h5 class="offset-sm-3">Custom Fields</h5>
</div>
{% render_custom_fields form %} {% render_custom_fields form %}
</div> </div>

View File

@ -1,27 +1,23 @@
{% load form_helpers %} {% load form_helpers %}
<div class="card">
<h5 class="card-header">Cable</h5> {% render_field form.status %}
<div class="card-body"> {% render_field form.type %}
{% render_field form.status %} {% render_field form.label %}
{% render_field form.type %} {% render_field form.color %}
{% render_field form.label %} <div class="row mb-3">
{% render_field form.color %} <label class="col-sm-3 col-form-label text-lg-end">{{ form.length.label }}</label>
<div class="row mb-3"> <div class="col-md-5">
<label class="col-sm-3 col-form-label text-lg-end">{{ form.length.label }}</label> {{ form.length }}
<div class="col-md-5">
{{ form.length }}
</div>
<div class="col-md-4">
{{ form.length_unit }}
</div>
<div class="invalid-feedback"></div>
</div>
{% render_field form.tags %}
{% if form.custom_fields %}
<div class="field-group">
<h4>Custom Fields</h4>
{% render_custom_fields form %}
</div>
{% endif %}
</div> </div>
<div class="col-md-4">
{{ form.length_unit }}
</div>
<div class="invalid-feedback"></div>
</div> </div>
{% render_field form.tags %}
{% if form.custom_fields %}
<div class="field-group">
<h4>Custom Fields</h4>
{% render_custom_fields form %}
</div>
{% endif %}

View File

@ -3,30 +3,34 @@
{% block form %} {% block form %}
<div class="field-group"> <div class="field-group">
<h4 class="mb-3">Interface</h4> <div class="row mb-2">
{% if form.instance.device %} <h5 class="offset-sm-3">Interface</h5>
<div class="row mb-3"> </div>
<label class="col-sm-3 col-form-label text-lg-end required" for="id_device">Device</label> {% if form.instance.device %}
<div class="col"> <div class="row mb-3">
<input class="form-control" value="{{ form.instance.device }}" disabled /> <label class="col-sm-3 col-form-label text-lg-end required" for="id_device">Device</label>
</div> <div class="col">
<input class="form-control" value="{{ form.instance.device }}" disabled />
</div> </div>
{% endif %} </div>
{% endif %}
{% render_field form.name %} {% render_field form.name %}
{% render_field form.label %} {% render_field form.label %}
{% render_field form.type %} {% render_field form.type %}
{% render_field form.enabled %}
{% render_field form.parent %} {% render_field form.parent %}
{% render_field form.lag %} {% render_field form.lag %}
{% render_field form.mac_address %} {% render_field form.mac_address %}
{% render_field form.mtu %} {% render_field form.mtu %}
{% render_field form.mgmt_only %}
{% render_field form.mark_connected %}
{% render_field form.description %} {% render_field form.description %}
{% render_field form.tags %} {% render_field form.tags %}
{% render_field form.enabled %}
{% render_field form.mgmt_only %}
{% render_field form.mark_connected %}
</div> </div>
<div class="field-group"> <div class="field-group">
<h4 class="mb-3">802.1Q Switching</h4> <div class="row mb-2">
<h5 class="offset-sm-3">802.1Q Switching</h5>
</div>
{% render_field form.mode %} {% render_field form.mode %}
{% render_field form.vlan_group %} {% render_field form.vlan_group %}
{% render_field form.untagged_vlan %} {% render_field form.untagged_vlan %}
@ -34,7 +38,9 @@
</div> </div>
{% if form.custom_fields %} {% if form.custom_fields %}
<div class="field-group"> <div class="field-group">
<h4 class="mb-3">Custom Fields</h4> <div class="row mb-2">
<h5 class="offset-sm-3">Custom Fields</h5>
</div>
{% render_custom_fields form %} {% render_custom_fields form %}
</div> </div>
{% endif %} {% endif %}

View File

@ -3,7 +3,9 @@
{% block form %} {% block form %}
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Rack</h5> <div class="row mb-2">
<h5 class="offset-sm-3">Rack</h5>
</div>
{% render_field form.region %} {% render_field form.region %}
{% render_field form.site_group %} {% render_field form.site_group %}
{% render_field form.site %} {% render_field form.site %}
@ -14,18 +16,24 @@
{% render_field form.tags %} {% render_field form.tags %}
</div> </div>
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Inventory Control</h5> <div class="row mb-2">
<h5 class="offset-sm-3">Inventory Control</h5>
</div>
{% render_field form.facility_id %} {% render_field form.facility_id %}
{% render_field form.serial %} {% render_field form.serial %}
{% render_field form.asset_tag %} {% render_field form.asset_tag %}
</div> </div>
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Tenancy</h5> <div class="row mb-2">
<h5 class="offset-sm-3">Tenancy</h5>
</div>
{% render_field form.tenant_group %} {% render_field form.tenant_group %}
{% render_field form.tenant %} {% render_field form.tenant %}
</div> </div>
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Dimensions</h5> <div class="row mb-2">
<h5 class="offset-sm-3">Dimensions</h5>
</div>
{% render_field form.type %} {% render_field form.type %}
{% render_field form.width %} {% render_field form.width %}
{% render_field form.u_height %} {% render_field form.u_height %}
@ -48,7 +56,9 @@
</div> </div>
{% if form.custom_fields %} {% if form.custom_fields %}
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Custom Fields</h5> <div class="row mb-2">
<h5 class="offset-sm-3">Custom Fields</h5>
</div>
{% render_custom_fields form %} {% render_custom_fields form %}
</div> </div>
{% endif %} {% endif %}

View File

@ -2,31 +2,31 @@
{% load form_helpers %} {% load form_helpers %}
{% block form %} {% block form %}
<div class="card"> <div class="field-group">
<h5 class="card-header">Virtual Chassis</h5> <div class="row mb-2">
<div class="card-body"> <h5 class="offset-sm-3">Virtual Chassis</h5>
{% render_field form.name %}
{% render_field form.domain %}
{% render_field form.tags %}
</div>
</div> </div>
<div class="card"> {% render_field form.name %}
<h5 class="card-header">Member Devices</h5> {% render_field form.domain %}
<div class="card-body"> {% render_field form.tags %}
{% render_field form.region %} </div>
{% render_field form.site_group %} <div class="field-group">
{% render_field form.site %} <div class="row mb-2">
{% render_field form.rack %} <h5 class="offset-sm-3">Member Devices</h5>
{% render_field form.members %}
{% render_field form.initial_position %}
</div>
</div> </div>
{% if form.custom_fields %} {% render_field form.region %}
<div class="card"> {% render_field form.site_group %}
<h5 class="card-header">Custom Fields</h5> {% render_field form.site %}
<div class="card-body"> {% render_field form.rack %}
{% render_custom_fields form %} {% render_field form.members %}
</div> {% render_field form.initial_position %}
</div> </div>
{% endif %} {% if form.custom_fields %}
<div class="field-group">
<div class="row mb-2">
<h5 class="offset-sm-3">Custom Fields</h5>
</div>
{% render_custom_fields form %}
</div>
{% endif %}
{% endblock %} {% endblock %}

View File

@ -2,89 +2,89 @@
{% load helpers %} {% load helpers %}
{% load form_helpers %} {% load form_helpers %}
{% block title %}{% if vc_form.instance %}Editing Virtual Chassis {{ vc_form.instance }}{% else %}New Virtual Chassis{% endif %}{% endblock %} {% block title %}Editing Virtual Chassis {{ vc_form.instance }}{% endblock %}
{% block content %} {% block content-wrapper %}
<form action="" method="post" enctype="multipart/form-data" class="form-object-edit"> <div class="tab-content">
<div class="tab-pane show active" id="edit-form" role="tabpanel" aria-labelledby="object-list-tab">
<form action="" method="post" enctype="multipart/form-data" class="form-object-edit">
{% csrf_token %} {% csrf_token %}
{{ pk_form.pk }} {{ pk_form.pk }}
{{ formset.management_form }} {{ formset.management_form }}
<div class="card"> <div class="field-group">
<h5 class="card-header">Virtual Chassis</h5> <div class="row mb-2">
<div class="card-body"> <h5 class="offset-sm-3">Virtual Chassis</h5>
{% render_field vc_form.name %} </div>
{% render_field vc_form.domain %} {% render_field vc_form.name %}
{% render_field vc_form.master %} {% render_field vc_form.domain %}
{% render_field vc_form.tags %} {% render_field vc_form.master %}
</div> {% render_field vc_form.tags %}
</div> </div>
{% if vc_form.custom_fields %} {% if vc_form.custom_fields %}
<div class="card"> <div class="field-group">
<h5 class="card-header">Custom Fields</h5> <div class="row mb-2">
<div class="card-body"> <h5 class="offset-sm-3">Custom Fields</h5>
{% render_custom_fields vc_form %}
</div>
</div> </div>
{% render_custom_fields vc_form %}
</div>
{% endif %} {% endif %}
<div class="card"> <div class="field-group mb-5">
<h5 class="card-header">Members</h5> <h5 class="text-center">Members</h5>
<div class="card-body"> <table class="table">
<table class="table"> <thead>
<thead> <tr>
<tr> <th>Device</th>
<th>Device</th> <th>ID</th>
<th>ID</th> <th>Rack/Unit</th>
<th>Rack/Unit</th> <th>Serial</th>
<th>Serial</th> <th>Position</th>
<th>Position</th> <th>Priority</th>
<th>Priority</th> <th></th>
<th></th> </tr>
</tr> </thead>
</thead> <tbody>
<tbody> {% for form in formset %}
{% for form in formset %} {% for field in form.hidden_fields %}
{% for field in form.hidden_fields %} {{ field }}
{{ field }} {% endfor %}
{% endfor %} {% with device=form.instance virtual_chassis=vc_form.instance %}
{% with device=form.instance virtual_chassis=vc_form.instance %} <tr>
<tr> <td>
<td> <a href="{{ device.get_absolute_url }}">{{ device }}</a>
<a href="{{ device.get_absolute_url }}">{{ device }}</a> </td>
</td> <td>{{ device.pk }}</td>
<td>{{ device.pk }}</td> <td>
<td> {% if device.rack %}
{% if device.rack %} {{ device.rack }} / {{ device.position }}
{{ device.rack }} / {{ device.position }} {% else %}
{% else %} <span class="text-muted">&mdash;</span>
<span class="text-muted">&mdash;</span> {% endif %}
{% endif %} </td>
</td> <td>{{ device.serial|placeholder }}</td>
<td>{{ device.serial|placeholder }}</td> <td>
<td> {{ form.vc_position }}
{{ form.vc_position }} {% if form.vc_position.errors %}
{% if form.vc_position.errors %} <br /><small class="text-danger">{{ form.vc_position.errors.0 }}</small>
<br /><small class="text-danger">{{ form.vc_position.errors.0 }}</small> {% endif %}
{% endif %} </td>
</td> <td>
<td> {{ form.vc_priority }}
{{ form.vc_priority }} {% if form.vc_priority.errors %}
{% if form.vc_priority.errors %} <br /><small class="text-danger">{{ form.vc_priority.errors.0 }}</small>
<br /><small class="text-danger">{{ form.vc_priority.errors.0 }}</small> {% endif %}
{% endif %} </td>
</td> <td>
<td> {% if virtual_chassis.pk %}
{% if virtual_chassis.pk %} <a href="{% url 'dcim:virtualchassis_remove_member' pk=device.pk %}?return_url={% url 'dcim:virtualchassis_edit' pk=virtual_chassis.pk %}" class="btn btn-danger btn-sm{% if virtual_chassis.master == device %} disabled{% endif %}">
<a href="{% url 'dcim:virtualchassis_remove_member' pk=device.pk %}?return_url={% url 'dcim:virtualchassis_edit' pk=virtual_chassis.pk %}" class="btn btn-danger btn-sm{% if virtual_chassis.master == device %} disabled{% endif %}"> <span class="mdi mdi-trash-can-outline" aria-hidden="true"></span>
<span class="mdi mdi-trash-can-outline" aria-hidden="true"></span> </a>
</a> {% endif %}
{% endif %} </td>
</td> </tr>
</tr> {% endwith %}
{% endwith %} {% endfor %}
{% endfor %} </tbody>
</tbody> </table>
</table>
</div>
</div> </div>
<div class="text-end"> <div class="text-end">
<a href="{{ return_url }}" class="btn btn-outline-danger">Cancel</a> <a href="{{ return_url }}" class="btn btn-outline-danger">Cancel</a>
@ -94,5 +94,7 @@
<button type="submit" name="_create" class="btn btn-primary">Create</button> <button type="submit" name="_create" class="btn btn-primary">Create</button>
{% endif %} {% endif %}
</div> </div>
</form> </form>
</div>
</div>
{% endblock %} {% endblock %}

View File

@ -43,7 +43,9 @@
{# Render grouped fields according to Form #} {# Render grouped fields according to Form #}
{% for group, fields in form.Meta.fieldsets %} {% for group, fields in form.Meta.fieldsets %}
<div class="field-group"> <div class="field-group">
<h5 class="text-center">{{ group }}</h5> <div class="row mb-2">
<h5 class="offset-sm-3">{{ group }}</h5>
</div>
{% for name in fields %} {% for name in fields %}
{% render_field form|getfield:name %} {% render_field form|getfield:name %}
{% endfor %} {% endfor %}
@ -52,7 +54,9 @@
{% if form.custom_fields %} {% if form.custom_fields %}
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Custom Fields</h5> <div class="row mb-1">
<h5 class="offset-sm-3">Custom Fields</h5>
</div>
{% render_custom_fields form %} {% render_custom_fields form %}
</div> </div>
{% endif %} {% endif %}
@ -66,7 +70,6 @@
{% else %} {% else %}
{# Render all fields in a single group #} {# Render all fields in a single group #}
<div class="field-group"> <div class="field-group">
<h5 class="text-center">{{ obj_type|capfirst }}</h5>
{% block form_fields %}{% render_form form %}{% endblock %} {% block form_fields %}{% render_form form %}{% endblock %}
</div> </div>
{% endif %} {% endif %}

View File

@ -9,67 +9,81 @@
{% block form %} {% block form %}
<div class="field-group"> <div class="field-group">
<h4 class="mb-3">IP Address</h4> <div class="row mb-2">
{% render_field form.address %} <h5 class="offset-sm-3">IP Address</h5>
{% render_field form.status %} </div>
{% render_field form.role %} {% render_field form.address %}
{% render_field form.vrf %} {% render_field form.status %}
{% render_field form.dns_name %} {% render_field form.role %}
{% render_field form.description %} {% render_field form.vrf %}
{% render_field form.tags %} {% render_field form.dns_name %}
{% render_field form.description %}
{% render_field form.tags %}
</div> </div>
<div class="field-group"> <div class="field-group">
<h4 class="mb-3">Tenancy</h4> <div class="row mb-2">
{% render_field form.tenant_group %} <h5 class="offset-sm-3">Tenancy</h5>
{% render_field form.tenant %} </div>
{% render_field form.tenant_group %}
{% render_field form.tenant %}
</div> </div>
<div class="field-group"> <div class="field-group">
<h4 class="mb-3">Interface Assignment</h4> <div class="row mb-2">
{% with vm_tab_active=form.initial.vminterface %} <h5 class="offset-sm-3">Interface Assignment</h5>
<ul class="nav nav-tabs" role="tablist"> </div>
<li role="presentation" class="nav-item"> {% with vm_tab_active=form.initial.vminterface %}
<button <div class="row mb-2">
role="tab" <div class="offset-sm-3">
type="button" <ul class="nav nav-pills" role="tablist">
id="device_tab" <li role="presentation" class="nav-item">
data-bs-toggle="tab" <button
aria-controls="device" role="tab"
data-bs-target="#device" type="button"
class="nav-link {% if not vm_tab_active %}active{% endif %}" id="device_tab"
> data-bs-toggle="tab"
Device aria-controls="device"
</button> data-bs-target="#device"
</li> class="nav-link {% if not vm_tab_active %}active{% endif %}"
<li role="presentation" class="nav-item"> >
<button Device
role="tab" </button>
type="button" </li>
id="vm_tab" <li role="presentation" class="nav-item">
data-bs-toggle="tab" <button
aria-controls="vm" role="tab"
data-bs-target="#vm" type="button"
class="nav-link {% if vm_tab_active %}active{% endif %}" id="vm_tab"
> data-bs-toggle="tab"
Virtual Machine aria-controls="vm"
</button> data-bs-target="#vm"
</li> class="nav-link {% if vm_tab_active %}active{% endif %}"
>
Virtual Machine
</button>
</li>
</ul> </ul>
<div class="tab-content"> </div>
<div class="tab-pane {% if not vm_tab_active %}active{% endif %}" id="device" role="tabpanel" aria-labeled-by="device_tab"> </div>
{% render_field form.device %} <div class="tab-content p-0">
{% render_field form.interface %} <div class="tab-pane {% if not vm_tab_active %}active{% endif %}" id="device" role="tabpanel" aria-labeled-by="device_tab">
</div> {% render_field form.device %}
<div class="tab-pane {% if vm_tab_active %}active{% endif %}" id="vm" role="tabpanel" aria-labeled-by="vm_tab"> {% render_field form.interface %}
{% render_field form.virtual_machine %} </div>
{% render_field form.vminterface %} <div class="tab-pane {% if vm_tab_active %}active{% endif %}" id="vm" role="tabpanel" aria-labeled-by="vm_tab">
</div> {% render_field form.virtual_machine %}
</div> {% render_field form.vminterface %}
{% endwith %} </div>
{% render_field form.primary_for_parent %} {% render_field form.primary_for_parent %}
</div>
{% endwith %}
</div> </div>
<div class="field-group"> <div class="field-group">
<h4 class="mb-3">NAT IP (Inside)</h4> <div class="row mb-2">
<ul class="nav nav-tabs" role="tablist"> <h5 class="offset-sm-3">NAT IP (Inside)</h5>
</div>
<div class="row mb-2">
<div class="offset-sm-3">
<ul class="nav nav-pills" role="tablist">
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button <button
role="tab" role="tab"
@ -109,29 +123,33 @@
By IP By IP
</button> </button>
</li> </li>
</ul> </ul>
<div class="tab-content">
<div class="tab-pane active" id="by_device" aria-labelledby="device_tab" role="tabpanel">
{% render_field form.nat_region %}
{% render_field form.nat_site_group %}
{% render_field form.nat_site %}
{% render_field form.nat_rack %}
{% render_field form.nat_device %}
</div>
<div class="tab-pane" id="by_vm" aria-labelledby="vm_tab" role="tabpanel">
{% render_field form.nat_cluster %}
{% render_field form.nat_virtual_machine %}
</div>
<div class="tab-pane" id="by_vrf" aria-labelledby="vrf_tab" role="tabpanel">
{% render_field form.nat_vrf %}
</div>
{% render_field form.nat_inside %}
</div> </div>
</div>
<div class="tab-content p-0">
<div class="tab-pane active" id="by_device" aria-labelledby="device_tab" role="tabpanel">
{% render_field form.nat_region %}
{% render_field form.nat_site_group %}
{% render_field form.nat_site %}
{% render_field form.nat_rack %}
{% render_field form.nat_device %}
</div>
<div class="tab-pane" id="by_vm" aria-labelledby="vm_tab" role="tabpanel">
{% render_field form.nat_cluster %}
{% render_field form.nat_virtual_machine %}
</div>
<div class="tab-pane" id="by_vrf" aria-labelledby="vrf_tab" role="tabpanel">
{% render_field form.nat_vrf %}
</div>
{% render_field form.nat_inside %}
</div>
</div> </div>
{% if form.custom_fields %} {% if form.custom_fields %}
<div class="field-group"> <div class="field-group">
<h4 class="mb-3">Custom Fields</h4> <div class="row mb-2">
{% render_custom_fields form %} <h5 class="offset-sm-3">Custom Fields</h5>
</div> </div>
{% render_custom_fields form %}
</div>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View File

@ -2,50 +2,49 @@
{% load form_helpers %} {% load form_helpers %}
{% block form %} {% block form %}
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Service</h5> <div class="row mb-2">
{% if obj.device %} <h5 class="offset-sm-3">Service</h5>
<div class="row mb-3">
<label class="col-sm-3 col-form-label text-lg-end">Device</label>
<div class="col">
<input class="form-control" value="{{ obj.device }}" disabled />
</div>
</div>
{% else %}
<div class="row mb-3">
<label class="col-sm-3 col-form-label text-lg-end">Virtual Machine</label>
<div class="col">
<input class="form-control" value="{{ obj.virtual_machine }}" disabled />
</div>
</div>
{% endif %}
{% render_field form.name %}
<div class="row">
<label class="col-sm-3 col-form-label text-lg-end">Port(s)</label>
<div class="col-2">
{{ form.protocol }}
</div>
<div class="col-7">
{{ form.ports }}
</div>
</div>
<div class="row mb-3">
<div class="col-3"></div>
<div class="col-9">
<span class="form-text">{{ form.ports.help_text }}</span>
</div>
</div>
{% render_field form.ipaddresses %}
{% render_field form.description %}
{% render_field form.tags %}
</div> </div>
{% if form.custom_fields %} {% if obj.device %}
<div class="card"> <div class="row mb-3">
<h5 class="card-header">Custom Fields</h5> <label class="col-sm-3 col-form-label text-lg-end">Device</label>
<div class="card-body"> <div class="col">
{% render_custom_fields form %} <input class="form-control" value="{{ obj.device }}" disabled />
</div>
</div>
{% else %}
<div class="row mb-3">
<label class="col-sm-3 col-form-label text-lg-end">Virtual Machine</label>
<div class="col">
<input class="form-control" value="{{ obj.virtual_machine }}" disabled />
</div> </div>
</div> </div>
{% endif %} {% endif %}
{% render_field form.name %}
<div class="row">
<label class="col-sm-3 col-form-label text-lg-end">Port(s)</label>
<div class="col-2">
{{ form.protocol }}
</div>
<div class="col-7">
{{ form.ports }}
</div>
</div>
<div class="row mb-3">
<div class="col-3"></div>
<div class="col-9">
<span class="form-text">{{ form.ports.help_text }}</span>
</div>
</div>
{% render_field form.ipaddresses %}
{% render_field form.description %}
{% render_field form.tags %}
</div>
{% if form.custom_fields %}
<div class="row mb-2">
<h5 class="offset-sm-3">Custom Fields</h5>
</div>
{% render_custom_fields form %}
{% endif %}
{% endblock %} {% endblock %}

View File

@ -4,48 +4,60 @@
{% load helpers %} {% load helpers %}
{% block form %} {% block form %}
<div class="field-group mb-3"> <div class="field-group mb-3">
<h5 class="text-center">VLAN</h5> <div class="row mb-2">
{% render_field form.vid %} <h5 class="offset-sm-3">VLAN</h5>
{% render_field form.name %}
{% render_field form.status %}
{% render_field form.role %}
{% render_field form.description %}
{% render_field form.tags %}
</div> </div>
<div class="field-group mb-3"> {% render_field form.vid %}
<h5 class="text-center">Tenancy</h5> {% render_field form.name %}
{% render_field form.tenant_group %} {% render_field form.status %}
{% render_field form.tenant %} {% render_field form.role %}
{% render_field form.description %}
{% render_field form.tags %}
</div>
<div class="field-group mb-3">
<div class="row mb-2">
<h5 class="offset-sm-3">Tenancy</h5>
</div> </div>
<div class="field-group mb-3"> {% render_field form.tenant_group %}
<h5 class="text-center">Assignment</h5> {% render_field form.tenant %}
{% with site_tab_active=form.initial.site %} </div>
<ul class="nav nav-tabs" role="tablist"> <div class="field-group mb-3">
<li class="nav-item" role="presentation"> <div class="row mb-2">
<a class="nav-link{% if not site_tab_active %} active{% endif %}" href="#group" role="tab" data-bs-toggle="tab">VLAN Group</a> <h5 class="offset-sm-3">Assignment</h5>
</li>
<li class="nav-item" role="presentation">
<a class="nav-link{% if site_tab_active %} active{% endif %}" href="#site" role="tab" data-bs-toggle="tab">Site</a>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane{% if not site_tab_active %} active{% endif %}" id="group">
{% render_field form.scope_type %}
{% render_field form.group %}
</div>
<div class="tab-pane{% if site_tab_active %} active{% endif %}" id="site">
{% render_field form.region %}
{% render_field form.sitegroup %}
{% render_field form.site %}
</div>
</div>
{% endwith %}
</div> </div>
{% if form.custom_fields %} {% with site_tab_active=form.initial.site %}
<div class="field-group"> <div class="row mb-2">
<h5 class="text-center">Custom Fields</h5> <div class="offset-sm-3">
{% render_custom_fields form %} <ul class="nav nav-pills" role="tablist">
<li class="nav-item" role="presentation">
<a class="nav-link{% if not site_tab_active %} active{% endif %}" href="#group" role="tab" data-bs-toggle="tab">VLAN Group</a>
</li>
<li class="nav-item" role="presentation">
<a class="nav-link{% if site_tab_active %} active{% endif %}" href="#site" role="tab" data-bs-toggle="tab">Site</a>
</li>
</ul>
</div> </div>
{% endif %} </div>
<div class="tab-content p-0">
<div class="tab-pane{% if not site_tab_active %} active{% endif %}" id="group">
{% render_field form.scope_type %}
{% render_field form.group %}
</div>
<div class="tab-pane{% if site_tab_active %} active{% endif %}" id="site">
{% render_field form.region %}
{% render_field form.sitegroup %}
{% render_field form.site %}
</div>
</div>
{% endwith %}
</div>
{% if form.custom_fields %}
<div class="field-group">
<div class="row mb-2">
<h5 class="offset-sm-3">Custom Fields</h5>
</div>
{% render_custom_fields form %}
</div>
{% endif %}
{% endblock %} {% endblock %}

View File

@ -1,30 +0,0 @@
{% extends 'generic/object_edit.html' %}
{% load form_helpers %}
{% load helpers %}
{% block form %}
<div class="field-group">
<h5 class="text-center">VLAN Group</h5>
{% render_field form.name %}
{% render_field form.slug %}
{% render_field form.description %}
</div>
<div class="field-group">
<h5 class="text-center">Scope</h5>
{% render_field form.scope_type %}
{% render_field form.region %}
{% render_field form.sitegroup %}
{% render_field form.site %}
{% render_field form.location %}
{% render_field form.rack %}
{% render_field form.clustergroup %}
{% render_field form.cluster %}
</div>
{% if form.custom_fields %}
<div class="field-group">
<h5 class="text-center">Custom Fields</h5>
{% render_custom_fields form %}
</div>
{% endif %}
{% endblock %}

View File

@ -3,34 +3,39 @@
{% block form %} {% block form %}
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Interface</h5> <div class="row mb-2">
{% if form.instance.virtual_machine %} <h5 class="offset-sm-3">Interface</h5>
<div class="row mb-3"> </div>
<label class="col-sm-3 col-form-label text-lg-end required" for="id_device">Virtual Machine</label> {% if form.instance.virtual_machine %}
<div class="col"> <div class="row mb-3">
<input class="form-control" value="{{ form.instance.virtual_machine }}" disabled /> <label class="col-sm-3 col-form-label text-lg-end required" for="id_device">Virtual Machine</label>
</div> <div class="col">
</div> <input class="form-control" value="{{ form.instance.virtual_machine }}" disabled />
{% endif %} </div>
{% render_field form.name %} </div>
{% render_field form.enabled %} {% endif %}
{% render_field form.parent %} {% render_field form.name %}
{% render_field form.mac_address %} {% render_field form.enabled %}
{% render_field form.mtu %} {% render_field form.parent %}
{% render_field form.description %} {% render_field form.mac_address %}
{% render_field form.tags %} {% render_field form.mtu %}
{% render_field form.description %}
{% render_field form.tags %}
</div> </div>
<div class="field-group"> <div class="field-group">
<h5 class="text-center">802.1Q Switching</h5> <div class="row mb-2">
{% render_field form.mode %} <h5 class="offset-sm-3">802.1Q Switching</h5>
{% render_field form.vlan_group %} </div>
{% render_field form.untagged_vlan %} {% render_field form.mode %}
{% render_field form.tagged_vlans %} {% render_field form.vlan_group %}
{% render_field form.untagged_vlan %}
{% render_field form.tagged_vlans %}
</div> </div>
{% if form.custom_fields %} {% if form.custom_fields %}
<div class="field-group"> <div class="field-group">
<h5 class="text-center">Custom Fields</h5> <div class="row mb-2">
<h5 class="offset-sm-3">Custom Fields</h5>
</div>
{% render_custom_fields form %} {% render_custom_fields form %}
</div> </div>
{% endif %} {% endif %}