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

Merge branch 'feature' of https://github.com/netbox-community/netbox into feature

# Conflicts:
#	netbox/dcim/tables/template_code.py
#	netbox/netbox/forms.py
#	netbox/templates/dcim/cable_connect.html
#	netbox/templates/dcim/consoleport.html
#	netbox/templates/dcim/consoleserverport.html
#	netbox/templates/dcim/device.html
#	netbox/templates/dcim/device/base.html
#	netbox/templates/dcim/device_edit.html
#	netbox/templates/dcim/interface.html
#	netbox/templates/dcim/rack.html
#	netbox/templates/dcim/rack_edit.html
#	netbox/templates/dcim/site.html
#	netbox/templates/extras/configcontext.html
#	netbox/templates/extras/objectchange.html
#	netbox/templates/generic/object.html
#	netbox/templates/inc/nav_menu.html
#	netbox/templates/ipam/ipaddress_edit.html
#	netbox/templates/ipam/vrf.html
#	netbox/utilities/templates/buttons/export.html
This commit is contained in:
checktheroads
2021-03-17 22:02:43 -07:00
197 changed files with 6374 additions and 2288 deletions

View File

@@ -27,6 +27,7 @@
</div>
</div>
{% render_field form.region %}
{% render_field form.site_group %}
{% render_field form.site %}
{% render_field form.mark_connected %}
</div>

View File

@@ -102,12 +102,12 @@
<tr{% if cablepath.pk == path.pk %} class="info"{% endif %}>
<td>
<a href="?cablepath_id={{ cablepath.pk }}">
{{ cablepath.origin.parent }} / {{ cablepath.origin }}
{{ cablepath.origin.parent_object }} / {{ cablepath.origin }}
</a>
</td>
<td>
{% if cablepath.destination %}
{{ cablepath.destination }} ({{ cablepath.destination.parent }})
{{ cablepath.destination }} ({{ cablepath.destination.parent_object }})
{% else %}
<span class="text-muted">Incomplete</span>
{% endif %}

View File

@@ -29,6 +29,10 @@
<th scope="row">Type</th>
<td>{{ object.get_type_display }}</td>
</tr>
<tr>
<th scope="row">Speed</th>
<td>{{ object.get_speed_display }}</td>
</tr>
<tr>
<th scope="row">Description</th>
<td>{{ object.description|placeholder }}</td>

View File

@@ -29,6 +29,10 @@
<th scope="row">Type</th>
<td>{{ object.get_type_display }}</td>
</tr>
<tr>
<td scope="row">Speed</td>
<td>{{ object.get_speed_display|placeholder }}</td>
</tr>
<tr>
<th scope="row">Description</th>
<td>{{ object.description|placeholder }}</td>

View File

@@ -19,21 +19,41 @@
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">Site</th>
<th scope="row">Region</th>
<td>
{% if object.site.region %}
<a href="{{ object.site.region.get_absolute_url }}">{{ object.site.region }}</a> /
{% for region in object.site.region.get_ancestors %}
<a href="{{ region.get_absolute_url }}">{{ region }}</a> /
{% endfor %}
<a href="{{ object.site.region.get_absolute_url }}">{{ object.site.region }}</a>
{% else %}
<span class="text-muted">None</span>
{% endif %}
<a href="{{ object.site.get_absolute_url }}">{{ object.site }}</a>
</td>
</tr>
<tr>
<th scope="row">Site</th>
<td>
<a href="{{ object.site.get_absolute_url }}">{{ object.site }}</a>
</td>
</tr>
<th scope="row">Location</th>
<td>
{% if object.location %}
{% for location in object.location.get_ancestors %}
<a href="{{ location.get_absolute_url }}">{{ location }}</a> /
{% endfor %}
<a href="{{ object.location.get_absolute_url }}">{{ object.location }}</a>
{% else %}
<span class="text-muted">None</span>
{% endif %}
</td>
</tr>
<tr>
<th scope="row">Rack</th>
<td>
{% if object.rack %}
{% if object.rack.group %}
<a href="{{ object.rack.group.get_absolute_url }}">{{ object.rack.group }}</a> /
{% endif %}
<a href="{% url 'dcim:rack' pk=object.rack.pk %}">{{ object.rack }}</a>
{% else %}
<span class="text-muted">None</span>

