Merge branch 'develop' into develop-2.6

This commit is contained in:
Jeremy Stretch 2019-03-11 21:01:18 -04:00
commit 0b95016e00
103 changed files with 308 additions and 213 deletions

View File

@ -30,20 +30,33 @@ to now use "Extras | Tag."
--- ---
v2.5.8 (FUTURE) v2.5.8 (2019-03-11)
## Enhancements
* [#2435](https://github.com/digitalocean/netbox/issues/2435) - Printer friendly CSS
## Bug Fixes ## Bug Fixes
* [#2065](https://github.com/digitalocean/netbox/issues/2065) - Correct documentation for VM interface serializer
* [#2705](https://github.com/digitalocean/netbox/issues/2705) - Fix endpoint grouping in API docs * [#2705](https://github.com/digitalocean/netbox/issues/2705) - Fix endpoint grouping in API docs
* [#2781](https://github.com/digitalocean/netbox/issues/2781) - Fix filtering of sites/devices/VMs by multiple regions * [#2781](https://github.com/digitalocean/netbox/issues/2781) - Fix filtering of sites/devices/VMs by multiple regions
* [#2923](https://github.com/digitalocean/netbox/issues/2923) - Provider filter form's site field should be blank by default * [#2923](https://github.com/digitalocean/netbox/issues/2923) - Provider filter form's site field should be blank by default
* [#2938](https://github.com/digitalocean/netbox/issues/2938) - Enforce deterministic ordering of device components returned by API * [#2938](https://github.com/digitalocean/netbox/issues/2938) - Enforce deterministic ordering of device components returned by API
* [#2939](https://github.com/digitalocean/netbox/issues/2939) - Exclude circuit terminations from API interface connections endpoint * [#2939](https://github.com/digitalocean/netbox/issues/2939) - Exclude circuit terminations from API interface connections endpoint
* [#2940](https://github.com/digitalocean/netbox/issues/2940) - Allow CSV import of prefixes/IPs to VRF without an RD assigned
* [#2944](https://github.com/digitalocean/netbox/issues/2944) - Record the deletion of an IP address in the changelog of its parent interface (if any)
* [#2952](https://github.com/digitalocean/netbox/issues/2952) - Added the `slug` field to the Tenant filter for use in the API and search function * [#2952](https://github.com/digitalocean/netbox/issues/2952) - Added the `slug` field to the Tenant filter for use in the API and search function
* [#2954](https://github.com/digitalocean/netbox/issues/2954) - Remove trailing slashes to fix root/template paths on Windows * [#2954](https://github.com/digitalocean/netbox/issues/2954) - Remove trailing slashes to fix root/template paths on Windows
* [#2961](https://github.com/digitalocean/netbox/issues/2961) - Prevent exception when exporting inventory items belonging to unnamed devices * [#2961](https://github.com/digitalocean/netbox/issues/2961) - Prevent exception when exporting inventory items belonging to unnamed devices
* [#2962](https://github.com/digitalocean/netbox/issues/2962) - Increase ExportTemplate `mime_type` field length * [#2962](https://github.com/digitalocean/netbox/issues/2962) - Increase ExportTemplate `mime_type` field length
* [#2966](https://github.com/digitalocean/netbox/issues/2966) - Accept `null` cable length_unit via API * [#2966](https://github.com/digitalocean/netbox/issues/2966) - Accept `null` cable length_unit via API
* [#2972](https://github.com/digitalocean/netbox/issues/2972) - Improve ContentTypeField serializer to elegantly handle invalid data
* [#2976](https://github.com/digitalocean/netbox/issues/2976) - Add delete button to tag view
* [#2980](https://github.com/digitalocean/netbox/issues/2980) - Improve rendering time for API docs
* [#2982](https://github.com/digitalocean/netbox/issues/2982) - Correct CSS class assignment on color picker
* [#2984](https://github.com/digitalocean/netbox/issues/2984) - Fix logging of unlabeled cable ID on cable deletion
* [#2985](https://github.com/digitalocean/netbox/issues/2985) - Fix pagination page length for rack elevations
--- ---

View File

@ -59,7 +59,7 @@ class CircuitTypeTable(BaseTable):
name = tables.LinkColumn() name = tables.LinkColumn()
circuit_count = tables.Column(verbose_name='Circuits') circuit_count = tables.Column(verbose_name='Circuits')
actions = tables.TemplateColumn( actions = tables.TemplateColumn(
template_code=CIRCUITTYPE_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='' template_code=CIRCUITTYPE_ACTIONS, attrs={'td': {'class': 'text-right noprint'}}, verbose_name=''
) )
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):

View File

@ -2550,16 +2550,15 @@ class Cable(ChangeLoggedModel):
('termination_b_type', 'termination_b_id'), ('termination_b_type', 'termination_b_id'),
) )
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Create an ID string for use by __str__(). We have to save a copy of pk since it's nullified after .delete()
# is called.
self.id_string = '#{}'.format(self.pk)
def __str__(self): def __str__(self):
return self.label or self.id_string if self.label:
return self.label
# Save a copy of the PK on the instance since it's nullified if .delete() is called
if not hasattr(self, 'id_string'):
self.id_string = '#{}'.format(self.pk)
return self.id_string
def get_absolute_url(self): def get_absolute_url(self):
return reverse('dcim:cable', args=[self.pk]) return reverse('dcim:cable', args=[self.pk])

View File

@ -196,7 +196,7 @@ class RegionTable(BaseTable):
slug = tables.Column(verbose_name='Slug') slug = tables.Column(verbose_name='Slug')
actions = tables.TemplateColumn( actions = tables.TemplateColumn(
template_code=REGION_ACTIONS, template_code=REGION_ACTIONS,
attrs={'td': {'class': 'text-right'}}, attrs={'td': {'class': 'text-right noprint'}},
verbose_name='' verbose_name=''
) )
@ -239,7 +239,7 @@ class RackGroupTable(BaseTable):
slug = tables.Column() slug = tables.Column()
actions = tables.TemplateColumn( actions = tables.TemplateColumn(
template_code=RACKGROUP_ACTIONS, template_code=RACKGROUP_ACTIONS,
attrs={'td': {'class': 'text-right'}}, attrs={'td': {'class': 'text-right noprint'}},
verbose_name='' verbose_name=''
) )
@ -258,7 +258,7 @@ class RackRoleTable(BaseTable):
rack_count = tables.Column(verbose_name='Racks') rack_count = tables.Column(verbose_name='Racks')
color = tables.TemplateColumn(COLOR_LABEL, verbose_name='Color') color = tables.TemplateColumn(COLOR_LABEL, verbose_name='Color')
slug = tables.Column(verbose_name='Slug') slug = tables.Column(verbose_name='Slug')
actions = tables.TemplateColumn(template_code=RACKROLE_ACTIONS, attrs={'td': {'class': 'text-right'}}, actions = tables.TemplateColumn(template_code=RACKROLE_ACTIONS, attrs={'td': {'class': 'text-right noprint'}},
verbose_name='') verbose_name='')
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
@ -309,7 +309,7 @@ class RackReservationTable(BaseTable):
rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')]) rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')])
unit_list = tables.Column(orderable=False, verbose_name='Units') unit_list = tables.Column(orderable=False, verbose_name='Units')
actions = tables.TemplateColumn( actions = tables.TemplateColumn(
template_code=RACKRESERVATION_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='' template_code=RACKRESERVATION_ACTIONS, attrs={'td': {'class': 'text-right noprint'}}, verbose_name=''
) )
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
@ -327,7 +327,7 @@ class ManufacturerTable(BaseTable):
devicetype_count = tables.Column(verbose_name='Device Types') devicetype_count = tables.Column(verbose_name='Device Types')
platform_count = tables.Column(verbose_name='Platforms') platform_count = tables.Column(verbose_name='Platforms')
slug = tables.Column(verbose_name='Slug') slug = tables.Column(verbose_name='Slug')
actions = tables.TemplateColumn(template_code=MANUFACTURER_ACTIONS, attrs={'td': {'class': 'text-right'}}, actions = tables.TemplateColumn(template_code=MANUFACTURER_ACTIONS, attrs={'td': {'class': 'text-right noprint'}},
verbose_name='') verbose_name='')
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
@ -463,7 +463,7 @@ class DeviceRoleTable(BaseTable):
slug = tables.Column(verbose_name='Slug') slug = tables.Column(verbose_name='Slug')
actions = tables.TemplateColumn( actions = tables.TemplateColumn(
template_code=DEVICEROLE_ACTIONS, template_code=DEVICEROLE_ACTIONS,
attrs={'td': {'class': 'text-right'}}, attrs={'td': {'class': 'text-right noprint'}},
verbose_name='' verbose_name=''
) )
@ -492,7 +492,7 @@ class PlatformTable(BaseTable):
) )
actions = tables.TemplateColumn( actions = tables.TemplateColumn(
template_code=PLATFORM_ACTIONS, template_code=PLATFORM_ACTIONS,
attrs={'td': {'class': 'text-right'}}, attrs={'td': {'class': 'text-right noprint'}},
verbose_name='' verbose_name=''
) )
@ -779,7 +779,7 @@ class VirtualChassisTable(BaseTable):
member_count = tables.Column(verbose_name='Members') member_count = tables.Column(verbose_name='Members')
actions = tables.TemplateColumn( actions = tables.TemplateColumn(
template_code=VIRTUALCHASSIS_ACTIONS, template_code=VIRTUALCHASSIS_ACTIONS,
attrs={'td': {'class': 'text-right'}}, attrs={'td': {'class': 'text-right noprint'}},
verbose_name='' verbose_name=''
) )

View File

@ -1,5 +1,6 @@
import re import re
from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.mixins import PermissionRequiredMixin
from django.core.paginator import EmptyPage, PageNotAnInteger from django.core.paginator import EmptyPage, PageNotAnInteger
@ -353,8 +354,9 @@ class RackElevationListView(View):
total_count = racks.count() total_count = racks.count()
# Pagination # Pagination
paginator = EnhancedPaginator(racks, 25) per_page = request.GET.get('per_page', settings.PAGINATE_COUNT)
page_number = request.GET.get('page', 1) page_number = request.GET.get('page', 1)
paginator = EnhancedPaginator(racks, per_page)
try: try:
page = paginator.page(page_number) page = paginator.page(page_number)
except PageNotAnInteger: except PageNotAnInteger:

View File

@ -70,7 +70,7 @@ class TagTable(BaseTable):
) )
actions = tables.TemplateColumn( actions = tables.TemplateColumn(
template_code=TAG_ACTIONS, template_code=TAG_ACTIONS,
attrs={'td': {'class': 'text-right'}}, attrs={'td': {'class': 'text-right noprint'}},
verbose_name='' verbose_name=''
) )
color = ColorColumn() color = ColorColumn()

View File

@ -349,11 +349,11 @@ class PrefixForm(BootstrapMixin, TenancyForm, CustomFieldForm):
class PrefixCSVForm(forms.ModelForm): class PrefixCSVForm(forms.ModelForm):
vrf = forms.ModelChoiceField( vrf = FlexibleModelChoiceField(
queryset=VRF.objects.all(), queryset=VRF.objects.all(),
required=False,
to_field_name='rd', to_field_name='rd',
help_text='Route distinguisher of parent VRF', required=False,
help_text='Route distinguisher of parent VRF (or {ID})',
error_messages={ error_messages={
'invalid_choice': 'VRF not found.', 'invalid_choice': 'VRF not found.',
} }
@ -764,11 +764,11 @@ class IPAddressBulkAddForm(BootstrapMixin, TenancyForm, CustomFieldForm):
class IPAddressCSVForm(forms.ModelForm): class IPAddressCSVForm(forms.ModelForm):
vrf = forms.ModelChoiceField( vrf = FlexibleModelChoiceField(
queryset=VRF.objects.all(), queryset=VRF.objects.all(),
required=False,
to_field_name='rd', to_field_name='rd',
help_text='Route distinguisher of the assigned VRF', required=False,
help_text='Route distinguisher of parent VRF (or {ID})',
error_messages={ error_messages={
'invalid_choice': 'VRF not found.', 'invalid_choice': 'VRF not found.',
} }

View File

@ -1,7 +1,7 @@
import netaddr import netaddr
from django.conf import settings from django.conf import settings
from django.contrib.contenttypes.fields import GenericRelation from django.contrib.contenttypes.fields import GenericRelation
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError, ObjectDoesNotExist
from django.core.validators import MaxValueValidator, MinValueValidator from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models from django.db import models
from django.db.models import Q from django.db.models import Q
@ -10,8 +10,9 @@ from django.urls import reverse
from taggit.managers import TaggableManager from taggit.managers import TaggableManager
from dcim.models import Interface from dcim.models import Interface
from extras.models import CustomFieldModel, TaggedItem from extras.models import CustomFieldModel, ObjectChange, TaggedItem
from utilities.models import ChangeLoggedModel from utilities.models import ChangeLoggedModel
from utilities.utils import serialize_object
from .constants import * from .constants import *
from .fields import IPNetworkField, IPAddressField from .fields import IPNetworkField, IPAddressField
from .querysets import PrefixQuerySet from .querysets import PrefixQuerySet
@ -629,6 +630,27 @@ class IPAddress(ChangeLoggedModel, CustomFieldModel):
self.family = self.address.version self.family = self.address.version
super().save(*args, **kwargs) super().save(*args, **kwargs)
def log_change(self, user, request_id, action):
"""
Include the connected Interface (if any).
"""
# It's possible that an IPAddress can be deleted _after_ its parent Interface, in which case trying to resolve
# the interface will raise DoesNotExist.
try:
parent_obj = self.interface
except ObjectDoesNotExist:
parent_obj = None
ObjectChange(
user=user,
request_id=request_id,
changed_object=self,
related_object=parent_obj,
action=action,
object_data=serialize_object(self)
).save()
def to_csv(self): def to_csv(self):
# Determine if this IP is primary for a Device # Determine if this IP is primary for a Device

View File

@ -203,7 +203,7 @@ class RIRTable(BaseTable):
name = tables.LinkColumn(verbose_name='Name') name = tables.LinkColumn(verbose_name='Name')
is_private = BooleanColumn(verbose_name='Private') is_private = BooleanColumn(verbose_name='Private')
aggregate_count = tables.Column(verbose_name='Aggregates') aggregate_count = tables.Column(verbose_name='Aggregates')
actions = tables.TemplateColumn(template_code=RIR_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='') actions = tables.TemplateColumn(template_code=RIR_ACTIONS, attrs={'td': {'class': 'text-right noprint'}}, verbose_name='')
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = RIR model = RIR
@ -288,7 +288,7 @@ class RoleTable(BaseTable):
orderable=False, orderable=False,
verbose_name='VLANs' verbose_name='VLANs'
) )
actions = tables.TemplateColumn(template_code=ROLE_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='') actions = tables.TemplateColumn(template_code=ROLE_ACTIONS, attrs={'td': {'class': 'text-right noprint'}}, verbose_name='')
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = Role model = Role
@ -392,7 +392,7 @@ class VLANGroupTable(BaseTable):
site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site') site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
vlan_count = tables.Column(verbose_name='VLANs') vlan_count = tables.Column(verbose_name='VLANs')
slug = tables.Column(verbose_name='Slug') slug = tables.Column(verbose_name='Slug')
actions = tables.TemplateColumn(template_code=VLANGROUP_ACTIONS, attrs={'td': {'class': 'text-right'}}, actions = tables.TemplateColumn(template_code=VLANGROUP_ACTIONS, attrs={'td': {'class': 'text-right noprint'}},
verbose_name='') verbose_name='')
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
@ -437,7 +437,7 @@ class VLANMemberTable(BaseTable):
) )
actions = tables.TemplateColumn( actions = tables.TemplateColumn(
template_code=VLAN_MEMBER_ACTIONS, template_code=VLAN_MEMBER_ACTIONS,
attrs={'td': {'class': 'text-right'}}, attrs={'td': {'class': 'text-right noprint'}},
verbose_name='' verbose_name=''
) )

View File

@ -316,6 +316,7 @@ SWAGGER_SETTINGS = {
'utilities.custom_inspectors.IdInFilterInspector', 'utilities.custom_inspectors.IdInFilterInspector',
'drf_yasg.inspectors.CoreAPICompatInspector', 'drf_yasg.inspectors.CoreAPICompatInspector',
], ],
'DEFAULT_MODEL_DEPTH': 1,
'DEFAULT_PAGINATOR_INSPECTORS': [ 'DEFAULT_PAGINATOR_INSPECTORS': [
'utilities.custom_inspectors.NullablePaginatorInspector', 'utilities.custom_inspectors.NullablePaginatorInspector',
'drf_yasg.inspectors.DjangoRestResponsePagination', 'drf_yasg.inspectors.DjangoRestResponsePagination',

View File

@ -49,6 +49,19 @@ footer p {
} }
} }
/* Printer friendly CSS class and various fixes for printing. */
@media print {
body {
padding-top: 0px;
}
a[href]:after {
content: none !important;
}
.noprint {
display: none !important;
}
}
/* Collapse the nav menu on displays less than 960px wide */ /* Collapse the nav menu on displays less than 960px wide */
@media (max-width: 959px) { @media (max-width: 959px) {
.navbar-header { .navbar-header {
@ -575,4 +588,4 @@ td .progress {
} }
textarea { textarea {
font-family: Consolas, Lucida Console, monospace; font-family: Consolas, Lucida Console, monospace;
} }

View File

@ -90,6 +90,10 @@ $(document).ready(function() {
// Assign color picker selection classes // Assign color picker selection classes
function colorPickerClassCopy(data, container) { function colorPickerClassCopy(data, container) {
if (data.element) { if (data.element) {
// Remove any existing color-selection classes
$(container).attr('class', function(i, c) {
return c.replace(/(^|\s)color-selection-\S+/g, '');
});
$(container).addClass($(data.element).attr("class")); $(container).addClass($(data.element).attr("class"));
} }
return data.text; return data.text;

View File

@ -23,7 +23,7 @@ class SecretRoleTable(BaseTable):
secret_count = tables.Column(verbose_name='Secrets') secret_count = tables.Column(verbose_name='Secrets')
slug = tables.Column(verbose_name='Slug') slug = tables.Column(verbose_name='Slug')
actions = tables.TemplateColumn( actions = tables.TemplateColumn(
template_code=SECRETROLE_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='' template_code=SECRETROLE_ACTIONS, attrs={'td': {'class': 'text-right noprint'}}, verbose_name=''
) )
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):

View File

@ -54,7 +54,7 @@
<div class="col-xs-4 text-center"> <div class="col-xs-4 text-center">
<p class="text-muted">{% now 'Y-m-d H:i:s T' %}</p> <p class="text-muted">{% now 'Y-m-d H:i:s T' %}</p>
</div> </div>
<div class="col-xs-4 text-right"> <div class="col-xs-4 text-right noprint">
<p class="text-muted"> <p class="text-muted">
<i class="fa fa-fw fa-book text-primary"></i> <a href="http://netbox.readthedocs.io/">Docs</a> &middot; <i class="fa fa-fw fa-book text-primary"></i> <a href="http://netbox.readthedocs.io/">Docs</a> &middot;
<i class="fa fa-fw fa-cloud text-primary"></i> <a href="{% url 'api_docs' %}">API</a> &middot; <i class="fa fa-fw fa-cloud text-primary"></i> <a href="{% url 'api_docs' %}">API</a> &middot;

View File

@ -4,7 +4,7 @@
{% block title %}{{ circuit }}{% endblock %} {% block title %}{{ circuit }}{% endblock %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'circuits:circuit_list' %}">Circuits</a></li> <li><a href="{% url 'circuits:circuit_list' %}">Circuits</a></li>
@ -25,7 +25,7 @@
</form> </form>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.circuits.change_circuit %} {% if perms.circuits.change_circuit %}
<a href="{% url 'circuits:circuit_edit' pk=circuit.pk %}" class="btn btn-warning"> <a href="{% url 'circuits:circuit_edit' pk=circuit.pk %}" class="btn btn-warning">
<span class="fa fa-pencil" aria-hidden="true"></span> <span class="fa fa-pencil" aria-hidden="true"></span>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.circuits.add_circuit %} {% if perms.circuits.add_circuit %}
{% add_button 'circuits:circuit_add' %} {% add_button 'circuits:circuit_add' %}
{% import_button 'circuits:circuit_import' %} {% import_button 'circuits:circuit_import' %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='circuits:circuit_bulk_edit' bulk_delete_url='circuits:circuit_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='circuits:circuit_bulk_edit' bulk_delete_url='circuits:circuit_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.circuits.add_circuittype %} {% if perms.circuits.add_circuittype %}
{% add_button 'circuits:circuittype_add' %} {% add_button 'circuits:circuittype_add' %}
{% import_button 'circuits:circuittype_import' %} {% import_button 'circuits:circuittype_import' %}

View File

@ -5,7 +5,7 @@
{% block title %}{{ provider }}{% endblock %} {% block title %}{{ provider }}{% endblock %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'circuits:provider_list' %}">Providers</a></li> <li><a href="{% url 'circuits:provider_list' %}">Providers</a></li>
@ -25,7 +25,7 @@
</form> </form>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if show_graphs %} {% if show_graphs %}
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#graphs_modal" data-obj="{{ provider.name }}" data-url="{% url 'circuits-api:provider-graphs' pk=provider.pk %}" title="Show graphs"> <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#graphs_modal" data-obj="{{ provider.name }}" data-url="{% url 'circuits-api:provider-graphs' pk=provider.pk %}" title="Show graphs">
<i class="fa fa-signal" aria-hidden="true"></i> <i class="fa fa-signal" aria-hidden="true"></i>
@ -172,7 +172,7 @@
{% endfor %} {% endfor %}
</table> </table>
{% if perms.circuits.add_circuit %} {% if perms.circuits.add_circuit %}
<div class="panel-footer text-right"> <div class="panel-footer text-right noprint">
<a href="{% url 'circuits:circuit_add' %}?provider={{ provider.pk }}" class="btn btn-xs btn-primary"> <a href="{% url 'circuits:circuit_add' %}?provider={{ provider.pk }}" class="btn btn-xs btn-primary">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add circuit <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add circuit
</a> </a>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.circuits.add_provider %} {% if perms.circuits.add_provider %}
{% add_button 'circuits:provider_add' %} {% add_button 'circuits:provider_add' %}
{% import_button 'circuits:provider_import' %} {% import_button 'circuits:provider_import' %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='circuits:provider_bulk_edit' bulk_delete_url='circuits:provider_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='circuits:provider_bulk_edit' bulk_delete_url='circuits:provider_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -2,7 +2,7 @@
{% load helpers %} {% load helpers %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-md-12"> <div class="col-md-12">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'dcim:cable_list' %}">Cables</a></li> <li><a href="{% url 'dcim:cable_list' %}">Cables</a></li>
@ -10,7 +10,7 @@
</ol> </ol>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.change_cable %} {% if perms.dcim.change_cable %}
<a href="{% url 'dcim:cable_edit' pk=cable.pk %}" class="btn btn-warning"> <a href="{% url 'dcim:cable_edit' pk=cable.pk %}" class="btn btn-warning">
<span class="fa fa-pencil" aria-hidden="true"></span> Edit this cable <span class="fa fa-pencil" aria-hidden="true"></span> Edit this cable

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.add_cable %} {% if perms.dcim.add_cable %}
{% import_button 'dcim:cable_import' %} {% import_button 'dcim:cable_import' %}
{% endif %} {% endif %}
@ -13,7 +13,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='dcim:cable_bulk_edit' bulk_delete_url='dcim:cable_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='dcim:cable_bulk_edit' bulk_delete_url='dcim:cable_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
</div> </div>
</div> </div>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% export_button content_type %} {% export_button content_type %}
</div> </div>
<h1>{% block title %}Console Connections{% endblock %}</h1> <h1>{% block title %}Console Connections{% endblock %}</h1>
@ -11,7 +11,7 @@
{% include 'responsive_table.html' %} {% include 'responsive_table.html' %}
{% include 'inc/paginator.html' with paginator=table.paginator page=table.page %} {% include 'inc/paginator.html' with paginator=table.paginator page=table.page %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
</div> </div>
</div> </div>

View File

@ -5,7 +5,7 @@
{% block title %}{{ device }}{% endblock %} {% block title %}{{ device }}{% endblock %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'dcim:site' slug=device.site.slug %}">{{ device.site }}</a></li> <li><a href="{% url 'dcim:site' slug=device.site.slug %}">{{ device.site }}</a></li>
@ -33,7 +33,7 @@
</form> </form>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.change_device %} {% if perms.dcim.change_device %}
<div class="btn-group"> <div class="btn-group">
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
@ -199,7 +199,7 @@
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
<div class="panel-footer text-right"> <div class="panel-footer text-right noprint">
{% if perms.dcim.change_virtualchassis %} {% if perms.dcim.change_virtualchassis %}
<a href="{% url 'dcim:virtualchassis_add_member' pk=device.virtual_chassis.pk %}?site={{ device.site.pk }}&rack={{ device.rack.pk }}&return_url={{ device.get_absolute_url }}" class="btn btn-primary btn-xs"> <a href="{% url 'dcim:virtualchassis_add_member' pk=device.virtual_chassis.pk %}?site={{ device.site.pk }}&rack={{ device.rack.pk }}&return_url={{ device.get_absolute_url }}" class="btn btn-primary btn-xs">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add Member <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add Member
@ -317,7 +317,7 @@
{% endfor %} {% endfor %}
</table> </table>
{% if perms.dcim.add_interface or perms.dcim.add_consoleport or perms.dcim.add_powerport %} {% if perms.dcim.add_interface or perms.dcim.add_consoleport or perms.dcim.add_powerport %}
<div class="panel-footer text-right"> <div class="panel-footer text-right noprint">
{% if perms.dcim.add_consoleport %} {% if perms.dcim.add_consoleport %}
<a href="{% url 'dcim:consoleport_add' pk=device.pk %}" class="btn btn-xs btn-primary"> <a href="{% url 'dcim:consoleport_add' pk=device.pk %}" class="btn btn-xs btn-primary">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add console port <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add console port
@ -352,7 +352,7 @@
<form id="secret_form"> <form id="secret_form">
{% csrf_token %} {% csrf_token %}
</form> </form>
<div class="panel-footer text-right"> <div class="panel-footer text-right noprint">
<a href="{% url 'dcim:device_addsecret' pk=device.pk %}" class="btn btn-xs btn-primary"> <a href="{% url 'dcim:device_addsecret' pk=device.pk %}" class="btn btn-xs btn-primary">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
Add secret Add secret
@ -377,7 +377,7 @@
</div> </div>
{% endif %} {% endif %}
{% if perms.ipam.add_service %} {% if perms.ipam.add_service %}
<div class="panel-footer text-right"> <div class="panel-footer text-right noprint">
<a href="{% url 'dcim:device_service_assign' device=device.pk %}" class="btn btn-xs btn-primary"> <a href="{% url 'dcim:device_service_assign' device=device.pk %}" class="btn btn-xs btn-primary">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Assign service <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Assign service
</a> </a>
@ -390,7 +390,7 @@
</div> </div>
{% include 'inc/image_attachments.html' with images=device.images.all %} {% include 'inc/image_attachments.html' with images=device.images.all %}
{% if perms.extras.add_imageattachment %} {% if perms.extras.add_imageattachment %}
<div class="panel-footer text-right"> <div class="panel-footer text-right noprint">
<a href="{% url 'dcim:device_add_image' object_id=device.pk %}" class="btn btn-primary btn-xs"> <a href="{% url 'dcim:device_add_image' object_id=device.pk %}" class="btn btn-primary btn-xs">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
Attach an image Attach an image
@ -398,7 +398,7 @@
</div> </div>
{% endif %} {% endif %}
</div> </div>
<div class="panel panel-default"> <div class="panel panel-default noprint">
<div class="panel-heading"> <div class="panel-heading">
<strong>Related Devices</strong> <strong>Related Devices</strong>
</div> </div>
@ -460,7 +460,7 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<div class="panel-footer"> <div class="panel-footer noprint">
{% if device_bays and perms.dcim.change_devicebay %} {% if device_bays and perms.dcim.change_devicebay %}
<button type="submit" name="_rename" formaction="{% url 'dcim:devicebay_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs"> <button type="submit" name="_rename" formaction="{% url 'dcim:devicebay_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename
@ -494,7 +494,7 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<strong>Interfaces</strong> <strong>Interfaces</strong>
<div class="pull-right"> <div class="pull-right noprint">
<button class="btn btn-default btn-xs toggle-ips" selected="selected"> <button class="btn btn-default btn-xs toggle-ips" selected="selected">
<span class="glyphicon glyphicon-check" aria-hidden="true"></span> Show IPs <span class="glyphicon glyphicon-check" aria-hidden="true"></span> Show IPs
</button> </button>
@ -522,7 +522,7 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<div class="panel-footer"> <div class="panel-footer noprint">
{% if interfaces and perms.dcim.change_interface %} {% if interfaces and perms.dcim.change_interface %}
<button type="submit" name="_rename" formaction="{% url 'dcim:interface_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs"> <button type="submit" name="_rename" formaction="{% url 'dcim:interface_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename
@ -583,7 +583,7 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<div class="panel-footer"> <div class="panel-footer noprint">
{% if consoleserverports and perms.dcim.change_consoleport %} {% if consoleserverports and perms.dcim.change_consoleport %}
<button type="submit" name="_rename" formaction="{% url 'dcim:consoleserverport_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs"> <button type="submit" name="_rename" formaction="{% url 'dcim:consoleserverport_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename
@ -639,7 +639,7 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<div class="panel-footer"> <div class="panel-footer noprint">
{% if poweroutlets and perms.dcim.change_powerport %} {% if poweroutlets and perms.dcim.change_powerport %}
<button type="submit" name="_rename" formaction="{% url 'dcim:poweroutlet_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs"> <button type="submit" name="_rename" formaction="{% url 'dcim:poweroutlet_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename
@ -696,7 +696,7 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<div class="panel-footer"> <div class="panel-footer noprint">
{% if front_ports and perms.dcim.change_frontport %} {% if front_ports and perms.dcim.change_frontport %}
<button type="submit" name="_rename" formaction="{% url 'dcim:frontport_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs"> <button type="submit" name="_rename" formaction="{% url 'dcim:frontport_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename
@ -753,7 +753,7 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<div class="panel-footer"> <div class="panel-footer noprint">
{% if rear_ports and perms.dcim.change_rearport %} {% if rear_ports and perms.dcim.change_rearport %}
<button type="submit" name="_rename" formaction="{% url 'dcim:rearport_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs"> <button type="submit" name="_rename" formaction="{% url 'dcim:rearport_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename

View File

@ -53,7 +53,7 @@
</tbody> </tbody>
</table> </table>
{% if perms.dcim.add_inventoryitem %} {% if perms.dcim.add_inventoryitem %}
<div class="panel-footer text-right"> <div class="panel-footer text-right noprint">
<a href="{% url 'dcim:inventoryitem_add' device=device.pk %}" class="btn btn-primary btn-xs"> <a href="{% url 'dcim:inventoryitem_add' device=device.pk %}" class="btn btn-primary btn-xs">
<span class="fa fa-plus" aria-hidden="true"></span> Add Inventory Item <span class="fa fa-plus" aria-hidden="true"></span> Add Inventory Item
</a> </a>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.add_device %} {% if perms.dcim.add_device %}
{% add_button 'dcim:device_add' %} {% add_button 'dcim:device_add' %}
{% import_button 'dcim:device_import' %} {% import_button 'dcim:device_import' %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'dcim/inc/device_table.html' with bulk_edit_url='dcim:device_bulk_edit' bulk_delete_url='dcim:device_bulk_delete' %} {% include 'dcim/inc/device_table.html' with bulk_edit_url='dcim:device_bulk_edit' bulk_delete_url='dcim:device_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.add_devicerole %} {% if perms.dcim.add_devicerole %}
{% add_button 'dcim:devicerole_add' %} {% add_button 'dcim:devicerole_add' %}
{% import_button 'dcim:devicerole_import' %} {% import_button 'dcim:devicerole_import' %}

View File

@ -4,7 +4,7 @@
{% block title %}{{ devicetype.manufacturer }} {{ devicetype.model }}{% endblock %} {% block title %}{{ devicetype.manufacturer }} {{ devicetype.model }}{% endblock %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-md-12"> <div class="col-md-12">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'dcim:devicetype_list' %}">Device Types</a></li> <li><a href="{% url 'dcim:devicetype_list' %}">Device Types</a></li>
@ -14,7 +14,7 @@
</div> </div>
</div> </div>
{% if perms.dcim.change_devicetype or perms.dcim.delete_devicetype %} {% if perms.dcim.change_devicetype or perms.dcim.delete_devicetype %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.change_devicetype %} {% if perms.dcim.change_devicetype %}
<div class="btn-group"> <div class="btn-group">
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.add_devicetype %} {% if perms.dcim.add_devicetype %}
{% add_button 'dcim:devicetype_add' %} {% add_button 'dcim:devicetype_add' %}
{% import_button 'dcim:devicetype_import' %} {% import_button 'dcim:devicetype_import' %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='dcim:devicetype_bulk_edit' bulk_delete_url='dcim:devicetype_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='dcim:devicetype_bulk_edit' bulk_delete_url='dcim:devicetype_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -34,7 +34,7 @@
{% endif %} {% endif %}
{# Actions #} {# Actions #}
<td class="text-right"> <td class="text-right noprint">
{% if cp.cable %} {% if cp.cable %}
{% include 'dcim/inc/cable_toggle_buttons.html' with cable=cp.cable %} {% include 'dcim/inc/cable_toggle_buttons.html' with cable=cp.cable %}
{% elif perms.dcim.add_cable %} {% elif perms.dcim.add_cable %}

View File

@ -43,7 +43,7 @@
{% endif %} {% endif %}
{# Actions #} {# Actions #}
<td class="text-right"> <td class="text-right noprint">
{% if csp.cable %} {% if csp.cable %}
{% include 'dcim/inc/cable_toggle_buttons.html' with cable=csp.cable %} {% include 'dcim/inc/cable_toggle_buttons.html' with cable=csp.cable %}
{% elif perms.dcim.add_cable %} {% elif perms.dcim.add_cable %}

View File

@ -40,8 +40,7 @@
<td colspan="2"></td> <td colspan="2"></td>
{% endif %} {% endif %}
{# Actions #} <td class="text-right noprint">
<td class="text-right">
{% if perms.dcim.change_devicebay %} {% if perms.dcim.change_devicebay %}
{% if devicebay.installed_device %} {% if devicebay.installed_device %}
<a href="{% url 'dcim:devicebay_depopulate' pk=devicebay.pk %}" class="btn btn-danger btn-xs"> <a href="{% url 'dcim:devicebay_depopulate' pk=devicebay.pk %}" class="btn btn-danger btn-xs">

View File

@ -6,7 +6,7 @@
<strong>{{ title }}</strong> <strong>{{ title }}</strong>
</div> </div>
{% include 'responsive_table.html' %} {% include 'responsive_table.html' %}
<div class="panel-footer"> <div class="panel-footer noprint">
{% if table.rows %} {% if table.rows %}
{% if edit_url %} {% if edit_url %}
<button type="submit" name="_edit" formaction="{% url edit_url pk=devicetype.pk %}?return_url={{ devicetype.get_absolute_url }}" class="btn btn-xs btn-warning"> <button type="submit" name="_edit" formaction="{% url edit_url pk=devicetype.pk %}?return_url={{ devicetype.get_absolute_url }}" class="btn btn-xs btn-warning">

View File

@ -54,7 +54,7 @@
{% endif %} {% endif %}
{# Actions #} {# Actions #}
<td class="text-right"> <td class="text-right noprint">
{% if frontport.cable %} {% if frontport.cable %}
{% include 'dcim/inc/cable_toggle_buttons.html' with cable=frontport.cable %} {% include 'dcim/inc/cable_toggle_buttons.html' with cable=frontport.cable %}
{% elif perms.dcim.add_cable %} {% elif perms.dcim.add_cable %}

View File

@ -134,7 +134,7 @@
{% endif %} {% endif %}
{# Buttons #} {# Buttons #}
<td class="text-right text-nowrap"> <td class="text-right text-nowrap noprint">
{% if show_graphs %} {% if show_graphs %}
{% if iface.connected_endpoint %} {% if iface.connected_endpoint %}
<button type="button" class="btn btn-primary btn-xs" data-toggle="modal" data-target="#graphs_modal" data-obj="{{ device.name }} - {{ iface.name }}" data-url="{% url 'dcim-api:interface-graphs' pk=iface.pk %}" title="Show graphs"> <button type="button" class="btn btn-primary btn-xs" data-toggle="modal" data-target="#graphs_modal" data-obj="{{ device.name }} - {{ iface.name }}" data-url="{% url 'dcim-api:interface-graphs' pk=iface.pk %}" title="Show graphs">
@ -231,7 +231,7 @@
</td> </td>
{# Buttons #} {# Buttons #}
<td class="text-right text-nowrap"> <td class="text-right text-nowrap noprint">
{% if perms.ipam.change_ipaddress %} {% if perms.ipam.change_ipaddress %}
<a href="{% url 'ipam:ipaddress_edit' pk=ip.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-info btn-xs"> <a href="{% url 'ipam:ipaddress_edit' pk=ip.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-info btn-xs">
<i class="glyphicon glyphicon-pencil" aria-hidden="true" title="Edit IP address"></i> <i class="glyphicon glyphicon-pencil" aria-hidden="true" title="Edit IP address"></i>

View File

@ -6,7 +6,7 @@
<td>{{ item.serial }}</td> <td>{{ item.serial }}</td>
<td>{{ item.asset_tag|default:"" }}</td> <td>{{ item.asset_tag|default:"" }}</td>
<td>{{ item.description }}</td> <td>{{ item.description }}</td>
<td class="text-right"> <td class="text-right noprint">
{% if perms.dcim.change_inventoryitem %} {% if perms.dcim.change_inventoryitem %}
<a href="{% url 'dcim:inventoryitem_edit' pk=item.pk %}" class="btn btn-xs btn-warning"><span class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a> <a href="{% url 'dcim:inventoryitem_edit' pk=item.pk %}" class="btn btn-xs btn-warning"><span class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a>
{% endif %} {% endif %}

View File

@ -43,7 +43,7 @@
{% endif %} {% endif %}
{# Actions #} {# Actions #}
<td class="text-right"> <td class="text-right noprint">
{% if po.cable %} {% if po.cable %}
{% include 'dcim/inc/cable_toggle_buttons.html' with cable=po.cable %} {% include 'dcim/inc/cable_toggle_buttons.html' with cable=po.cable %}
{% elif perms.dcim.add_cable %} {% elif perms.dcim.add_cable %}

View File

@ -34,7 +34,7 @@
{% endif %} {% endif %}
{# Actions #} {# Actions #}
<td class="text-right"> <td class="text-right noprint">
{% if pp.cable %} {% if pp.cable %}
{% include 'dcim/inc/cable_toggle_buttons.html' with cable=pp.cable %} {% include 'dcim/inc/cable_toggle_buttons.html' with cable=pp.cable %}
{% elif perms.dcim.add_cable %} {% elif perms.dcim.add_cable %}

View File

@ -53,7 +53,7 @@
{% endif %} {% endif %}
{# Actions #} {# Actions #}
<td class="text-right"> <td class="text-right noprint">
{% if rearport.cable %} {% if rearport.cable %}
{% include 'dcim/inc/cable_toggle_buttons.html' with cable=rearport.cable %} {% include 'dcim/inc/cable_toggle_buttons.html' with cable=rearport.cable %}
{% elif perms.dcim.add_cable %} {% elif perms.dcim.add_cable %}

View File

@ -2,7 +2,7 @@
{% load helpers %} {% load helpers %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-md-12"> <div class="col-md-12">
<ol class="breadcrumb"> <ol class="breadcrumb">
{% if interface.device %} {% if interface.device %}
@ -15,7 +15,7 @@
</ol> </ol>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.change_interface %} {% if perms.dcim.change_interface %}
<a href="{% if interface.device %}{% url 'dcim:interface_edit' pk=interface.pk %}{% else %}{% url 'virtualization:interface_edit' pk=interface.pk %}{% endif %}" class="btn btn-warning"> <a href="{% if interface.device %}{% url 'dcim:interface_edit' pk=interface.pk %}{% else %}{% url 'virtualization:interface_edit' pk=interface.pk %}{% endif %}" class="btn btn-warning">
<span class="fa fa-pencil" aria-hidden="true"></span> Edit this interface <span class="fa fa-pencil" aria-hidden="true"></span> Edit this interface

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% export_button content_type %} {% export_button content_type %}
</div> </div>
<h1>{% block title %}Interface Connections{% endblock %}</h1> <h1>{% block title %}Interface Connections{% endblock %}</h1>
@ -11,7 +11,7 @@
{% include 'responsive_table.html' %} {% include 'responsive_table.html' %}
{% include 'inc/paginator.html' with paginator=table.paginator page=table.page %} {% include 'inc/paginator.html' with paginator=table.paginator page=table.page %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
</div> </div>
</div> </div>

View File

@ -3,7 +3,7 @@
{% load helpers %} {% load helpers %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.add_devicetype %} {% if perms.dcim.add_devicetype %}
{% import_button 'dcim:inventoryitem_import' %} {% import_button 'dcim:inventoryitem_import' %}
{% endif %} {% endif %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='dcim:inventoryitem_bulk_edit' bulk_delete_url='dcim:inventoryitem_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='dcim:inventoryitem_bulk_edit' bulk_delete_url='dcim:inventoryitem_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
</div> </div>
</div> </div>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.add_manufacturer %} {% if perms.dcim.add_manufacturer %}
{% add_button 'dcim:manufacturer_add' %} {% add_button 'dcim:manufacturer_add' %}
{% import_button 'dcim:manufacturer_import' %} {% import_button 'dcim:manufacturer_import' %}

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.add_platform %} {% if perms.dcim.add_platform %}
{% add_button 'dcim:platform_add' %} {% add_button 'dcim:platform_add' %}
{% import_button 'dcim:platform_import' %} {% import_button 'dcim:platform_import' %}

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% export_button content_type %} {% export_button content_type %}
</div> </div>
<h1>{% block title %}Power Connections{% endblock %}</h1> <h1>{% block title %}Power Connections{% endblock %}</h1>
@ -11,7 +11,7 @@
{% include 'responsive_table.html' %} {% include 'responsive_table.html' %}
{% include 'inc/paginator.html' with paginator=table.paginator page=table.page %} {% include 'inc/paginator.html' with paginator=table.paginator page=table.page %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
</div> </div>
</div> </div>

View File

@ -2,7 +2,7 @@
{% load helpers %} {% load helpers %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'dcim:rack_list' %}">Racks</a></li> <li><a href="{% url 'dcim:rack_list' %}">Racks</a></li>
@ -23,7 +23,7 @@
</form> </form>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
<a {% if prev_rack %}href="{% url 'dcim:rack' pk=prev_rack.pk %}"{% else %}disabled="disabled"{% endif %} class="btn btn-primary"> <a {% if prev_rack %}href="{% url 'dcim:rack' pk=prev_rack.pk %}"{% else %}disabled="disabled"{% endif %} class="btn btn-primary">
<span class="fa fa-chevron-left" aria-hidden="true"></span> Previous Rack <span class="fa fa-chevron-left" aria-hidden="true"></span> Previous Rack
</a> </a>
@ -223,7 +223,7 @@
<div class="panel-body text-muted">None</div> <div class="panel-body text-muted">None</div>
{% endif %} {% endif %}
{% if perms.dcim.add_device %} {% if perms.dcim.add_device %}
<div class="panel-footer text-right"> <div class="panel-footer text-right noprint">
<a href="{% url 'dcim:device_add' %}?site={{ rack.site.pk }}&rack={{ rack.pk }}" class="btn btn-primary btn-xs"> <a href="{% url 'dcim:device_add' %}?site={{ rack.site.pk }}&rack={{ rack.pk }}" class="btn btn-primary btn-xs">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
Add a non-racked device Add a non-racked device
@ -237,7 +237,7 @@
</div> </div>
{% include 'inc/image_attachments.html' with images=rack.images.all %} {% include 'inc/image_attachments.html' with images=rack.images.all %}
{% if perms.extras.add_imageattachment %} {% if perms.extras.add_imageattachment %}
<div class="panel-footer text-right"> <div class="panel-footer text-right noprint">
<a href="{% url 'dcim:rack_add_image' object_id=rack.pk %}" class="btn btn-primary btn-xs"> <a href="{% url 'dcim:rack_add_image' object_id=rack.pk %}" class="btn btn-primary btn-xs">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
Attach an image Attach an image
@ -271,7 +271,7 @@
{{ resv.description }}<br /> {{ resv.description }}<br />
<small>{{ resv.user }} &middot; {{ resv.created }}</small> <small>{{ resv.user }} &middot; {{ resv.created }}</small>
</td> </td>
<td class="text-right"> <td class="text-right noprint">
{% if perms.dcim.change_rackreservation %} {% if perms.dcim.change_rackreservation %}
<a href="{% url 'dcim:rackreservation_edit' pk=resv.pk %}" class="btn btn-warning btn-xs" title="Edit reservation"> <a href="{% url 'dcim:rackreservation_edit' pk=resv.pk %}" class="btn btn-warning btn-xs" title="Edit reservation">
<i class="glyphicon glyphicon-pencil" aria-hidden="true"></i> <i class="glyphicon glyphicon-pencil" aria-hidden="true"></i>
@ -290,7 +290,7 @@
<div class="panel-body text-muted">None</div> <div class="panel-body text-muted">None</div>
{% endif %} {% endif %}
{% if perms.dcim.add_rackreservation %} {% if perms.dcim.add_rackreservation %}
<div class="panel-footer text-right"> <div class="panel-footer text-right noprint">
<a href="{% url 'dcim:rack_add_reservation' rack=rack.pk %}" class="btn btn-primary btn-xs"> <a href="{% url 'dcim:rack_add_reservation' rack=rack.pk %}" class="btn btn-primary btn-xs">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
Add a reservation Add a reservation

View File

@ -2,7 +2,7 @@
{% load helpers %} {% load helpers %}
{% block content %} {% block content %}
<div class="btn-group pull-right" role="group"> <div class="btn-group pull-right noprint" role="group">
<a href="{% url 'dcim:rack_elevation_list' %}{% querystring request face=0 %}" class="btn btn-default{% if request.GET.face != '1' %} active{% endif %}">Front</a> <a href="{% url 'dcim:rack_elevation_list' %}{% querystring request face=0 %}" class="btn btn-default{% if request.GET.face != '1' %} active{% endif %}">Front</a>
<a href="{% url 'dcim:rack_elevation_list' %}{% querystring request face=1 %}" class="btn btn-default{% if request.GET.face == '1' %} active{% endif %}">Rear</a> <a href="{% url 'dcim:rack_elevation_list' %}{% querystring request face=1 %}" class="btn btn-default{% if request.GET.face == '1' %} active{% endif %}">Rear</a>
</div> </div>
@ -38,7 +38,7 @@
<p>No racks found</p> <p>No racks found</p>
</div> </div>
{% endif %} {% endif %}
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
</div> </div>
</div> </div>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.add_rack %} {% if perms.dcim.add_rack %}
{% add_button 'dcim:rack_add' %} {% add_button 'dcim:rack_add' %}
{% import_button 'dcim:rack_import' %} {% import_button 'dcim:rack_import' %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='dcim:rack_bulk_edit' bulk_delete_url='dcim:rack_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='dcim:rack_bulk_edit' bulk_delete_url='dcim:rack_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.add_rackgroup %} {% if perms.dcim.add_rackgroup %}
{% add_button 'dcim:rackgroup_add' %} {% add_button 'dcim:rackgroup_add' %}
{% import_button 'dcim:rackgroup_import' %} {% import_button 'dcim:rackgroup_import' %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_delete_url='dcim:rackgroup_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_delete_url='dcim:rackgroup_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
</div> </div>
</div> </div>

View File

@ -7,7 +7,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='dcim:rackreservation_bulk_edit' bulk_delete_url='dcim:rackreservation_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='dcim:rackreservation_bulk_edit' bulk_delete_url='dcim:rackreservation_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
</div> </div>
</div> </div>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.add_rackrole %} {% if perms.dcim.add_rackrole %}
{% add_button 'dcim:rackrole_add' %} {% add_button 'dcim:rackrole_add' %}
{% import_button 'dcim:rackrole_import' %} {% import_button 'dcim:rackrole_import' %}

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.add_region %} {% if perms.dcim.add_region %}
{% add_button 'dcim:region_add' %} {% add_button 'dcim:region_add' %}
{% import_button 'dcim:region_import' %} {% import_button 'dcim:region_import' %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_delete_url='dcim:region_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_delete_url='dcim:region_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
</div> </div>
</div> </div>

View File

@ -4,7 +4,7 @@
{% load helpers %} {% load helpers %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'dcim:site_list' %}">Sites</a></li> <li><a href="{% url 'dcim:site_list' %}">Sites</a></li>
@ -30,7 +30,7 @@
</form> </form>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if show_graphs %} {% if show_graphs %}
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#graphs_modal" data-obj="{{ site.name }}" data-url="{% url 'dcim-api:site-graphs' pk=site.pk %}" title="Show graphs"> <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#graphs_modal" data-obj="{{ site.name }}" data-url="{% url 'dcim-api:site-graphs' pk=site.pk %}" title="Show graphs">
<i class="fa fa-signal" aria-hidden="true"></i> <i class="fa fa-signal" aria-hidden="true"></i>
@ -138,7 +138,7 @@
<td>Physical Address</td> <td>Physical Address</td>
<td> <td>
{% if site.physical_address %} {% if site.physical_address %}
<div class="pull-right"> <div class="pull-right noprint">
<a href="http://maps.google.com/?q={{ site.physical_address|oneline|urlencode }}" target="_blank" class="btn btn-primary btn-xs"> <a href="http://maps.google.com/?q={{ site.physical_address|oneline|urlencode }}" target="_blank" class="btn btn-primary btn-xs">
<i class="glyphicon glyphicon-map-marker"></i> Map it <i class="glyphicon glyphicon-map-marker"></i> Map it
</a> </a>
@ -157,7 +157,7 @@
<td>GPS Coordinates</td> <td>GPS Coordinates</td>
<td> <td>
{% if site.latitude and site.longitude %} {% if site.latitude and site.longitude %}
<div class="pull-right"> <div class="pull-right noprint">
<a href="http://maps.google.com/?q={{ site.latitude }},{{ site.longitude }}" target="_blank" class="btn btn-primary btn-xs"> <a href="http://maps.google.com/?q={{ site.latitude }},{{ site.longitude }}" target="_blank" class="btn btn-primary btn-xs">
<i class="glyphicon glyphicon-map-marker"></i> Map it <i class="glyphicon glyphicon-map-marker"></i> Map it
</a> </a>
@ -251,7 +251,7 @@
<tr> <tr>
<td><i class="fa fa-fw fa-folder-o"></i> <a href="{{ rg.get_absolute_url }}">{{ rg }}</a></td> <td><i class="fa fa-fw fa-folder-o"></i> <a href="{{ rg.get_absolute_url }}">{{ rg }}</a></td>
<td>{{ rg.rack_count }}</td> <td>{{ rg.rack_count }}</td>
<td class="text-right"> <td class="text-right noprint">
<a href="{% url 'dcim:rack_elevation_list' %}?group_id={{ rg.pk }}" class="btn btn-xs btn-primary" title="View elevations"> <a href="{% url 'dcim:rack_elevation_list' %}?group_id={{ rg.pk }}" class="btn btn-xs btn-primary" title="View elevations">
<i class="fa fa-eye"></i> <i class="fa fa-eye"></i>
</a> </a>
@ -271,7 +271,7 @@
</div> </div>
{% include 'inc/image_attachments.html' with images=site.images.all %} {% include 'inc/image_attachments.html' with images=site.images.all %}
{% if perms.extras.add_imageattachment %} {% if perms.extras.add_imageattachment %}
<div class="panel-footer text-right"> <div class="panel-footer text-right noprint">
<a href="{% url 'dcim:site_add_image' object_id=site.pk %}" class="btn btn-primary btn-xs"> <a href="{% url 'dcim:site_add_image' object_id=site.pk %}" class="btn btn-primary btn-xs">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
Attach an image Attach an image

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.dcim.add_site %} {% if perms.dcim.add_site %}
{% add_button 'dcim:site_add' %} {% add_button 'dcim:site_add' %}
{% import_button 'dcim:site_import' %} {% import_button 'dcim:site_import' %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='dcim:site_bulk_edit' %} {% include 'utilities/obj_table.html' with bulk_edit_url='dcim:site_bulk_edit' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -3,7 +3,7 @@
{% load helpers %} {% load helpers %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% export_button content_type %} {% export_button content_type %}
</div> </div>
<h1>{% block title %}Virtual Chassis{% endblock %}</h1> <h1>{% block title %}Virtual Chassis{% endblock %}</h1>
@ -11,7 +11,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' %} {% include 'utilities/obj_table.html' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -2,7 +2,7 @@
{% load helpers %} {% load helpers %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'extras:configcontext_list' %}">Config Contexts</a></li> <li><a href="{% url 'extras:configcontext_list' %}">Config Contexts</a></li>
@ -22,7 +22,7 @@
</form> </form>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.extras.change_configcontext %} {% if perms.extras.change_configcontext %}
<a href="{% url 'extras:configcontext_edit' pk=configcontext.pk %}" class="btn btn-warning"> <a href="{% url 'extras:configcontext_edit' pk=configcontext.pk %}" class="btn btn-warning">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.extras.add_configcontext %} {% if perms.extras.add_configcontext %}
{% add_button 'extras:configcontext_add' %} {% add_button 'extras:configcontext_add' %}
{% endif %} {% endif %}
@ -12,7 +12,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='extras:configcontext_bulk_edit' bulk_delete_url='extras:configcontext_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='extras:configcontext_bulk_edit' bulk_delete_url='extras:configcontext_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
</div> </div>
</div> </div>

View File

@ -4,7 +4,7 @@
{% block title %}{{ objectchange }}{% endblock %} {% block title %}{{ objectchange }}{% endblock %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'extras:objectchange_list' %}">Changelog</a></li> <li><a href="{% url 'extras:objectchange_list' %}">Changelog</a></li>
@ -97,7 +97,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
{% include 'panel_table.html' with table=related_changes_table heading='Related Changes' %} {% include 'panel_table.html' with table=related_changes_table heading='Related Changes' panel_class='noprint' %}
{% if related_changes_count > related_changes_table.rows|length %} {% if related_changes_count > related_changes_table.rows|length %}
<div class="pull-right"> <div class="pull-right">
<a href="{% url 'extras:objectchange_list' %}?request_id={{ objectchange.request_id }}" class="btn btn-primary">See all {{ related_changes_count|add:"1" }} changes</a> <a href="{% url 'extras:objectchange_list' %}?request_id={{ objectchange.request_id }}" class="btn btn-primary">See all {{ related_changes_count|add:"1" }} changes</a>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% export_button content_type %} {% export_button content_type %}
</div> </div>
<h1>{% block title %}Changelog{% endblock %}</h1> <h1>{% block title %}Changelog{% endblock %}</h1>
@ -10,7 +10,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' %} {% include 'utilities/obj_table.html' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
</div> </div>
</div> </div>

View File

@ -4,7 +4,7 @@
{% block title %}{{ report.name }}{% endblock %} {% block title %}{{ report.name }}{% endblock %}
{% block content %} {% block content %}
<div class="row"> <div class="row noprint">
<div class="col-md-12"> <div class="col-md-12">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'extras:report_list' %}">Reports</a></li> <li><a href="{% url 'extras:report_list' %}">Reports</a></li>
@ -14,7 +14,7 @@
</div> </div>
</div> </div>
{% if perms.extras.add_reportresult %} {% if perms.extras.add_reportresult %}
<div class="pull-right"> <div class="pull-right noprint">
<form action="{% url 'extras:report_run' name=report.full_name %}" method="post"> <form action="{% url 'extras:report_run' name=report.full_name %}" method="post">
{% csrf_token %} {% csrf_token %}
{{ run_form }} {{ run_form }}

View File

@ -29,6 +29,12 @@
Edit this tag Edit this tag
</a> </a>
{% endif %} {% endif %}
{% if perms.taggit.delete_tag %}
<a href="{% url 'extras:tag_delete' slug=tag.slug %}" class="btn btn-danger">
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
Delete this tag
</a>
{% endif %}
</div> </div>
<h1>{% block title %}Tag: {{ tag }}{% endblock %}</h1> <h1>{% block title %}Tag: {{ tag }}{% endblock %}</h1>
{% include 'inc/created_updated.html' with obj=tag %} {% include 'inc/created_updated.html' with obj=tag %}

View File

@ -14,7 +14,7 @@
</td> </td>
<td>{{ attachment.size|filesizeformat }}</td> <td>{{ attachment.size|filesizeformat }}</td>
<td>{{ attachment.created }}</td> <td>{{ attachment.created }}</td>
<td class="text-right"> <td class="text-right noprint">
{% if perms.extras.change_imageattachment %} {% if perms.extras.change_imageattachment %}
<a href="{% url 'extras:imageattachment_edit' pk=attachment.pk %}" class="btn btn-warning btn-xs" title="Edit image"> <a href="{% url 'extras:imageattachment_edit' pk=attachment.pk %}" class="btn btn-warning btn-xs" title="Edit image">
<i class="glyphicon glyphicon-pencil" aria-hidden="true"></i> <i class="glyphicon glyphicon-pencil" aria-hidden="true"></i>

View File

@ -26,7 +26,7 @@
{% endif %} {% endif %}
</div> </div>
{% endfor %} {% endfor %}
<div class="text-right"> <div class="text-right noprint">
<button type="submit" class="btn btn-primary"> <button type="submit" class="btn btn-primary">
<span class="fa fa-search" aria-hidden="true"></span> Apply <span class="fa fa-search" aria-hidden="true"></span> Apply
</button> </button>

View File

@ -2,7 +2,7 @@
{% load helpers %} {% load helpers %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'ipam:aggregate_list' %}">Aggregates</a></li> <li><a href="{% url 'ipam:aggregate_list' %}">Aggregates</a></li>
@ -23,7 +23,7 @@
</form> </form>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.ipam.change_aggregate %} {% if perms.ipam.change_aggregate %}
<a href="{% url 'ipam:aggregate_edit' pk=aggregate.pk %}" class="btn btn-warning"> <a href="{% url 'ipam:aggregate_edit' pk=aggregate.pk %}" class="btn btn-warning">
<span class="fa fa-pencil" aria-hidden="true"></span> <span class="fa fa-pencil" aria-hidden="true"></span>

View File

@ -3,7 +3,7 @@
{% load humanize %} {% load humanize %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.ipam.add_aggregate %} {% if perms.ipam.add_aggregate %}
{% add_button 'ipam:aggregate_add' %} {% add_button 'ipam:aggregate_add' %}
{% import_button 'ipam:aggregate_import' %} {% import_button 'ipam:aggregate_import' %}
@ -15,7 +15,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='ipam:aggregate_bulk_edit' bulk_delete_url='ipam:aggregate_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='ipam:aggregate_bulk_edit' bulk_delete_url='ipam:aggregate_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
<div class="panel panel-default"> <div class="panel panel-default">

View File

@ -13,7 +13,7 @@
{% endfor %} {% endfor %}
</td> </td>
<td>{{ service.description }}</td> <td>{{ service.description }}</td>
<td class="text-right"> <td class="text-right noprint">
<a href="{% url 'ipam:service_changelog' pk=service.pk %}" class="btn btn-default btn-xs" title="Changelog"> <a href="{% url 'ipam:service_changelog' pk=service.pk %}" class="btn btn-default btn-xs" title="Changelog">
<i class="fa fa-history"></i> <i class="fa fa-history"></i>
</a> </a>

View File

@ -2,7 +2,7 @@
{% load helpers %} {% load helpers %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'ipam:ipaddress_list' %}">IP Addresses</a></li> <li><a href="{% url 'ipam:ipaddress_list' %}">IP Addresses</a></li>
@ -25,7 +25,7 @@
</form> </form>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.ipam.change_ipaddress %} {% if perms.ipam.change_ipaddress %}
<a href="{% url 'ipam:ipaddress_edit' pk=ipaddress.pk %}" class="btn btn-warning"> <a href="{% url 'ipam:ipaddress_edit' pk=ipaddress.pk %}" class="btn btn-warning">
<span class="fa fa-pencil" aria-hidden="true"></span> <span class="fa fa-pencil" aria-hidden="true"></span>
@ -150,7 +150,7 @@
{% if duplicate_ips_table.rows %} {% if duplicate_ips_table.rows %}
{% include 'panel_table.html' with table=duplicate_ips_table heading='Duplicate IP Addresses' panel_class='danger' %} {% include 'panel_table.html' with table=duplicate_ips_table heading='Duplicate IP Addresses' panel_class='danger' %}
{% endif %} {% endif %}
{% include 'panel_table.html' with table=related_ips_table heading='Related IP Addresses' panel_class='default' %} {% include 'panel_table.html' with table=related_ips_table heading='Related IP Addresses' panel_class='default noprint' %}
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.ipam.add_ipaddress %} {% if perms.ipam.add_ipaddress %}
{% add_button 'ipam:ipaddress_add' %} {% add_button 'ipam:ipaddress_add' %}
{% import_button 'ipam:ipaddress_import' %} {% import_button 'ipam:ipaddress_import' %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='ipam:ipaddress_bulk_edit' bulk_delete_url='ipam:ipaddress_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='ipam:ipaddress_bulk_edit' bulk_delete_url='ipam:ipaddress_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -2,7 +2,7 @@
{% load helpers %} {% load helpers %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'ipam:prefix_list' %}">Prefixes</a></li> <li><a href="{% url 'ipam:prefix_list' %}">Prefixes</a></li>
@ -25,7 +25,7 @@
</form> </form>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.ipam.add_prefix and active_tab == 'prefixes' and first_available_prefix %} {% if perms.ipam.add_prefix and active_tab == 'prefixes' and first_available_prefix %}
<a href="{% url 'ipam:prefix_add' %}?prefix={{ first_available_prefix }}&vrf={{ prefix.vrf.pk }}&site={{ prefix.site.pk }}&tenant_group={{ prefix.tenant.group.pk }}&tenant={{ prefix.tenant.pk }}" class="btn btn-success"> <a href="{% url 'ipam:prefix_add' %}?prefix={{ first_available_prefix }}&vrf={{ prefix.vrf.pk }}&site={{ prefix.site.pk }}&tenant_group={{ prefix.tenant.group.pk }}&tenant={{ prefix.tenant.pk }}" class="btn btn-success">
<i class="fa fa-plus" aria-hidden="true"></i> Add Child Prefix <i class="fa fa-plus" aria-hidden="true"></i> Add Child Prefix

View File

@ -3,7 +3,7 @@
{% load helpers %} {% load helpers %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
<div class="btn-group" role="group"> <div class="btn-group" role="group">
<a href="{% url 'ipam:prefix_list' %}{% querystring request expand=None page=1 %}" class="btn btn-default{% if not request.GET.expand %} active{% endif %}">Collapse</a> <a href="{% url 'ipam:prefix_list' %}{% querystring request expand=None page=1 %}" class="btn btn-default{% if not request.GET.expand %} active{% endif %}">Collapse</a>
<a href="{% url 'ipam:prefix_list' %}{% querystring request expand='on' page=1 %}" class="btn btn-default{% if request.GET.expand %} active{% endif %}">Expand</a> <a href="{% url 'ipam:prefix_list' %}{% querystring request expand='on' page=1 %}" class="btn btn-default{% if request.GET.expand %} active{% endif %}">Expand</a>
@ -19,7 +19,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='ipam:prefix_bulk_edit' bulk_delete_url='ipam:prefix_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='ipam:prefix_bulk_edit' bulk_delete_url='ipam:prefix_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -3,7 +3,7 @@
{% load humanize %} {% load humanize %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if request.GET.family == '6' %} {% if request.GET.family == '6' %}
<a href="{% url 'ipam:rir_list' %}" class="btn btn-default"> <a href="{% url 'ipam:rir_list' %}" class="btn btn-default">
<span class="fa fa-table" aria-hidden="true"></span> <span class="fa fa-table" aria-hidden="true"></span>
@ -29,7 +29,7 @@
<div class="alert alert-info pull-right"><strong>Note:</strong> Numbers shown indicate /64 prefixes.</div> <div class="alert alert-info pull-right"><strong>Note:</strong> Numbers shown indicate /64 prefixes.</div>
{% endif %} {% endif %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
</div> </div>
</div> </div>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.ipam.add_role %} {% if perms.ipam.add_role %}
{% add_button 'ipam:role_add' %} {% add_button 'ipam:role_add' %}
{% import_button 'ipam:role_import' %} {% import_button 'ipam:role_import' %}

View File

@ -2,7 +2,7 @@
{% load helpers %} {% load helpers %}
{% block content %} {% block content %}
<div class="row"> <div class="row noprint">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'ipam:service_list' %}">Services</a></li> <li><a href="{% url 'ipam:service_list' %}">Services</a></li>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% export_button content_type %} {% export_button content_type %}
</div> </div>
<h1>{% block title %}Services{% endblock %}</h1> <h1>{% block title %}Services{% endblock %}</h1>
@ -10,7 +10,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='ipam:service_bulk_edit' bulk_delete_url='ipam:service_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='ipam:service_bulk_edit' bulk_delete_url='ipam:service_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -2,7 +2,7 @@
{% load helpers %} {% load helpers %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'ipam:vlan_list' %}">VLANs</a></li> <li><a href="{% url 'ipam:vlan_list' %}">VLANs</a></li>
@ -28,7 +28,7 @@
</form> </form>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.ipam.change_vlan %} {% if perms.ipam.change_vlan %}
<a href="{% url 'ipam:vlan_edit' pk=vlan.pk %}" class="btn btn-warning"> <a href="{% url 'ipam:vlan_edit' pk=vlan.pk %}" class="btn btn-warning">
<span class="fa fa-pencil" aria-hidden="true"></span> <span class="fa fa-pencil" aria-hidden="true"></span>
@ -143,7 +143,7 @@
</div> </div>
{% include 'responsive_table.html' with table=prefix_table %} {% include 'responsive_table.html' with table=prefix_table %}
{% if perms.ipam.add_prefix %} {% if perms.ipam.add_prefix %}
<div class="panel-footer text-right"> <div class="panel-footer text-right noprint">
<a href="{% url 'ipam:prefix_add' %}?{% if vlan.tenant %}tenant={{ vlan.tenant.pk }}&{% endif %}site={{ vlan.site.pk }}&vlan={{ vlan.pk }}" class="btn btn-primary btn-xs"> <a href="{% url 'ipam:prefix_add' %}?{% if vlan.tenant %}tenant={{ vlan.tenant.pk }}&{% endif %}site={{ vlan.site.pk }}&vlan={{ vlan.pk }}" class="btn btn-primary btn-xs">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
Add a prefix Add a prefix

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.ipam.add_vlan %} {% if perms.ipam.add_vlan %}
{% add_button 'ipam:vlan_add' %} {% add_button 'ipam:vlan_add' %}
{% import_button 'ipam:vlan_import' %} {% import_button 'ipam:vlan_import' %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='ipam:vlan_bulk_edit' bulk_delete_url='ipam:vlan_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='ipam:vlan_bulk_edit' bulk_delete_url='ipam:vlan_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.ipam.add_vlangroup %} {% if perms.ipam.add_vlangroup %}
{% add_button 'ipam:vlangroup_add' %} {% add_button 'ipam:vlangroup_add' %}
{% import_button 'ipam:vlangroup_import' %} {% import_button 'ipam:vlangroup_import' %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_delete_url='ipam:vlangroup_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_delete_url='ipam:vlangroup_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
</div> </div>
</div> </div>

View File

@ -3,7 +3,7 @@
{% block title %}{{ vlan_group }} - VLANs{% endblock %} {% block title %}{{ vlan_group }} - VLANs{% endblock %}
{% block content %} {% block content %}
<div class="row"> <div class="row noprint">
<div class="col-sm-12 col-md-12"> <div class="col-sm-12 col-md-12">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'ipam:vlangroup_list' %}">VLAN Groups</a></li> <li><a href="{% url 'ipam:vlangroup_list' %}">VLAN Groups</a></li>

View File

@ -2,7 +2,7 @@
{% load helpers %} {% load helpers %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'ipam:vrf_list' %}">VRFs</a></li> <li><a href="{% url 'ipam:vrf_list' %}">VRFs</a></li>
@ -22,7 +22,7 @@
</form> </form>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.ipam.change_vrf %} {% if perms.ipam.change_vrf %}
<a href="{% url 'ipam:vrf_edit' pk=vrf.pk %}" class="btn btn-warning"> <a href="{% url 'ipam:vrf_edit' pk=vrf.pk %}" class="btn btn-warning">
<span class="fa fa-pencil" aria-hidden="true"></span> <span class="fa fa-pencil" aria-hidden="true"></span>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.ipam.add_vrf %} {% if perms.ipam.add_vrf %}
{% add_button 'ipam:vrf_add' %} {% add_button 'ipam:vrf_add' %}
{% import_button 'ipam:vrf_import' %} {% import_button 'ipam:vrf_import' %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='ipam:vrf_bulk_edit' bulk_delete_url='ipam:vrf_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='ipam:vrf_bulk_edit' bulk_delete_url='ipam:vrf_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -16,7 +16,7 @@
<div class="form-group"> <div class="form-group">
<textarea class="form-control" id="user_privkey" style="height: 300px;"></textarea> <textarea class="form-control" id="user_privkey" style="height: 300px;"></textarea>
</div> </div>
<div class="form-group text-right"> <div class="form-group text-right noprint">
<button id="request_session_key" class="btn btn-primary" data-dismiss="modal"> <button id="request_session_key" class="btn btn-primary" data-dismiss="modal">
Request session key Request session key
</button> </button>

View File

@ -3,7 +3,7 @@
<td><a href="{% url 'secrets:secret' pk=secret.pk %}">{{ secret.role }}</a></td> <td><a href="{% url 'secrets:secret' pk=secret.pk %}">{{ secret.role }}</a></td>
<td>{{ secret.name }}</td> <td>{{ secret.name }}</td>
<td id="secret_{{ secret.pk }}">********</td> <td id="secret_{{ secret.pk }}">********</td>
<td class="text-right"> <td class="text-right noprint">
{% if secret|decryptable_by:request.user %} {% if secret|decryptable_by:request.user %}
<button class="btn btn-xs btn-success unlock-secret" secret-id="{{ secret.pk }}"> <button class="btn btn-xs btn-success unlock-secret" secret-id="{{ secret.pk }}">
<i class="fa fa-lock"></i> Unlock <i class="fa fa-lock"></i> Unlock

View File

@ -4,7 +4,7 @@
{% load secret_helpers %} {% load secret_helpers %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-md-12"> <div class="col-md-12">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'secrets:secret_list' %}">Secrets</a></li> <li><a href="{% url 'secrets:secret_list' %}">Secrets</a></li>
@ -13,7 +13,7 @@
</ol> </ol>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.secrets.change_secret %} {% if perms.secrets.change_secret %}
<a href="{% url 'secrets:secret_edit' pk=secret.pk %}" class="btn btn-warning"> <a href="{% url 'secrets:secret_edit' pk=secret.pk %}" class="btn btn-warning">
<span class="fa fa-pencil" aria-hidden="true"></span> <span class="fa fa-pencil" aria-hidden="true"></span>
@ -78,7 +78,7 @@
<div class="row"> <div class="row">
<div class="col-md-2">Secret</div> <div class="col-md-2">Secret</div>
<div class="col-md-6" id="secret_{{ secret.pk }}">********</div> <div class="col-md-6" id="secret_{{ secret.pk }}">********</div>
<div class="col-md-4 text-right"> <div class="col-md-4 text-right noprint">
<button class="btn btn-xs btn-success unlock-secret" secret-id="{{ secret.pk }}"> <button class="btn btn-xs btn-success unlock-secret" secret-id="{{ secret.pk }}">
<i class="fa fa-lock"></i> Unlock <i class="fa fa-lock"></i> Unlock
</button> </button>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.secrets.add_secret %} {% if perms.secrets.add_secret %}
{% import_button 'secrets:secret_import' %} {% import_button 'secrets:secret_import' %}
{% endif %} {% endif %}
@ -13,7 +13,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='secrets:secret_bulk_edit' bulk_delete_url='secrets:secret_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='secrets:secret_bulk_edit' bulk_delete_url='secrets:secret_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.secrets.add_secretrole %} {% if perms.secrets.add_secretrole %}
{% add_button 'secrets:secretrole_add' %} {% add_button 'secrets:secretrole_add' %}
{% import_button 'secrets:secretrole_import' %} {% import_button 'secrets:secretrole_import' %}

View File

@ -2,7 +2,7 @@
{% load helpers %} {% load helpers %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{% url 'tenancy:tenant_list' %}">Tenants</a></li> <li><a href="{% url 'tenancy:tenant_list' %}">Tenants</a></li>
@ -25,7 +25,7 @@
</form> </form>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.tenancy.change_tenant %} {% if perms.tenancy.change_tenant %}
<a href="{% url 'tenancy:tenant_edit' slug=tenant.slug %}" class="btn btn-warning"> <a href="{% url 'tenancy:tenant_edit' slug=tenant.slug %}" class="btn btn-warning">
<span class="fa fa-pencil" aria-hidden="true"></span> <span class="fa fa-pencil" aria-hidden="true"></span>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.tenancy.add_tenant %} {% if perms.tenancy.add_tenant %}
{% add_button 'tenancy:tenant_add' %} {% add_button 'tenancy:tenant_add' %}
{% import_button 'tenancy:tenant_import' %} {% import_button 'tenancy:tenant_import' %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='tenancy:tenant_bulk_edit' bulk_delete_url='tenancy:tenant_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='tenancy:tenant_bulk_edit' bulk_delete_url='tenancy:tenant_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.tenancy.add_tenantgroup %} {% if perms.tenancy.add_tenantgroup %}
{% add_button 'tenancy:tenantgroup_add' %} {% add_button 'tenancy:tenantgroup_add' %}
{% import_button 'tenancy:tenantgroup_import' %} {% import_button 'tenancy:tenantgroup_import' %}

View File

@ -9,7 +9,7 @@
{% for token in tokens %} {% for token in tokens %}
<div class="panel panel-{% if token.is_expired %}danger{% else %}default{% endif %}"> <div class="panel panel-{% if token.is_expired %}danger{% else %}default{% endif %}">
<div class="panel-heading"> <div class="panel-heading">
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.users.change_token %} {% if perms.users.change_token %}
<a href="{% url 'user:token_edit' pk=token.pk %}" class="btn btn-xs btn-warning">Edit</a> <a href="{% url 'user:token_edit' pk=token.pk %}" class="btn btn-xs btn-warning">Edit</a>
{% endif %} {% endif %}

View File

@ -4,7 +4,7 @@
{% block usercontent %} {% block usercontent %}
{% if userkey %} {% if userkey %}
<div class="pull-right"> <div class="pull-right noprint">
<a href="{% url 'user:userkey_edit' %}" class="btn btn-warning"> <a href="{% url 'user:userkey_edit' %}" class="btn btn-warning">
<span class="fa fa-pencil" aria-hidden="true"></span> <span class="fa fa-pencil" aria-hidden="true"></span>
Edit user key Edit user key
@ -28,7 +28,7 @@
<pre>{{ userkey.public_key }}</pre> <pre>{{ userkey.public_key }}</pre>
<hr /> <hr />
{% if userkey.session_key %} {% if userkey.session_key %}
<div class="pull-right"> <div class="pull-right noprint">
<a href="{% url 'user:sessionkey_delete' %}" class="btn btn-danger"> <a href="{% url 'user:sessionkey_delete' %}" class="btn btn-danger">
<span class="fa fa-trash" aria-hidden="true"></span> <span class="fa fa-trash" aria-hidden="true"></span>
Delete session key Delete session key

View File

@ -4,7 +4,7 @@
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="return_url" value="{% if return_url %}{{ return_url }}{% else %}{{ request.path }}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}{% endif %}" /> <input type="hidden" name="return_url" value="{% if return_url %}{{ return_url }}{% else %}{{ request.path }}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}{% endif %}" />
{% if table.paginator.num_pages > 1 %} {% if table.paginator.num_pages > 1 %}
<div id="select_all_box" class="hidden panel panel-default"> <div id="select_all_box" class="hidden panel panel-default noprint">
<div class="panel-body"> <div class="panel-body">
<div class="checkbox-inline"> <div class="checkbox-inline">
<label for="select_all"> <label for="select_all">
@ -28,7 +28,7 @@
</div> </div>
{% endif %} {% endif %}
{% include table_template|default:'responsive_table.html' %} {% include table_template|default:'responsive_table.html' %}
<div class="pull-left"> <div class="pull-left noprint">
{% block extra_actions %}{% endblock %} {% block extra_actions %}{% endblock %}
{% if bulk_edit_url and permissions.change %} {% if bulk_edit_url and permissions.change %}
<button type="submit" name="_edit" formaction="{% url bulk_edit_url %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="btn btn-warning btn-sm"> <button type="submit" name="_edit" formaction="{% url bulk_edit_url %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="btn btn-warning btn-sm">

View File

@ -2,7 +2,7 @@
{% load helpers %} {% load helpers %}
{% block header %} {% block header %}
<div class="row" xmlns="http://www.w3.org/1999/html"> <div class="row noprint" xmlns="http://www.w3.org/1999/html">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="{{ cluster.type.get_absolute_url }}">{{ cluster.type }}</a></li> <li><a href="{{ cluster.type.get_absolute_url }}">{{ cluster.type }}</a></li>
@ -25,7 +25,7 @@
</form> </form>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.virtualization.change_cluster %} {% if perms.virtualization.change_cluster %}
<a href="{% url 'virtualization:cluster_edit' pk=cluster.pk %}" class="btn btn-warning"> <a href="{% url 'virtualization:cluster_edit' pk=cluster.pk %}" class="btn btn-warning">
<span class="fa fa-pencil" aria-hidden="true"></span> <span class="fa fa-pencil" aria-hidden="true"></span>
@ -119,7 +119,7 @@
{% endif %} {% endif %}
{% include 'responsive_table.html' with table=device_table %} {% include 'responsive_table.html' with table=device_table %}
{% if perms.virtualization.change_cluster %} {% if perms.virtualization.change_cluster %}
<div class="panel-footer"> <div class="panel-footer noprint">
<div class="pull-right"> <div class="pull-right">
<a href="{% url 'virtualization:cluster_add_devices' pk=cluster.pk %}" class="btn btn-primary btn-xs"> <a href="{% url 'virtualization:cluster_add_devices' pk=cluster.pk %}" class="btn btn-primary btn-xs">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>

View File

@ -47,7 +47,7 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-6 col-md-offset-3 text-right"> <div class="col-md-6 col-md-offset-3 text-right noprint">
<button type="submit" name="_add" class="btn btn-primary">Add Devices</button> <button type="submit" name="_add" class="btn btn-primary">Add Devices</button>
<a href="{{ return_url }}" class="btn btn-default">Cancel</a> <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
</div> </div>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.virtualization.add_cluster %} {% if perms.virtualization.add_cluster %}
{% add_button 'virtualization:cluster_add' %} {% add_button 'virtualization:cluster_add' %}
{% import_button 'virtualization:cluster_import' %} {% import_button 'virtualization:cluster_import' %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url='virtualization:cluster_bulk_edit' bulk_delete_url='virtualization:cluster_bulk_delete' %} {% include 'utilities/obj_table.html' with bulk_edit_url='virtualization:cluster_bulk_edit' bulk_delete_url='virtualization:cluster_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.virtualization.add_clustergroup %} {% if perms.virtualization.add_clustergroup %}
{% add_button 'virtualization:clustergroup_add' %} {% add_button 'virtualization:clustergroup_add' %}
{% import_button 'virtualization:clustergroup_import' %} {% import_button 'virtualization:clustergroup_import' %}

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.virtualization.add_clustertype %} {% if perms.virtualization.add_clustertype %}
{% add_button 'virtualization:clustertype_add' %} {% add_button 'virtualization:clustertype_add' %}
{% import_button 'virtualization:clustertype_import' %} {% import_button 'virtualization:clustertype_import' %}

View File

@ -2,7 +2,7 @@
{% load helpers %} {% load helpers %}
{% block header %} {% block header %}
<div class="row"> <div class="row noprint">
<div class="col-sm-8 col-md-9"> <div class="col-sm-8 col-md-9">
<ol class="breadcrumb"> <ol class="breadcrumb">
{% if virtualmachine.cluster %} {% if virtualmachine.cluster %}
@ -24,7 +24,7 @@
</form> </form>
</div> </div>
</div> </div>
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.virtualization.change_virtualmachine %} {% if perms.virtualization.change_virtualmachine %}
<a href="{% url 'virtualization:virtualmachine_edit' pk=virtualmachine.pk %}" class="btn btn-warning"> <a href="{% url 'virtualization:virtualmachine_edit' pk=virtualmachine.pk %}" class="btn btn-warning">
<span class="fa fa-pencil"></span> <span class="fa fa-pencil"></span>
@ -221,7 +221,7 @@
</div> </div>
{% endif %} {% endif %}
{% if perms.ipam.add_service %} {% if perms.ipam.add_service %}
<div class="panel-footer text-right"> <div class="panel-footer text-right noprint">
<a href="{% url 'virtualization:virtualmachine_service_assign' virtualmachine=virtualmachine.pk %}" class="btn btn-xs btn-primary"> <a href="{% url 'virtualization:virtualmachine_service_assign' virtualmachine=virtualmachine.pk %}" class="btn btn-xs btn-primary">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Assign service <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Assign service
</a> </a>
@ -271,7 +271,7 @@
</tbody> </tbody>
</table> </table>
{% if perms.dcim.add_interface or perms.dcim.delete_interface %} {% if perms.dcim.add_interface or perms.dcim.delete_interface %}
<div class="panel-footer"> <div class="panel-footer noprint">
{% if interfaces and perms.dcim.change_interface %} {% if interfaces and perms.dcim.change_interface %}
<button type="submit" name="_rename" formaction="{% url 'dcim:interface_bulk_rename' %}?return_url={{ virtualmachine.get_absolute_url }}" class="btn btn-warning btn-xs"> <button type="submit" name="_rename" formaction="{% url 'dcim:interface_bulk_rename' %}?return_url={{ virtualmachine.get_absolute_url }}" class="btn btn-warning btn-xs">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename

