From 82a98f0e8f31deaca9926f138c81545c04f150c9 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 Jul 2016 16:46:22 -0400 Subject: [PATCH] Applied tenancy to sites, racks, and devices --- netbox/dcim/api/serializers.py | 16 ++++++---- netbox/dcim/forms.py | 29 +++++++++++------ .../0012_site_rack_device_add_tenant.py | 32 +++++++++++++++++++ netbox/dcim/models.py | 7 ++++ netbox/dcim/tables.py | 20 ++++++++---- netbox/dcim/views.py | 2 +- netbox/templates/dcim/device.html | 10 ++++++ netbox/templates/dcim/device_bulk_edit.html | 1 + netbox/templates/dcim/device_edit.html | 1 + netbox/templates/dcim/device_import.html | 7 +++- netbox/templates/dcim/rack.html | 10 ++++++ netbox/templates/dcim/rack_bulk_edit.html | 1 + netbox/templates/dcim/rack_edit.html | 1 + netbox/templates/dcim/rack_import.html | 7 +++- netbox/templates/dcim/site.html | 10 ++++++ netbox/templates/dcim/site_edit.html | 1 + netbox/templates/dcim/site_import.html | 7 +++- 17 files changed, 135 insertions(+), 27 deletions(-) create mode 100644 netbox/dcim/migrations/0012_site_rack_device_add_tenant.py diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 9224ce2b3..7a6693c37 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -6,6 +6,7 @@ from dcim.models import ( DeviceRole, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, RACK_FACE_FRONT, RACK_FACE_REAR, Site, ) +from tenancy.api.serializers import TenantNestedSerializer # @@ -13,10 +14,11 @@ from dcim.models import ( # class SiteSerializer(serializers.ModelSerializer): + tenant = TenantNestedSerializer() class Meta: model = Site - fields = ['id', 'name', 'slug', 'facility', 'asn', 'physical_address', 'shipping_address', 'comments', + fields = ['id', 'name', 'slug', 'tenant', 'facility', 'asn', 'physical_address', 'shipping_address', 'comments', 'count_prefixes', 'count_vlans', 'count_racks', 'count_devices', 'count_circuits'] @@ -52,10 +54,11 @@ class RackGroupNestedSerializer(RackGroupSerializer): class RackSerializer(serializers.ModelSerializer): site = SiteNestedSerializer() group = RackGroupNestedSerializer() + tenant = TenantNestedSerializer() class Meta: model = Rack - fields = ['id', 'name', 'facility_id', 'display_name', 'site', 'group', 'u_height', 'comments'] + fields = ['id', 'name', 'facility_id', 'display_name', 'site', 'group', 'tenant', 'u_height', 'comments'] class RackNestedSerializer(RackSerializer): @@ -69,8 +72,8 @@ class RackDetailSerializer(RackSerializer): rear_units = serializers.SerializerMethodField() class Meta(RackSerializer.Meta): - fields = ['id', 'name', 'facility_id', 'display_name', 'site', 'group', 'u_height', 'comments', 'front_units', - 'rear_units'] + fields = ['id', 'name', 'facility_id', 'display_name', 'site', 'group', 'tenant', 'u_height', 'comments', + 'front_units', 'rear_units'] def get_front_units(self, obj): units = obj.get_rack_units(face=RACK_FACE_FRONT) @@ -218,6 +221,7 @@ class DeviceIPAddressNestedSerializer(serializers.ModelSerializer): class DeviceSerializer(serializers.ModelSerializer): device_type = DeviceTypeNestedSerializer() device_role = DeviceRoleNestedSerializer() + tenant = TenantNestedSerializer() platform = PlatformNestedSerializer() rack = RackNestedSerializer() primary_ip = DeviceIPAddressNestedSerializer() @@ -227,8 +231,8 @@ class DeviceSerializer(serializers.ModelSerializer): class Meta: model = Device - fields = ['id', 'name', 'display_name', 'device_type', 'device_role', 'platform', 'serial', 'rack', 'position', - 'face', 'parent_device', 'status', 'primary_ip', 'primary_ip4', 'primary_ip6', 'comments'] + fields = ['id', 'name', 'display_name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'rack', + 'position', 'face', 'parent_device', 'status', 'primary_ip', 'primary_ip4', 'primary_ip6', 'comments'] def get_parent_device(self, obj): try: diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 7befaf78a..c755a55a0 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -4,6 +4,7 @@ from django import forms from django.db.models import Count, Q from ipam.models import IPAddress +from tenancy.models import Tenant from utilities.forms import ( APISelect, BootstrapMixin, BulkImportForm, CommentField, CSVDataField, ExpandableNameField, FlexibleModelChoiceField, Livesearch, SelectWithDisabled, SmallTextarea, SlugField, @@ -48,7 +49,7 @@ class SiteForm(forms.ModelForm, BootstrapMixin): class Meta: model = Site - fields = ['name', 'slug', 'facility', 'asn', 'physical_address', 'shipping_address', 'comments'] + fields = ['name', 'slug', 'tenant', 'facility', 'asn', 'physical_address', 'shipping_address', 'comments'] widgets = { 'physical_address': SmallTextarea(attrs={'rows': 3}), 'shipping_address': SmallTextarea(attrs={'rows': 3}), @@ -63,10 +64,12 @@ class SiteForm(forms.ModelForm, BootstrapMixin): class SiteFromCSVForm(forms.ModelForm): + tenant = forms.ModelChoiceField(Tenant.objects.all(), to_field_name='name', required=False, + error_messages={'invalid_choice': 'Tenant not found.'}) class Meta: model = Site - fields = ['name', 'slug', 'facility', 'asn'] + fields = ['name', 'slug', 'tenant', 'facility', 'asn'] class SiteImportForm(BulkImportForm, BootstrapMixin): @@ -107,7 +110,7 @@ class RackForm(forms.ModelForm, BootstrapMixin): class Meta: model = Rack - fields = ['site', 'group', 'name', 'facility_id', 'u_height', 'comments'] + fields = ['site', 'group', 'name', 'facility_id', 'tenant', 'u_height', 'comments'] help_texts = { 'site': "The site at which the rack exists", 'name': "Organizational rack name", @@ -135,10 +138,12 @@ class RackFromCSVForm(forms.ModelForm): site = forms.ModelChoiceField(queryset=Site.objects.all(), to_field_name='name', error_messages={'invalid_choice': 'Site not found.'}) group_name = forms.CharField(required=False) + tenant = forms.ModelChoiceField(Tenant.objects.all(), to_field_name='name', required=False, + error_messages={'invalid_choice': 'Tenant not found.'}) class Meta: model = Rack - fields = ['site', 'group_name', 'name', 'facility_id', 'u_height'] + fields = ['site', 'group_name', 'name', 'facility_id', 'tenant', 'u_height'] def clean(self): @@ -161,6 +166,7 @@ class RackBulkEditForm(forms.Form, BootstrapMixin): pk = forms.ModelMultipleChoiceField(queryset=Rack.objects.all(), widget=forms.MultipleHiddenInput) site = forms.ModelChoiceField(queryset=Site.objects.all(), required=False) group = forms.ModelChoiceField(queryset=RackGroup.objects.all(), required=False) + tenant = forms.ModelChoiceField(queryset=Tenant.objects.all(), required=False) u_height = forms.IntegerField(required=False, label='Height (U)') comments = CommentField() @@ -203,8 +209,8 @@ class DeviceTypeForm(forms.ModelForm, BootstrapMixin): 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'] + fields = ['manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'is_console_server', + 'is_pdu', 'is_network_device', 'subdevice_role'] class DeviceTypeBulkEditForm(forms.Form, BootstrapMixin): @@ -324,7 +330,7 @@ class DeviceForm(forms.ModelForm, BootstrapMixin): class Meta: model = Device - fields = ['name', 'device_role', 'device_type', 'serial', 'site', 'rack', 'position', 'face', 'status', + fields = ['name', 'device_role', 'tenant', 'device_type', 'serial', 'site', 'rack', 'position', 'face', 'status', 'platform', 'primary_ip4', 'primary_ip6', 'comments'] help_texts = { 'device_role': "The function this device serves", @@ -410,6 +416,8 @@ class DeviceForm(forms.ModelForm, BootstrapMixin): class BaseDeviceFromCSVForm(forms.ModelForm): device_role = forms.ModelChoiceField(queryset=DeviceRole.objects.all(), to_field_name='name', error_messages={'invalid_choice': 'Invalid device role.'}) + tenant = forms.ModelChoiceField(Tenant.objects.all(), to_field_name='name', required=False, + error_messages={'invalid_choice': 'Tenant not found.'}) manufacturer = forms.ModelChoiceField(queryset=Manufacturer.objects.all(), to_field_name='name', error_messages={'invalid_choice': 'Invalid manufacturer.'}) model_name = forms.CharField() @@ -441,8 +449,8 @@ class DeviceFromCSVForm(BaseDeviceFromCSVForm): face = forms.CharField(required=False) class Meta(BaseDeviceFromCSVForm.Meta): - fields = ['name', 'device_role', 'manufacturer', 'model_name', 'platform', 'serial', 'site', 'rack_name', - 'position', 'face'] + fields = ['name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'site', + 'rack_name', 'position', 'face'] def clean(self): @@ -477,7 +485,7 @@ class ChildDeviceFromCSVForm(BaseDeviceFromCSVForm): device_bay_name = forms.CharField(required=False) class Meta(BaseDeviceFromCSVForm.Meta): - fields = ['name', 'device_role', 'manufacturer', 'model_name', 'platform', 'serial', 'parent', + fields = ['name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'parent', 'device_bay_name'] def clean(self): @@ -512,6 +520,7 @@ class DeviceBulkEditForm(forms.Form, BootstrapMixin): pk = forms.ModelMultipleChoiceField(queryset=Device.objects.all(), widget=forms.MultipleHiddenInput) device_type = forms.ModelChoiceField(queryset=DeviceType.objects.all(), required=False, label='Type') device_role = forms.ModelChoiceField(queryset=DeviceRole.objects.all(), required=False, label='Role') + tenant = forms.ModelChoiceField(queryset=Tenant.objects.all(), required=False, label='Tenant') platform = forms.ModelChoiceField(queryset=Platform.objects.all(), required=False, label='Platform') platform_delete = forms.BooleanField(required=False, label='Set platform to "none"') status = forms.ChoiceField(choices=FORM_STATUS_CHOICES, required=False, initial='', label='Status') diff --git a/netbox/dcim/migrations/0012_site_rack_device_add_tenant.py b/netbox/dcim/migrations/0012_site_rack_device_add_tenant.py new file mode 100644 index 000000000..f1092b4fa --- /dev/null +++ b/netbox/dcim/migrations/0012_site_rack_device_add_tenant.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8 on 2016-07-26 20:06 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('tenancy', '0001_initial'), + ('dcim', '0011_devicetype_part_number'), + ] + + operations = [ + migrations.AddField( + model_name='device', + name='tenant', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='tenancy.Tenant'), + ), + migrations.AddField( + model_name='rack', + name='tenant', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='tenancy.Tenant'), + ), + migrations.AddField( + model_name='site', + name='tenant', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='tenancy.Tenant'), + ), + ] diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index fc77e318b..aab81806f 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -8,6 +8,7 @@ from django.db import models from django.db.models import Count, Q, ObjectDoesNotExist from extras.rpc import RPC_CLIENTS +from tenancy.models import Tenant from utilities.fields import NullableCharField from utilities.managers import NaturalOrderByManager from utilities.models import CreatedUpdatedModel @@ -152,6 +153,7 @@ class Site(CreatedUpdatedModel): """ name = models.CharField(max_length=50, unique=True) slug = models.SlugField(unique=True) + tenant = models.ForeignKey(Tenant, blank=True, null=True, on_delete=models.PROTECT) facility = models.CharField(max_length=50, blank=True) asn = ASNField(blank=True, null=True, verbose_name='ASN') physical_address = models.CharField(max_length=200, blank=True) @@ -173,6 +175,7 @@ class Site(CreatedUpdatedModel): return ','.join([ self.name, self.slug, + self.tenant.name if self.tenant else '', self.facility, str(self.asn), ]) @@ -237,6 +240,7 @@ class Rack(CreatedUpdatedModel): facility_id = NullableCharField(max_length=30, blank=True, null=True, verbose_name='Facility ID') site = models.ForeignKey('Site', related_name='racks', on_delete=models.PROTECT) group = models.ForeignKey('RackGroup', related_name='racks', blank=True, null=True, on_delete=models.SET_NULL) + tenant = models.ForeignKey(Tenant, blank=True, null=True, on_delete=models.PROTECT) u_height = models.PositiveSmallIntegerField(default=42, verbose_name='Height (U)') comments = models.TextField(blank=True) @@ -272,6 +276,7 @@ class Rack(CreatedUpdatedModel): self.group.name if self.group else '', self.name, self.facility_id or '', + self.tenant.name if self.tenant else '', str(self.u_height), ]) @@ -631,6 +636,7 @@ class Device(CreatedUpdatedModel): """ device_type = models.ForeignKey('DeviceType', related_name='instances', on_delete=models.PROTECT) device_role = models.ForeignKey('DeviceRole', related_name='devices', on_delete=models.PROTECT) + tenant = models.ForeignKey(Tenant, blank=True, null=True, on_delete=models.PROTECT) platform = models.ForeignKey('Platform', related_name='devices', blank=True, null=True, on_delete=models.SET_NULL) name = NullableCharField(max_length=50, blank=True, null=True, unique=True) serial = models.CharField(max_length=50, blank=True, verbose_name='Serial number') @@ -724,6 +730,7 @@ class Device(CreatedUpdatedModel): return ','.join([ self.name or '', self.device_role.name, + self.tenant.name if self.tenant else '', self.device_type.manufacturer.name, self.device_type.model, self.platform.name if self.platform else '', diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index 373a2e0c0..75ad3fb72 100644 --- a/netbox/dcim/tables.py +++ b/netbox/dcim/tables.py @@ -61,6 +61,7 @@ UTILIZATION_GRAPH = """ class SiteTable(BaseTable): name = tables.LinkColumn('dcim:site', args=[Accessor('slug')], verbose_name='Name') facility = tables.Column(verbose_name='Facility') + tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant') asn = tables.Column(verbose_name='ASN') rack_count = tables.Column(accessor=Accessor('count_racks'), orderable=False, verbose_name='Racks') device_count = tables.Column(accessor=Accessor('count_devices'), orderable=False, verbose_name='Devices') @@ -70,7 +71,7 @@ class SiteTable(BaseTable): class Meta(BaseTable.Meta): model = Site - fields = ('name', 'facility', 'asn', 'rack_count', 'device_count', 'prefix_count', 'vlan_count', + fields = ('name', 'facility', 'tenant', 'asn', 'rack_count', 'device_count', 'prefix_count', 'vlan_count', 'circuit_count') @@ -101,14 +102,16 @@ class RackTable(BaseTable): site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site') group = tables.Column(accessor=Accessor('group.name'), verbose_name='Group') facility_id = tables.Column(verbose_name='Facility ID') - u_height = tables.Column(verbose_name='Height (U)') + tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant') + u_height = tables.TemplateColumn("{{ record.u_height }}U", verbose_name='Height') devices = tables.Column(accessor=Accessor('device_count'), verbose_name='Devices') - u_consumed = tables.Column(accessor=Accessor('u_consumed'), verbose_name='Used (U)') + u_consumed = tables.TemplateColumn("{{ record.u_consumed|default:'0' }}U", verbose_name='Used') utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization') class Meta(BaseTable.Meta): model = Rack - fields = ('pk', 'name', 'site', 'group', 'facility_id', 'u_height', 'devices', 'u_consumed', 'utilization') + fields = ('pk', 'name', 'site', 'group', 'facility_id', 'tenant', 'u_height', 'devices', 'u_consumed', + 'utilization') class RackImportTable(BaseTable): @@ -116,11 +119,12 @@ class RackImportTable(BaseTable): site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site') group = tables.Column(accessor=Accessor('group.name'), verbose_name='Group') facility_id = tables.Column(verbose_name='Facility ID') + tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant') u_height = tables.Column(verbose_name='Height (U)') class Meta(BaseTable.Meta): model = Rack - fields = ('site', 'group', 'name', 'facility_id', 'u_height') + fields = ('site', 'group', 'name', 'facility_id', 'tenant', 'u_height') # @@ -259,6 +263,7 @@ class DeviceTable(BaseTable): pk = ToggleColumn() status = tables.TemplateColumn(template_code=STATUS_ICON, verbose_name='') name = tables.TemplateColumn(template_code=DEVICE_LINK, verbose_name='Name') + tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant') site = tables.Column(accessor=Accessor('rack.site'), verbose_name='Site') rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')], verbose_name='Rack') device_role = tables.Column(verbose_name='Role') @@ -268,11 +273,12 @@ class DeviceTable(BaseTable): class Meta(BaseTable.Meta): model = Device - fields = ('pk', 'name', 'status', 'site', 'rack', 'device_role', 'device_type', 'primary_ip') + fields = ('pk', 'name', 'status', 'tenant', 'site', 'rack', 'device_role', 'device_type', 'primary_ip') class DeviceImportTable(BaseTable): name = tables.TemplateColumn(template_code=DEVICE_LINK, verbose_name='Name') + tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant') site = tables.Column(accessor=Accessor('rack.site'), verbose_name='Site') rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')], verbose_name='Rack') position = tables.Column(verbose_name='Position') @@ -281,7 +287,7 @@ class DeviceImportTable(BaseTable): class Meta(BaseTable.Meta): model = Device - fields = ('name', 'site', 'rack', 'position', 'device_role', 'device_type') + fields = ('name', 'tenant', 'site', 'rack', 'position', 'device_role', 'device_type') empty_text = False diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 464418ac8..0d1034974 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -61,7 +61,7 @@ def expand_pattern(string): # class SiteListView(ObjectListView): - queryset = Site.objects.all() + queryset = Site.objects.select_related('tenant') filter = filters.SiteFilter table = tables.SiteTable template_name = 'dcim/site_list.html' diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 700a001bc..2a0a7dee1 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -14,6 +14,16 @@ Device + + + + + {% endfor %} diff --git a/netbox/templates/dcim/device_edit.html b/netbox/templates/dcim/device_edit.html index b0142dcb0..726e397cd 100644 --- a/netbox/templates/dcim/device_edit.html +++ b/netbox/templates/dcim/device_edit.html @@ -7,6 +7,7 @@
{% render_field form.name %} {% render_field form.device_role %} + {% render_field form.tenant %}
diff --git a/netbox/templates/dcim/device_import.html b/netbox/templates/dcim/device_import.html index f0d1cca6d..83e99e63b 100644 --- a/netbox/templates/dcim/device_import.html +++ b/netbox/templates/dcim/device_import.html @@ -36,6 +36,11 @@
+ + + + + @@ -79,7 +84,7 @@
Tenant + {% if device.tenant %} + {{ device.tenant }} + {% else %} + None + {% endif %} +
Site diff --git a/netbox/templates/dcim/device_bulk_edit.html b/netbox/templates/dcim/device_bulk_edit.html index bd617eab9..8a9e08136 100644 --- a/netbox/templates/dcim/device_bulk_edit.html +++ b/netbox/templates/dcim/device_bulk_edit.html @@ -9,6 +9,7 @@ {{ device }} {{ device.device_type }} {{ device.device_role }}{{ device.tenant }} {{ device.serial }}
Functional role of device ToR Switch
TenantName of tenant (optional)Pied Piper
Device manufacturer Hardware manufacturer