View File

@@ -1,6 +1,7 @@
{% extends 'generic/object.html' %}
{% load helpers %}
{% load perms %}
{% load custom_links %}
{% load plugins %}
{% block title %}{{ object.device }} / {{ object }}{% endblock %}

View File

@@ -20,8 +20,9 @@
<div class="field-group">
<h4>Location</h4>
{% render_field form.region %}
{% render_field form.site_group %}
{% render_field form.site %}
{% render_field form.rack_group %}
{% render_field form.location %}
{% render_field form.rack %}
{% if obj.device_type.is_child_device and obj.parent_bay %}
<div class="form-group">

View File

@@ -1,12 +1,12 @@
<td>
{% if termination.parent.provider %}
{% if termination.parent_object.provider %}
<i class="mdi mdi-lightning-bolt" title="Circuit"></i>
<a href="{{ termination.parent.get_absolute_url }}">
{{ termination.parent.provider }}
{{ termination.parent }}
<a href="{{ termination.parent_object.get_absolute_url }}">
{{ termination.parent_object.provider }}
{{ termination.parent_object }}
</a>
{% else %}
<a href="{{ termination.parent.get_absolute_url }}">{{ termination.parent }}</a>
<a href="{{ termination.parent_object.get_absolute_url }}">{{ termination.parent_object }}</a>
{% endif %}
</td>
<td>

View File

@@ -1,6 +1,6 @@
{% if path.destination_id %}
{% with endpoint=path.destination %}
<td><a href="{{ endpoint.parent.get_absolute_url }}">{{ endpoint.parent }}</a></td>
<td><a href="{{ endpoint.parent_object.get_absolute_url }}">{{ endpoint.parent_object }}</a></td>
<td><a href="{{ endpoint.get_absolute_url }}">{{ endpoint }}</a></td>
{% endwith %}
{% else %}

View File

@@ -1,6 +1,7 @@
{% extends 'dcim/device_component.html' %}
{% load helpers %}
{% load plugins %}
{% load render_table from django_tables2 %}
{% block content %}
<div class="row">
@@ -253,7 +254,23 @@
</div>
<div class="row">
<div class="col-md-12">
{% include 'panel_table.html' with table=ipaddress_table heading="IP Addresses" %}
<div class="panel panel-default">
<div class="panel-heading">
<strong>IP Addresses</strong>
</div>
{% if ipaddress_table.rows %}
{% render_table ipaddress_table 'inc/table.html' %}
{% else %}
<div class="panel-body text-muted">None</div>
{% endif %}
{% if perms.ipam.add_ipaddress %}
<div class="panel-footer text-right noprint">
<a href="{% url 'ipam:ipaddress_add' %}?device={{ object.device.pk }}&interface={{ object.pk }}" class="btn btn-xs btn-primary">
<span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add IP Address
</a>
</div>
{% endif %}
</div>
</div>
</div>
<div class="row">

View File

@@ -19,6 +19,7 @@
{% render_field form.label %}
{% render_field form.type %}
{% render_field form.enabled %}
{% render_field form.parent %}
{% render_field form.lag %}
{% render_field form.mac_address %}
{% render_field form.mtu %}

View File

@@ -5,8 +5,8 @@
{% block breadcrumbs %}
<li><a href="{% url 'dcim:powerpanel_list' %}">Power Panels</a></li>
<li><a href="{{ object.site.get_absolute_url }}">{{ object.site }}</a></li>
{% if object.rack_group %}
<li><a href="{{ object.rack_group.get_absolute_url }}">{{ object.rack_group }}</a></li>
{% if object.location %}
<li><a href="{{ object.location.get_absolute_url }}">{{ object.location }}</a></li>
{% endif %}
<li>{{ object }}</li>
{% endblock %}
@@ -26,10 +26,10 @@
</td>
</tr>
<tr>
<td>Rack Group</td>
<td>Location</td>
<td>
{% if object.rack_group %}
<a href="{{ object.rack_group.get_absolute_url }}">{{ object.rack_group }}</a>
{% if object.location %}
<a href="{{ object.location.get_absolute_url }}">{{ object.location }}</a>
{% else %}
<span class="text-muted">None</span>
{% endif %}