View File

@ -2,7 +2,7 @@
{% load buttons %} {% load buttons %}
{% block content %} {% block content %}
<div class="pull-right"> <div class="pull-right noprint">
{% if perms.virtualization.add_virtualmachine %} {% if perms.virtualization.add_virtualmachine %}
{% add_button 'virtualization:virtualmachine_add' %} {% add_button 'virtualization:virtualmachine_add' %}
{% import_button 'virtualization:virtualmachine_import' %} {% import_button 'virtualization:virtualmachine_import' %}
@ -14,7 +14,7 @@
<div class="col-md-9"> <div class="col-md-9">
{% include 'virtualization/inc/virtualmachine_table.html' with bulk_edit_url='virtualization:virtualmachine_bulk_edit' bulk_delete_url='virtualization:virtualmachine_bulk_delete' %} {% include 'virtualization/inc/virtualmachine_table.html' with bulk_edit_url='virtualization:virtualmachine_bulk_edit' bulk_delete_url='virtualization:virtualmachine_bulk_delete' %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %} {% include 'inc/search_panel.html' %}
{% include 'inc/tags_panel.html' %} {% include 'inc/tags_panel.html' %}
</div> </div>

View File

@ -31,7 +31,7 @@ class TenantGroupTable(BaseTable):
tenant_count = tables.Column(verbose_name='Tenants') tenant_count = tables.Column(verbose_name='Tenants')
slug = tables.Column(verbose_name='Slug') slug = tables.Column(verbose_name='Slug')
actions = tables.TemplateColumn( actions = tables.TemplateColumn(
template_code=TENANTGROUP_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='' template_code=TENANTGROUP_ACTIONS, attrs={'td': {'class': 'text-right noprint'}}, verbose_name=''
) )
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):