Example

-
rack101_sw1,ToR Switch,Juniper,EX4300-48T,Juniper Junos,CAB00577291,Ashburn-VA,R101,21,Rear
+
rack101_sw1,ToR Switch,Pied Piper,Juniper,EX4300-48T,Juniper Junos,CAB00577291,Ashburn-VA,R101,21,Rear
{% endblock %} diff --git a/netbox/templates/dcim/rack.html b/netbox/templates/dcim/rack.html index 552716d39..93df009b9 100644 --- a/netbox/templates/dcim/rack.html +++ b/netbox/templates/dcim/rack.html @@ -86,6 +86,16 @@ {% endif %} + + Tenant + + {% if rack.tenant %} + {{ rack.tenant }} + {% else %} + None + {% endif %} + + Height {{ rack.u_height }}U diff --git a/netbox/templates/dcim/rack_bulk_edit.html b/netbox/templates/dcim/rack_bulk_edit.html index 2d58a1556..1085dd1e2 100644 --- a/netbox/templates/dcim/rack_bulk_edit.html +++ b/netbox/templates/dcim/rack_bulk_edit.html @@ -9,6 +9,7 @@ {{ rack }} {{ rack.facility_id }} {{ rack.site }} + {{ rack.tenant }} {{ rack.u_height }} {% endfor %} diff --git a/netbox/templates/dcim/rack_edit.html b/netbox/templates/dcim/rack_edit.html index 990b25465..ab055e8ee 100644 --- a/netbox/templates/dcim/rack_edit.html +++ b/netbox/templates/dcim/rack_edit.html @@ -9,6 +9,7 @@ {% render_field form.group %} {% render_field form.name %} {% render_field form.facility_id %} + {% render_field form.tenant %} {% render_field form.u_height %} diff --git a/netbox/templates/dcim/rack_import.html b/netbox/templates/dcim/rack_import.html index f370a6242..b6e797d39 100644 --- a/netbox/templates/dcim/rack_import.html +++ b/netbox/templates/dcim/rack_import.html @@ -48,6 +48,11 @@ Rack ID assigned by the facility (optional) J12.100 + + Tenant + Name of tenant (optional) + Pied Piper + Height Height in rack units @@ -56,7 +61,7 @@