View File

@@ -65,7 +65,20 @@
{% endif %}
<a href="{{ object.site.get_absolute_url }}">{{ object.site }}</a>
</td>
</tr>
</tr>
<tr>
<th scope="row">Location</th>
<td>
{% if object.location %}
{% for location in object.location.get_ancestors %}
<a href="{{ location.get_absolute_url }}">{{ location }}</a> /
{% endfor %}
<a href="{{ object.location.get_absolute_url }}">{{ object.location }}</a>
{% else %}
<span class="text-muted">None</span>
{% endif %}
</td>
</tr>
<tr>
<th scope="row">Group</th>
<td>

View File

@@ -5,8 +5,9 @@
<div class="field-group">
<h4>Rack</h4>
{% render_field form.region %}
{% render_field form.site_group %}
{% render_field form.site %}
{% render_field form.group %}
{% render_field form.location %}
{% render_field form.name %}
{% render_field form.status %}
{% render_field form.role %}

View File

@@ -200,30 +200,24 @@
</div>
<div class="card">
<h5 class="card-header">
Rack Groups
Locations
</h5>
<div class='card-body'>
<table class="table table-hover">
{% for rg in rack_groups %}
{% for location in locations %}
<tr>
<td style="padding-left: {{ rg.level }}8px"><i class="mdi mdi-folder-open"></i> <a href="{{ rg.get_absolute_url }}">{{ rg }}</a></td>
<td>{{ rg.rack_count }}</td>
<td class="text-right noprint">
<a href="{% url 'dcim:rack_elevation_list' %}?group_id={{ rg.pk }}" class="btn btn-sm btn-primary" title="View elevations">
<td style="padding-left: {{ location.level }}8px">
<i class="mdi mdi-folder-open"></i>
<a href="{{ location.get_absolute_url }}">{{ location }}</a>
</td>
<td>{{ location.rack_count }}</td>
<td class="text-end noprint">
<a href="{% url 'dcim:rack_elevation_list' %}?location_id={{ location.pk }}" class="btn btn-sm btn-primary" title="View Elevations">
<i class="mdi mdi-server"></i>
</a>
</td>
</tr>
{% endfor %}
<tr>
<td><i class="mdi mdi-folder-open"></i> All racks</td>
<td>{{ stats.rack_count }}</td>
<td class="text-right noprint">
<a href="{% url 'dcim:rack_elevation_list' %}?site={{ object.slug }}" class="btn btn-sm btn-primary" title="View elevations">
<i class="mdi mdi-server"></i>
</a>
</td>
</tr>
</table>
</div>
</div>

View File

@@ -14,6 +14,7 @@
<div class="panel-heading"><strong>Member Devices</strong></div>
<div class="panel-body">
{% render_field form.region %}
{% render_field form.site_group %}
{% render_field form.site %}
{% render_field form.rack %}
{% render_field form.members %}

View File

@@ -15,6 +15,7 @@
<h5 class="card-header">Assignment</h5>
<div class="card-body">
{% render_field form.regions %}
{% render_field form.site_groups %}
{% render_field form.sites %}
{% render_field form.roles %}
{% render_field form.platforms %}

View File

@@ -0,0 +1,32 @@
{% extends base_template %}
{% load form_helpers %}
{% block title %}{{ block.super }} - Journal{% endblock %}
{% block content %}
{% if perms.extras.add_journalentry %}
<div class="panel panel-default">
<div class="panel-heading">
<strong>New Journal Entry</strong>
</div>
<form action="{% url 'extras:journalentry_add' %}" method="post" enctype="multipart/form-data" class="form form-horizontal">
{% csrf_token %}
{% for field in form.hidden_fields %}
{{ field }}
{% endfor %}
<div class="row panel-body">
<div class="col-md-10">
{% render_field form.kind %}
{% render_field form.comments %}
</div>
<div class="col-md-9 col-md-offset-3">
<button type="submit" class="btn btn-primary">Save</button>
<a href="{{ object.get_absolute_url }}" class="btn btn-default">Cancel</a>
</div>
</div>
</form>
</div>
{% endif %}
{% include 'panel_table.html' %}
{% include 'inc/paginator.html' with paginator=table.paginator page=table.page %}
{% endblock %}