View File

@ -8,7 +8,7 @@ from django.db.models import ManyToManyField
from django.http import Http404 from django.http import Http404
from rest_framework.exceptions import APIException from rest_framework.exceptions import APIException
from rest_framework.permissions import BasePermission from rest_framework.permissions import BasePermission
from rest_framework.relations import PrimaryKeyRelatedField from rest_framework.relations import PrimaryKeyRelatedField, RelatedField
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.serializers import Field, ModelSerializer, ValidationError from rest_framework.serializers import Field, ModelSerializer, ValidationError
from rest_framework.viewsets import ModelViewSet as _ModelViewSet, ViewSet from rest_framework.viewsets import ModelViewSet as _ModelViewSet, ViewSet
@ -101,19 +101,30 @@ class ChoiceField(Field):
return data return data
class ContentTypeField(Field): class ContentTypeField(RelatedField):
""" """
Represent a ContentType as '<app_label>.<model>' Represent a ContentType as '<app_label>.<model>'
""" """
def to_representation(self, obj): default_error_messages = {
return "{}.{}".format(obj.app_label, obj.model) "does_not_exist": "Invalid content type: {content_type}",
"invalid": "Invalid value. Specify a content type as '<app_label>.<model_name>'.",
}
# Can't set this as an attribute because it raises an exception when the field is read-only
def get_queryset(self):
return ContentType.objects.all()
def to_internal_value(self, data): def to_internal_value(self, data):
app_label, model = data.split('.')
try: try:
app_label, model = data.split('.')
return ContentType.objects.get_by_natural_key(app_label=app_label, model=model) return ContentType.objects.get_by_natural_key(app_label=app_label, model=model)
except ContentType.DoesNotExist: except ObjectDoesNotExist:
raise ValidationError("Invalid content type") self.fail('does_not_exist', content_type=data)
except (TypeError, ValueError):
self.fail('invalid')
def to_representation(self, obj):
return "{}.{}".format(obj.app_label, obj.model)
class TimeZoneField(Field): class TimeZoneField(Field):