Example

-
DC-4,Cage 1400,R101,J12.100,42
+
DC-4,Cage 1400,R101,J12.100,Pied Piper,42
{% endblock %} diff --git a/netbox/templates/dcim/site.html b/netbox/templates/dcim/site.html index a9db55e19..28562c088 100644 --- a/netbox/templates/dcim/site.html +++ b/netbox/templates/dcim/site.html @@ -52,6 +52,16 @@ Site + + + + diff --git a/netbox/templates/dcim/site_edit.html b/netbox/templates/dcim/site_edit.html index b951cefc1..405f3fd52 100644 --- a/netbox/templates/dcim/site_edit.html +++ b/netbox/templates/dcim/site_edit.html @@ -7,6 +7,7 @@
{% render_field form.name %} {% render_field form.slug %} + {% render_field form.tenant %} {% render_field form.facility %} {% render_field form.asn %} {% render_field form.physical_address %} diff --git a/netbox/templates/dcim/site_import.html b/netbox/templates/dcim/site_import.html index 4c2c79fef..030a3aaa0 100644 --- a/netbox/templates/dcim/site_import.html +++ b/netbox/templates/dcim/site_import.html @@ -38,6 +38,11 @@
+ + + + + @@ -51,7 +56,7 @@
Tenant + {% if site.tenant %} + {{ site.tenant }} + {% else %} + None + {% endif %} +
Facility {{ site.facility }}URL-friendly name ash4-south
TenantName of tenant (optional)Pied Piper
Facility Name of the hosting facility (optional)

Example

-
ASH-4 South,ash4-south,Equinix DC6,65000
+
ASH-4 South,ash4-south,Pied Piper,Equinix DC6,65000
{% endblock %}