View File

@@ -86,8 +86,8 @@
</div>
</div>
<div class="card">
<h5 class="card-header">
Difference
<div class="card-header">
<h5>Difference</h5>
<div class="btn-group btn-group-xs pull-right noprint">
<a {% if prev_change %}href="{% url 'extras:objectchange' pk=prev_change.pk %}"{% else %}disabled{% endif %} class="btn btn-default">
<span class="mdi mdi-chevron-left" aria-hidden="true"></span> Previous
@@ -96,7 +96,7 @@
Next <span class="mdi mdi-chevron-right" aria-hidden="true"></span>
</a>
</div>
</h5>
</div>
<div class="card-body">
{% if diff_added == diff_removed %}
<span class="text-muted" style="margin-left: 10px;">
@@ -115,17 +115,41 @@
</div>
</div>
</div>
<div class="col-md-7">
<div class="col-md-6">
<div class="card">
<h5 class="card-header">
Object Data
Pre-Change Data
</h5>
<div class="card-body">
<pre>{{ object.object_data|render_json }}</pre>
{% if object.prechange_data %}
<pre>{% for k, v in object.prechange_data.items %}{% spaceless %}
<span{% if k in diff_removed %} style="background-color: #ffdce0"{% endif %}>{{ k }}: {{ v|render_json }}</span>
{% endspaceless %}{% endfor %}
</pre>
{% else %}
<span class="text-muted">None</span>
{% endif %}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<h5 class="card-header">
Post-Change Data
</h5>
<div class="card-body">
{% if object.postchange_data %}
<pre>{% for k, v in object.postchange_data.items %}{% spaceless %}
<span{% if k in diff_added %} style="background-color: #cdffd8"{% endif %}>{{ k }}: {{ v|render_json }}</span>
{% endspaceless %}{% endfor %}
</pre>
{% else %}
<span class="text-muted">None</span>
{% endif %}
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
{% include 'panel_table.html' with table=related_changes_table heading='Related Changes' panel_class='default' %}

View File