View File

@ -1,14 +1,24 @@
from drf_yasg import openapi from drf_yasg import openapi
from drf_yasg.inspectors import FieldInspector, NotHandled, PaginatorInspector, FilterInspector, SwaggerAutoSchema from drf_yasg.inspectors import FieldInspector, NotHandled, PaginatorInspector, FilterInspector, SwaggerAutoSchema
from drf_yasg.utils import get_serializer_ref_name
from rest_framework.fields import ChoiceField from rest_framework.fields import ChoiceField
from rest_framework.relations import ManyRelatedField from rest_framework.relations import ManyRelatedField
from taggit_serializer.serializers import TagListSerializerField from taggit_serializer.serializers import TagListSerializerField
from dcim.api.serializers import InterfaceSerializer as DeviceInterfaceSerializer
from virtualization.api.serializers import InterfaceSerializer as VirtualMachineInterfaceSerializer
from extras.api.customfields import CustomFieldsSerializer from extras.api.customfields import CustomFieldsSerializer
from utilities.api import ChoiceField, SerializedPKRelatedField, WritableNestedSerializer from utilities.api import ChoiceField, SerializedPKRelatedField, WritableNestedSerializer
# this might be ugly, but it limits drf_yasg-specific code to this file
DeviceInterfaceSerializer.Meta.ref_name = 'DeviceInterface'
VirtualMachineInterfaceSerializer.Meta.ref_name = 'VirtualMachineInterface'
class NetBoxSwaggerAutoSchema(SwaggerAutoSchema): class NetBoxSwaggerAutoSchema(SwaggerAutoSchema):
writable_serializers = {}
def get_request_serializer(self): def get_request_serializer(self):
serializer = super().get_request_serializer() serializer = super().get_request_serializer()
@ -21,7 +31,17 @@ class NetBoxSwaggerAutoSchema(SwaggerAutoSchema):
properties[child_name] = None properties[child_name] = None
if properties: if properties:
writable_class = type('Writable' + type(serializer).__name__, (type(serializer),), properties) if type(serializer) not in self.writable_serializers:
writable_name = 'Writable' + type(serializer).__name__
meta_class = getattr(type(serializer), 'Meta', None)
if meta_class:
ref_name = 'Writable' + get_serializer_ref_name(serializer)
writable_meta = type('Meta', (meta_class,), {'ref_name': ref_name})
properties['Meta'] = writable_meta
self.writable_serializers[type(serializer)] = type(writable_name, (type(serializer),), properties)
writable_class = self.writable_serializers[type(serializer)]
serializer = writable_class() serializer = writable_class()
return serializer return serializer

Some files were not shown because too many files have changed in this diff Show More