mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-24 17:38:37 -06:00
Merge branch 'develop-2.2' of github.com:digitalocean/netbox into develop-2.2
This commit is contained in:
commit
32399b0cb5
@ -24,7 +24,7 @@ from .models import (
|
|||||||
IFACE_FF_CHOICES, IFACE_FF_LAG, IFACE_ORDERING_CHOICES, InterfaceConnection, InterfaceTemplate, Manufacturer,
|
IFACE_FF_CHOICES, IFACE_FF_LAG, IFACE_ORDERING_CHOICES, InterfaceConnection, InterfaceTemplate, Manufacturer,
|
||||||
InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, RACK_FACE_CHOICES,
|
InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, RACK_FACE_CHOICES,
|
||||||
RACK_TYPE_CHOICES, RACK_WIDTH_CHOICES, Rack, RackGroup, RackReservation, RackRole, RACK_WIDTH_19IN, RACK_WIDTH_23IN,
|
RACK_TYPE_CHOICES, RACK_WIDTH_CHOICES, Rack, RackGroup, RackReservation, RackRole, RACK_WIDTH_19IN, RACK_WIDTH_23IN,
|
||||||
Region, Site, STATUS_CHOICES, SUBDEVICE_ROLE_CHILD, SUBDEVICE_ROLE_PARENT,
|
Region, Site, STATUS_CHOICES, SUBDEVICE_ROLE_CHILD, SUBDEVICE_ROLE_PARENT, SUBDEVICE_ROLE_CHOICES,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -55,6 +55,28 @@ class RegionForm(BootstrapMixin, forms.ModelForm):
|
|||||||
fields = ['parent', 'name', 'slug']
|
fields = ['parent', 'name', 'slug']
|
||||||
|
|
||||||
|
|
||||||
|
class RegionCSVForm(forms.ModelForm):
|
||||||
|
parent = forms.ModelChoiceField(
|
||||||
|
queryset=Region.objects.all(),
|
||||||
|
required=False,
|
||||||
|
to_field_name='name',
|
||||||
|
help_text='Name of parent region',
|
||||||
|
error_messages={
|
||||||
|
'invalid_choice': 'Region not found.',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Region
|
||||||
|
fields = [
|
||||||
|
'name', 'slug', 'parent',
|
||||||
|
]
|
||||||
|
help_texts = {
|
||||||
|
'name': 'Region name',
|
||||||
|
'slug': 'URL-friendly slug',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Sites
|
# Sites
|
||||||
#
|
#
|
||||||
@ -153,6 +175,27 @@ class RackGroupForm(BootstrapMixin, forms.ModelForm):
|
|||||||
fields = ['site', 'name', 'slug']
|
fields = ['site', 'name', 'slug']
|
||||||
|
|
||||||
|
|
||||||
|
class RackGroupCSVForm(forms.ModelForm):
|
||||||
|
site = forms.ModelChoiceField(
|
||||||
|
queryset=Site.objects.all(),
|
||||||
|
to_field_name='name',
|
||||||
|
help_text='Name of parent site',
|
||||||
|
error_messages={
|
||||||
|
'invalid_choice': 'Site not found.',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = RackGroup
|
||||||
|
fields = [
|
||||||
|
'site', 'name', 'slug',
|
||||||
|
]
|
||||||
|
help_texts = {
|
||||||
|
'name': 'Name of rack group',
|
||||||
|
'slug': 'URL-friendly slug',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class RackGroupFilterForm(BootstrapMixin, forms.Form):
|
class RackGroupFilterForm(BootstrapMixin, forms.Form):
|
||||||
site = FilterChoiceField(queryset=Site.objects.annotate(filter_count=Count('rack_groups')), to_field_name='slug')
|
site = FilterChoiceField(queryset=Site.objects.annotate(filter_count=Count('rack_groups')), to_field_name='slug')
|
||||||
|
|
||||||
@ -365,6 +408,18 @@ class ManufacturerForm(BootstrapMixin, forms.ModelForm):
|
|||||||
fields = ['name', 'slug']
|
fields = ['name', 'slug']
|
||||||
|
|
||||||
|
|
||||||
|
class ManufacturerCSVForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Manufacturer
|
||||||
|
fields = [
|
||||||
|
'name', 'slug'
|
||||||
|
]
|
||||||
|
help_texts = {
|
||||||
|
'name': 'Manufacturer name',
|
||||||
|
'slug': 'URL-friendly slug',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Device types
|
# Device types
|
||||||
#
|
#
|
||||||
@ -381,6 +436,37 @@ class DeviceTypeForm(BootstrapMixin, CustomFieldForm):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class DeviceTypeCSVForm(forms.ModelForm):
|
||||||
|
manufacturer = forms.ModelChoiceField(
|
||||||
|
queryset=Manufacturer.objects.all(),
|
||||||
|
required=True,
|
||||||
|
to_field_name='name',
|
||||||
|
help_text='Manufacturer name',
|
||||||
|
error_messages={
|
||||||
|
'invalid_choice': 'Manufacturer not found.',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
subdevice_role = CSVChoiceField(
|
||||||
|
choices=SUBDEVICE_ROLE_CHOICES,
|
||||||
|
required=False,
|
||||||
|
help_text='Parent/child status'
|
||||||
|
)
|
||||||
|
interface_ordering = CSVChoiceField(
|
||||||
|
choices=IFACE_ORDERING_CHOICES,
|
||||||
|
required=False,
|
||||||
|
help_text='Interface ordering'
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = DeviceType
|
||||||
|
fields = ['manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'is_console_server',
|
||||||
|
'is_pdu', 'is_network_device', 'subdevice_role', 'interface_ordering', 'comments']
|
||||||
|
help_texts = {
|
||||||
|
'model': 'Model name',
|
||||||
|
'slug': 'URL-friendly slug',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class DeviceTypeBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
|
class DeviceTypeBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
|
||||||
pk = forms.ModelMultipleChoiceField(queryset=DeviceType.objects.all(), widget=forms.MultipleHiddenInput)
|
pk = forms.ModelMultipleChoiceField(queryset=DeviceType.objects.all(), widget=forms.MultipleHiddenInput)
|
||||||
manufacturer = forms.ModelChoiceField(queryset=Manufacturer.objects.all(), required=False)
|
manufacturer = forms.ModelChoiceField(queryset=Manufacturer.objects.all(), required=False)
|
||||||
|
@ -44,6 +44,10 @@ class Region(MPTTModel):
|
|||||||
name = models.CharField(max_length=50, unique=True)
|
name = models.CharField(max_length=50, unique=True)
|
||||||
slug = models.SlugField(unique=True)
|
slug = models.SlugField(unique=True)
|
||||||
|
|
||||||
|
csv_headers = [
|
||||||
|
'name', 'slug', 'parent',
|
||||||
|
]
|
||||||
|
|
||||||
class MPTTMeta:
|
class MPTTMeta:
|
||||||
order_insertion_by = ['name']
|
order_insertion_by = ['name']
|
||||||
|
|
||||||
@ -53,6 +57,13 @@ class Region(MPTTModel):
|
|||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return "{}?region={}".format(reverse('dcim:site_list'), self.slug)
|
return "{}?region={}".format(reverse('dcim:site_list'), self.slug)
|
||||||
|
|
||||||
|
def to_csv(self):
|
||||||
|
return csv_format([
|
||||||
|
self.name,
|
||||||
|
self.slug,
|
||||||
|
self.parent.name if self.parent else None,
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Sites
|
# Sites
|
||||||
@ -149,6 +160,10 @@ class RackGroup(models.Model):
|
|||||||
slug = models.SlugField()
|
slug = models.SlugField()
|
||||||
site = models.ForeignKey('Site', related_name='rack_groups', on_delete=models.CASCADE)
|
site = models.ForeignKey('Site', related_name='rack_groups', on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
csv_headers = [
|
||||||
|
'site', 'name', 'slug',
|
||||||
|
]
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ['site', 'name']
|
ordering = ['site', 'name']
|
||||||
unique_together = [
|
unique_together = [
|
||||||
@ -162,6 +177,13 @@ class RackGroup(models.Model):
|
|||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return "{}?group_id={}".format(reverse('dcim:rack_list'), self.pk)
|
return "{}?group_id={}".format(reverse('dcim:rack_list'), self.pk)
|
||||||
|
|
||||||
|
def to_csv(self):
|
||||||
|
return csv_format([
|
||||||
|
self.site,
|
||||||
|
self.name,
|
||||||
|
self.slug,
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class RackRole(models.Model):
|
class RackRole(models.Model):
|
||||||
@ -444,6 +466,10 @@ class Manufacturer(models.Model):
|
|||||||
name = models.CharField(max_length=50, unique=True)
|
name = models.CharField(max_length=50, unique=True)
|
||||||
slug = models.SlugField(unique=True)
|
slug = models.SlugField(unique=True)
|
||||||
|
|
||||||
|
csv_headers = [
|
||||||
|
'name', 'slug',
|
||||||
|
]
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ['name']
|
ordering = ['name']
|
||||||
|
|
||||||
@ -453,6 +479,12 @@ class Manufacturer(models.Model):
|
|||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return "{}?manufacturer={}".format(reverse('dcim:devicetype_list'), self.slug)
|
return "{}?manufacturer={}".format(reverse('dcim:devicetype_list'), self.slug)
|
||||||
|
|
||||||
|
def to_csv(self):
|
||||||
|
return csv_format([
|
||||||
|
self.name,
|
||||||
|
self.slug,
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class DeviceType(models.Model, CustomFieldModel):
|
class DeviceType(models.Model, CustomFieldModel):
|
||||||
@ -492,6 +524,11 @@ class DeviceType(models.Model, CustomFieldModel):
|
|||||||
comments = models.TextField(blank=True)
|
comments = models.TextField(blank=True)
|
||||||
custom_field_values = GenericRelation(CustomFieldValue, content_type_field='obj_type', object_id_field='obj_id')
|
custom_field_values = GenericRelation(CustomFieldValue, content_type_field='obj_type', object_id_field='obj_id')
|
||||||
|
|
||||||
|
csv_headers = [
|
||||||
|
'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'is_console_server',
|
||||||
|
'is_pdu', 'is_network_device', 'subdevice_role', 'interface_ordering',
|
||||||
|
]
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ['manufacturer', 'model']
|
ordering = ['manufacturer', 'model']
|
||||||
unique_together = [
|
unique_together = [
|
||||||
@ -511,6 +548,21 @@ class DeviceType(models.Model, CustomFieldModel):
|
|||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return reverse('dcim:devicetype', args=[self.pk])
|
return reverse('dcim:devicetype', args=[self.pk])
|
||||||
|
|
||||||
|
def to_csv(self):
|
||||||
|
return csv_format([
|
||||||
|
self.manufacturer.name,
|
||||||
|
self.model,
|
||||||
|
self.slug,
|
||||||
|
self.part_number,
|
||||||
|
self.u_height,
|
||||||
|
self.is_full_depth,
|
||||||
|
self.is_console_server,
|
||||||
|
self.is_pdu,
|
||||||
|
self.is_network_device,
|
||||||
|
self.get_subdevice_role_display() if self.subdevice_role else None,
|
||||||
|
self.get_interface_ordering_display(),
|
||||||
|
])
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
|
|
||||||
# If editing an existing DeviceType to have a larger u_height, first validate that *all* instances of it have
|
# If editing an existing DeviceType to have a larger u_height, first validate that *all* instances of it have
|
||||||
|
@ -15,6 +15,7 @@ urlpatterns = [
|
|||||||
# Regions
|
# Regions
|
||||||
url(r'^regions/$', views.RegionListView.as_view(), name='region_list'),
|
url(r'^regions/$', views.RegionListView.as_view(), name='region_list'),
|
||||||
url(r'^regions/add/$', views.RegionCreateView.as_view(), name='region_add'),
|
url(r'^regions/add/$', views.RegionCreateView.as_view(), name='region_add'),
|
||||||
|
url(r'^regions/import/$', views.RegionBulkImportView.as_view(), name='region_import'),
|
||||||
url(r'^regions/delete/$', views.RegionBulkDeleteView.as_view(), name='region_bulk_delete'),
|
url(r'^regions/delete/$', views.RegionBulkDeleteView.as_view(), name='region_bulk_delete'),
|
||||||
url(r'^regions/(?P<pk>\d+)/edit/$', views.RegionEditView.as_view(), name='region_edit'),
|
url(r'^regions/(?P<pk>\d+)/edit/$', views.RegionEditView.as_view(), name='region_edit'),
|
||||||
|
|
||||||
@ -31,6 +32,7 @@ urlpatterns = [
|
|||||||
# Rack groups
|
# Rack groups
|
||||||
url(r'^rack-groups/$', views.RackGroupListView.as_view(), name='rackgroup_list'),
|
url(r'^rack-groups/$', views.RackGroupListView.as_view(), name='rackgroup_list'),
|
||||||
url(r'^rack-groups/add/$', views.RackGroupCreateView.as_view(), name='rackgroup_add'),
|
url(r'^rack-groups/add/$', views.RackGroupCreateView.as_view(), name='rackgroup_add'),
|
||||||
|
url(r'^rack-groups/import/$', views.RackGroupBulkImportView.as_view(), name='rackgroup_import'),
|
||||||
url(r'^rack-groups/delete/$', views.RackGroupBulkDeleteView.as_view(), name='rackgroup_bulk_delete'),
|
url(r'^rack-groups/delete/$', views.RackGroupBulkDeleteView.as_view(), name='rackgroup_bulk_delete'),
|
||||||
url(r'^rack-groups/(?P<pk>\d+)/edit/$', views.RackGroupEditView.as_view(), name='rackgroup_edit'),
|
url(r'^rack-groups/(?P<pk>\d+)/edit/$', views.RackGroupEditView.as_view(), name='rackgroup_edit'),
|
||||||
|
|
||||||
@ -62,12 +64,14 @@ urlpatterns = [
|
|||||||
# Manufacturers
|
# Manufacturers
|
||||||
url(r'^manufacturers/$', views.ManufacturerListView.as_view(), name='manufacturer_list'),
|
url(r'^manufacturers/$', views.ManufacturerListView.as_view(), name='manufacturer_list'),
|
||||||
url(r'^manufacturers/add/$', views.ManufacturerCreateView.as_view(), name='manufacturer_add'),
|
url(r'^manufacturers/add/$', views.ManufacturerCreateView.as_view(), name='manufacturer_add'),
|
||||||
|
url(r'^manufacturers/import/$', views.ManufacturerBulkImportView.as_view(), name='manufacturer_import'),
|
||||||
url(r'^manufacturers/delete/$', views.ManufacturerBulkDeleteView.as_view(), name='manufacturer_bulk_delete'),
|
url(r'^manufacturers/delete/$', views.ManufacturerBulkDeleteView.as_view(), name='manufacturer_bulk_delete'),
|
||||||
url(r'^manufacturers/(?P<slug>[\w-]+)/edit/$', views.ManufacturerEditView.as_view(), name='manufacturer_edit'),
|
url(r'^manufacturers/(?P<slug>[\w-]+)/edit/$', views.ManufacturerEditView.as_view(), name='manufacturer_edit'),
|
||||||
|
|
||||||
# Device types
|
# Device types
|
||||||
url(r'^device-types/$', views.DeviceTypeListView.as_view(), name='devicetype_list'),
|
url(r'^device-types/$', views.DeviceTypeListView.as_view(), name='devicetype_list'),
|
||||||
url(r'^device-types/add/$', views.DeviceTypeCreateView.as_view(), name='devicetype_add'),
|
url(r'^device-types/add/$', views.DeviceTypeCreateView.as_view(), name='devicetype_add'),
|
||||||
|
url(r'^device-types/import/$', views.DeviceTypeBulkImportView.as_view(), name='devicetype_import'),
|
||||||
url(r'^device-types/edit/$', views.DeviceTypeBulkEditView.as_view(), name='devicetype_bulk_edit'),
|
url(r'^device-types/edit/$', views.DeviceTypeBulkEditView.as_view(), name='devicetype_bulk_edit'),
|
||||||
url(r'^device-types/delete/$', views.DeviceTypeBulkDeleteView.as_view(), name='devicetype_bulk_delete'),
|
url(r'^device-types/delete/$', views.DeviceTypeBulkDeleteView.as_view(), name='devicetype_bulk_delete'),
|
||||||
url(r'^device-types/(?P<pk>\d+)/$', views.DeviceTypeView.as_view(), name='devicetype'),
|
url(r'^device-types/(?P<pk>\d+)/$', views.DeviceTypeView.as_view(), name='devicetype'),
|
||||||
|
@ -122,6 +122,13 @@ class RegionEditView(RegionCreateView):
|
|||||||
permission_required = 'dcim.change_region'
|
permission_required = 'dcim.change_region'
|
||||||
|
|
||||||
|
|
||||||
|
class RegionBulkImportView(PermissionRequiredMixin, BulkImportView):
|
||||||
|
permission_required = 'dcim.add_region'
|
||||||
|
model_form = forms.RegionCSVForm
|
||||||
|
table = tables.RegionTable
|
||||||
|
default_return_url = 'dcim:region_list'
|
||||||
|
|
||||||
|
|
||||||
class RegionBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
class RegionBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
||||||
permission_required = 'dcim.delete_region'
|
permission_required = 'dcim.delete_region'
|
||||||
cls = Region
|
cls = Region
|
||||||
@ -227,6 +234,13 @@ class RackGroupEditView(RackGroupCreateView):
|
|||||||
permission_required = 'dcim.change_rackgroup'
|
permission_required = 'dcim.change_rackgroup'
|
||||||
|
|
||||||
|
|
||||||
|
class RackGroupBulkImportView(PermissionRequiredMixin, BulkImportView):
|
||||||
|
permission_required = 'dcim.add_rackgroup'
|
||||||
|
model_form = forms.RackGroupCSVForm
|
||||||
|
table = tables.RackGroupTable
|
||||||
|
default_return_url = 'dcim:rackgroup_list'
|
||||||
|
|
||||||
|
|
||||||
class RackGroupBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
class RackGroupBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
||||||
permission_required = 'dcim.delete_rackgroup'
|
permission_required = 'dcim.delete_rackgroup'
|
||||||
cls = RackGroup
|
cls = RackGroup
|
||||||
@ -462,6 +476,13 @@ class ManufacturerEditView(ManufacturerCreateView):
|
|||||||
permission_required = 'dcim.change_manufacturer'
|
permission_required = 'dcim.change_manufacturer'
|
||||||
|
|
||||||
|
|
||||||
|
class ManufacturerBulkImportView(PermissionRequiredMixin, BulkImportView):
|
||||||
|
permission_required = 'dcim.add_manufacturer'
|
||||||
|
model_form = forms.ManufacturerCSVForm
|
||||||
|
table = tables.ManufacturerTable
|
||||||
|
default_return_url = 'dcim:manufacturer_list'
|
||||||
|
|
||||||
|
|
||||||
class ManufacturerBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
class ManufacturerBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
||||||
permission_required = 'dcim.delete_manufacturer'
|
permission_required = 'dcim.delete_manufacturer'
|
||||||
cls = Manufacturer
|
cls = Manufacturer
|
||||||
@ -552,6 +573,13 @@ class DeviceTypeDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
|||||||
default_return_url = 'dcim:devicetype_list'
|
default_return_url = 'dcim:devicetype_list'
|
||||||
|
|
||||||
|
|
||||||
|
class DeviceTypeBulkImportView(PermissionRequiredMixin, BulkImportView):
|
||||||
|
permission_required = 'dcim.add_devicetype'
|
||||||
|
model_form = forms.DeviceTypeCSVForm
|
||||||
|
table = tables.DeviceTypeTable
|
||||||
|
default_return_url = 'dcim:devicetype_list'
|
||||||
|
|
||||||
|
|
||||||
class DeviceTypeBulkEditView(PermissionRequiredMixin, BulkEditView):
|
class DeviceTypeBulkEditView(PermissionRequiredMixin, BulkEditView):
|
||||||
permission_required = 'dcim.change_devicetype'
|
permission_required = 'dcim.change_devicetype'
|
||||||
cls = DeviceType
|
cls = DeviceType
|
||||||
|
@ -39,7 +39,8 @@ GRAPH_TYPE_CHOICES = (
|
|||||||
# Models which support export templates
|
# Models which support export templates
|
||||||
EXPORTTEMPLATE_MODELS = [
|
EXPORTTEMPLATE_MODELS = [
|
||||||
'provider', 'circuit', # Circuits
|
'provider', 'circuit', # Circuits
|
||||||
'site', 'rack', 'device', 'consoleport', 'powerport', 'interfaceconnection', # DCIM
|
'site', 'region', 'rack', 'rackgroup', 'manufacturer', 'devicetype', 'device', # DCIM
|
||||||
|
'consoleport', 'powerport', 'interfaceconnection', # DCIM
|
||||||
'aggregate', 'prefix', 'ipaddress', 'vlan', # IPAM
|
'aggregate', 'prefix', 'ipaddress', 'vlan', # IPAM
|
||||||
'tenant', # Tenancy
|
'tenant', # Tenancy
|
||||||
'cluster', 'virtualmachine', # Virtualization
|
'cluster', 'virtualmachine', # Virtualization
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
<li><a href="{% url 'dcim:region_list' %}"><strong>Regions</strong></a></li>
|
<li><a href="{% url 'dcim:region_list' %}"><strong>Regions</strong></a></li>
|
||||||
{% if perms.dcim.add_region %}
|
{% if perms.dcim.add_region %}
|
||||||
<li class="subnav"><a href="{% url 'dcim:region_add' %}"><i class="fa fa-plus"></i> Add a Region</a></li>
|
<li class="subnav"><a href="{% url 'dcim:region_add' %}"><i class="fa fa-plus"></i> Add a Region</a></li>
|
||||||
|
<li class="subnav"><a href="{% url 'dcim:region_import' %}"><i class="fa fa-download"></i> Import Regions</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<li class="divider"></li>
|
<li class="divider"></li>
|
||||||
<li><a href="{% url 'tenancy:tenant_list' %}"><strong>Tenants</strong></a></li>
|
<li><a href="{% url 'tenancy:tenant_list' %}"><strong>Tenants</strong></a></li>
|
||||||
@ -69,6 +70,7 @@
|
|||||||
<li><a href="{% url 'dcim:rackgroup_list' %}"><strong>Rack Groups</strong></a></li>
|
<li><a href="{% url 'dcim:rackgroup_list' %}"><strong>Rack Groups</strong></a></li>
|
||||||
{% if perms.dcim.add_rackgroup %}
|
{% if perms.dcim.add_rackgroup %}
|
||||||
<li class="subnav"><a href="{% url 'dcim:rackgroup_add' %}"><i class="fa fa-plus"></i> Add a Rack Group</a></li>
|
<li class="subnav"><a href="{% url 'dcim:rackgroup_add' %}"><i class="fa fa-plus"></i> Add a Rack Group</a></li>
|
||||||
|
<li class="subnav"><a href="{% url 'dcim:rackgroup_import' %}"><i class="fa fa-download"></i> Import Rack Groups</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<li class="divider"></li>
|
<li class="divider"></li>
|
||||||
<li><a href="{% url 'dcim:rackrole_list' %}"><strong>Rack Roles</strong></a></li>
|
<li><a href="{% url 'dcim:rackrole_list' %}"><strong>Rack Roles</strong></a></li>
|
||||||
@ -93,6 +95,7 @@
|
|||||||
<li><a href="{% url 'dcim:devicetype_list' %}"><strong>Device Types</strong></a></li>
|
<li><a href="{% url 'dcim:devicetype_list' %}"><strong>Device Types</strong></a></li>
|
||||||
{% if perms.dcim.add_devicetype %}
|
{% if perms.dcim.add_devicetype %}
|
||||||
<li class="subnav"><a href="{% url 'dcim:devicetype_add' %}"><i class="fa fa-plus"></i> Add a Device Type</a></li>
|
<li class="subnav"><a href="{% url 'dcim:devicetype_add' %}"><i class="fa fa-plus"></i> Add a Device Type</a></li>
|
||||||
|
<li class="subnav"><a href="{% url 'dcim:devicetype_import' %}"><i class="fa fa-download"></i> Import Device Types</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<li class="divider"></li>
|
<li class="divider"></li>
|
||||||
<li><a href="{% url 'dcim:devicerole_list' %}"><strong>Device Roles</strong></a></li>
|
<li><a href="{% url 'dcim:devicerole_list' %}"><strong>Device Roles</strong></a></li>
|
||||||
@ -105,6 +108,7 @@
|
|||||||
<li><a href="{% url 'dcim:manufacturer_list' %}"><strong>Manufacturers</strong></a></li>
|
<li><a href="{% url 'dcim:manufacturer_list' %}"><strong>Manufacturers</strong></a></li>
|
||||||
{% if perms.dcim.add_manufacturer %}
|
{% if perms.dcim.add_manufacturer %}
|
||||||
<li class="subnav"><a href="{% url 'dcim:manufacturer_add' %}"><i class="fa fa-plus"></i> Add a Manufacturer</a></li>
|
<li class="subnav"><a href="{% url 'dcim:manufacturer_add' %}"><i class="fa fa-plus"></i> Add a Manufacturer</a></li>
|
||||||
|
<li class="subnav"><a href="{% url 'dcim:manufacturer_import' %}"><i class="fa fa-download"></i> Import Manufacturers</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if perms.dcim.add_manufacturer or perms.dcim.add_platform %}
|
{% if perms.dcim.add_manufacturer or perms.dcim.add_platform %}
|
||||||
<li class="divider"></li>
|
<li class="divider"></li>
|
||||||
|
@ -8,7 +8,12 @@
|
|||||||
<span class="fa fa-plus" aria-hidden="true"></span>
|
<span class="fa fa-plus" aria-hidden="true"></span>
|
||||||
Add a device type
|
Add a device type
|
||||||
</a>
|
</a>
|
||||||
|
<a href="{% url 'dcim:devicetype_import' %}" class="btn btn-info">
|
||||||
|
<span class="fa fa-download" aria-hidden="true"></span>
|
||||||
|
Import device types
|
||||||
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% include 'inc/export_button.html' with obj_type='devicetypes' %}
|
||||||
</div>
|
</div>
|
||||||
<h1>{% block title %}Device Types{% endblock %}</h1>
|
<h1>{% block title %}Device Types{% endblock %}</h1>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -8,7 +8,12 @@
|
|||||||
<span class="fa fa-plus" aria-hidden="true"></span>
|
<span class="fa fa-plus" aria-hidden="true"></span>
|
||||||
Add a manufacturer
|
Add a manufacturer
|
||||||
</a>
|
</a>
|
||||||
|
<a href="{% url 'dcim:manufacturer_import' %}" class="btn btn-info">
|
||||||
|
<span class="fa fa-download" aria-hidden="true"></span>
|
||||||
|
Import manufacturers
|
||||||
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% include 'inc/export_button.html' with obj_type='manufacturers' %}
|
||||||
</div>
|
</div>
|
||||||
<h1>{% block title %}Manufacturers{% endblock %}</h1>
|
<h1>{% block title %}Manufacturers{% endblock %}</h1>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -8,7 +8,12 @@
|
|||||||
<span class="fa fa-plus" aria-hidden="true"></span>
|
<span class="fa fa-plus" aria-hidden="true"></span>
|
||||||
Add a rack group
|
Add a rack group
|
||||||
</a>
|
</a>
|
||||||
|
<a href="{% url 'dcim:rackgroup_import' %}" class="btn btn-info">
|
||||||
|
<span class="fa fa-download" aria-hidden="true"></span>
|
||||||
|
Import rack groups
|
||||||
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% include 'inc/export_button.html' with obj_type='rackgroups' %}
|
||||||
</div>
|
</div>
|
||||||
<h1>{% block title %}Rack Groups{% endblock %}</h1>
|
<h1>{% block title %}Rack Groups{% endblock %}</h1>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -8,7 +8,12 @@
|
|||||||
<span class="fa fa-plus" aria-hidden="true"></span>
|
<span class="fa fa-plus" aria-hidden="true"></span>
|
||||||
Add a region
|
Add a region
|
||||||
</a>
|
</a>
|
||||||
|
<a href="{% url 'dcim:region_import' %}" class="btn btn-info">
|
||||||
|
<span class="fa fa-download" aria-hidden="true"></span>
|
||||||
|
Import regions
|
||||||
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% include 'inc/export_button.html' with obj_type='regions' %}
|
||||||
</div>
|
</div>
|
||||||
<h1>{% block title %}Regions{% endblock %}</h1>
|
<h1>{% block title %}Regions{% endblock %}</h1>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
Loading…
Reference in New Issue
Block a user