@@ -41,13 +41,25 @@
<li class="nav-item" role="presentation">
<a class="nav-link{% if not active_tab %} active{% endif %}" href="{{ object.get_absolute_url }}">{{ object|meta:"verbose_name"|bettertitle }}</a>
</li>
{% if perms.extras.view_objectchange %}
<li class="nav-item" role="presentation">
{# TODO: Fix changelog URL resolution hack #}
<a class="nav-link{% if active_tab == 'changelog' %} active{% endif %}" href="{{ object.get_absolute_url }}changelog/">Change Log</a>
</li>
{% endif %}
{% endblock %}
{% if perms.extras.view_journalentry %}
{% with journal_viewname=object|viewname:'journal' %}
{% url journal_viewname pk=object.pk as journal_url %}
{% if journal_url %}
<li role="presentation" class="nav-item">
<a href="{{ journal_url }}" class="nav-link{% if active_tab == 'journal'%} active{% endif %}">Journal</a>
</li>
{% endif %}
{% endwith %}
{% endif %}
{% if perms.extras.view_objectchange %}
{% with changelog_viewname=object|viewname:'changelog' %}
{% url changelog_viewname pk=object.pk as changelog_url %}
<li role="presentation" class="nav-item">
<a href="{{ changelog_url }}" class="nav-link{% if active_tab == 'changelog'%} active{% endif %}">Change Log</a>
</li>
{% endwith %}
{% endif %}
</ul>
{% endblock %}

View File

@@ -45,9 +45,20 @@
</div>
{% endif %}
</li>
<li class="dropdown-item{% if not perms.dcim.view_sitegroup %} disabled{% endif %}">
<a class="text-decoration-none" href="{% url 'dcim:sitegroup_list' %}">Site Groups</a>
{% if perms.dcim.add_sitegroup %}
<div class="btn-group btn-group-sm float-end">
<a href="{% url 'dcim:sitegroup_add' %}" class="btn btn-sm btn-success" title="Add">
<i class="bi bi-plus"></i>
</a>
<a href="{% url 'dcim:sitegroup_import' %}" class="btn btn-sm btn-info" title="Import">
<i class="bi-download fs-6"></i>
</a>
</div>
{% endif %}
</li>
<li><hr class="dropdown-divider"></li>
<li class="dropdown-header">Racks</li>
<li class="dropdown-item dropdown-item-btns {% if not perms.dcim.view_rack %}disabled{% endif %}">
<a class="text-decoration-none" href="{% url 'dcim:rack_list' %}">Racks</a>
@@ -63,14 +74,14 @@
{% endif %}
</li>
<li class="dropdown-item dropdown-item-btns {% if not perms.dcim.view_rackgroup %}disabled{% endif %}">
<a class="text-decoration-none" href="{% url 'dcim:rackgroup_list' %}">Rack Groups</a>
{% if perms.dcim.add_rackgroup %}
<li class="dropdown-item dropdown-item-btns {% if not perms.dcim.view_location %}disabled{% endif %}">
<a class="text-decoration-none" href="{% url 'dcim:location_list' %}">Locations</a>
{% if perms.dcim.add_location %}
<div class="btn-group btn-group-sm float-end">
<a href="{% url 'dcim:rackgroup_add' %}" class="btn btn-sm btn-success" title="Add">
<a href="{% url 'dcim:location_add' %}" class="btn btn-sm btn-success" title="Add">
<i class="bi-plus fs-6"></i>
</a>
<a href="{% url 'dcim:rackgroup_import' %}" class="btn btn-sm btn-info" title="Import">
<a href="{% url 'dcim:location_import' %}" class="btn btn-sm btn-info" title="Import">
<i class="bi-download fs-6"></i>
</a>
</div>
@@ -553,6 +564,9 @@
<a a class="nav-link dropdown-toggle" href="#" id="other" role="button" data-bs-toggle="dropdown" aria-expanded="false">Other</a>
<ul class="dropdown-menu">
<li class="dropdown-header">Logging</li>
<li{% if not perms.extras.view_journalentry %} class="disabled"{% endif %}>
<a href="{% url 'extras:journalentry_list' %}">Journal Entries</a>
</li>
<li{% if not perms.extras.view_objectchange %} class="disabled"{% endif %}>
<a href="{% url 'extras:objectchange_list' %}">Change Log</a>
</li>

View File

@@ -113,6 +113,7 @@
<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 %}

View File

@@ -0,0 +1,57 @@
{% extends 'generic/object_edit.html' %}
{% load static %}
{% load form_helpers %}
{% load helpers %}
{% block form %}
<div class="panel panel-default">
<div class="panel-heading"><strong>VLAN</strong></div>
<div class="panel-body">
{% render_field form.vid %}
{% render_field form.name %}
{% render_field form.status %}
{% render_field form.role %}
{% render_field form.description %}
{% render_field form.tags %}
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading"><strong>Tenancy</strong></div>
<div class="panel-body">
{% render_field form.tenant_group %}
{% render_field form.tenant %}
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<strong>Assignment</strong>
</div>
<div class="panel-body">
{% with site_tab_active=form.initial.site %}
<ul class="nav nav-tabs" role="tablist">
<li role="presentation"{% if not site_tab_active %} class="active"{% endif %}><a href="#group" role="tab" data-toggle="tab">VLAN Group</a></li>
<li role="presentation"{% if site_tab_active %} class="active"{% endif %}><a href="#site" role="tab" data-toggle="tab">Site</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane{% if not vm_tab_active %} active{% endif %}" id="group">
{% render_field form.scope_type %}
{% render_field form.group %}
</div>
<div class="tab-pane{% if vm_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 %}
<div class="panel panel-default">
<div class="panel-heading"><strong>Custom Fields</strong></div>
<div class="panel-body">
{% render_custom_fields form %}
</div>
</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,49 @@
{% extends 'generic/object_edit.html' %}
{% load form_helpers %}
{% load helpers %}
{% block form %}
<div class="panel panel-default">
<div class="panel-heading"><strong>VLAN Group</strong></div>
<div class="panel-body">
{% render_field form.name %}
{% render_field form.slug %}
{% render_field form.description %}
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<strong>Scope</strong>
</div>
<div class="panel-body">
{% with virtual_tab_active=form.initial.cluster %}
<ul class="nav nav-tabs" role="tablist">
<li role="presentation"{% if not virtual_tab_active %} class="active"{% endif %}><a href="#physical" role="tab" data-toggle="tab">Physical</a></li>
<li role="presentation"{% if virtual_tab_active %} class="active"{% endif %}><a href="#virtual" role="tab" data-toggle="tab">Virtual</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane{% if not virtual_tab_active %} active{% endif %}" id="physical">
{% render_field form.region %}
{% render_field form.site_group %}
{% render_field form.site %}
{% render_field form.location %}
{% render_field form.rack %}
</div>
<div class="tab-pane{% if virtual_tab_active %} active{% endif %}" id="virtual">
{% render_field form.cluster_group %}
{% render_field form.cluster %}
</div>
</div>
<span class="help-block">The VLAN group will be limited in scope to the most-specific object selected above.</span>
{% endwith %}
</div>
</div>
{% if form.custom_fields %}
<div class="panel panel-default">
<div class="panel-heading"><strong>Custom Fields</strong></div>
<div class="panel-body">
{% render_custom_fields form %}
</div>
</div>
{% endif %}
{% endblock %}

View File

@@ -30,11 +30,11 @@
</td>
</tr>
<tr>
<td>Route Distinguisher</td>
<th scope="row">Route Distinguisher</th>
<td><code>{{ object.rd }}</code></td>
</tr>
<tr>
<td>Tenant</td>
<th scope="row">Tenant</th>
<td>
{% if object.tenant %}
<a href="{{ object.tenant.get_absolute_url }}">{{ object.tenant }}</a>
@@ -44,15 +44,21 @@
</td>
</tr>
<tr>
<td>Description</td>
<th scope="row">Description</th>
<td>{{ object.description|placeholder }}</td>
</tr>
<tr>
<td>Prefixes</td>
<th scope="row">Prefixes</th>
<td>
<a href="{% url 'ipam:prefix_list' %}?vrf_id={{ object.pk }}">{{ prefix_count }}</a>
</td>
</tr>
<tr>
<th scope="row">IP Addresses</th>
<td>
<a href="{% url 'ipam:ipaddress_list' %}?vrf_id={{ object.pk }}">{{ ipaddress_count }}</a>
</td>
</tr>
</table>
</div>
</div>

View File

@@ -1,6 +1,7 @@
{% extends 'generic/object.html' %}
{% load helpers %}
{% load plugins %}
{% load render_table from django_tables2 %}
{% block title %}{{ object.virtual_machine }} / {{ object.name }}{% endblock %}
@@ -56,16 +57,33 @@
</tr>
</table>
</div>
{% plugin_left_page object %}
{% plugin_left_page object %}
</div>
<div class="col-md-6">
{% include 'inc/custom_fields_panel.html' %}
{% include 'extras/inc/tags_panel.html' with tags=object.tags.all %}
{% plugin_right_page object %}
</div>
</div>
<div class="row">
<div class="col-md-12">
{% include 'panel_table.html' with table=ipaddress_table heading="IP Addresses" %}
<div class="panel panel-default">
<div class="panel-heading">
<strong>IP Addresses</strong>
</div>
{% if ipaddress_table.rows %}
{% render_table ipaddress_table 'inc/table.html' %}
{% else %}
<div class="panel-body text-muted">None</div>
{% endif %}
{% if perms.ipam.add_ipaddress %}
<div class="panel-footer text-right noprint">
<a href="{% url 'ipam:ipaddress_add' %}?virtual_machine={{ object.virtual_machine.pk }}&vminterface={{ object.pk }}" class="btn btn-xs btn-primary">
<span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add IP Address
</a>
</div>
{% endif %}
</div>
</div>
</div>
<div class="row">

View File

@@ -31,6 +31,14 @@
{% render_field form.tagged_vlans %}
</div>
</div>
{% if form.custom_fields %}
<div class="panel panel-default">
<div class="panel-heading"><strong>Custom Fields</strong></div>
<div class="panel-body">
{% render_custom_fields form %}
</div>
</div>
{% endif %}
{% endblock %}
{% block buttons %}