mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-23 04:22:01 -06:00
Renamed ConsolePort.cs_port to connected_endpoint
This commit is contained in:
parent
ea0de629df
commit
1595a5ecd7
@ -504,8 +504,8 @@ class ConsoleServerPortSerializer(TaggitSerializer, ValidatedModelSerializer):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ConsoleServerPort
|
model = ConsoleServerPort
|
||||||
fields = ['id', 'device', 'name', 'connected_console', 'tags']
|
fields = ['id', 'device', 'name', 'connected_endpoint', 'tags']
|
||||||
read_only_fields = ['connected_console']
|
read_only_fields = ['connected_endpoint']
|
||||||
|
|
||||||
|
|
||||||
class NestedConsoleServerPortSerializer(WritableNestedSerializer):
|
class NestedConsoleServerPortSerializer(WritableNestedSerializer):
|
||||||
@ -518,7 +518,7 @@ class NestedConsoleServerPortSerializer(WritableNestedSerializer):
|
|||||||
fields = ['id', 'url', 'device', 'name', 'is_connected']
|
fields = ['id', 'url', 'device', 'name', 'is_connected']
|
||||||
|
|
||||||
def get_is_connected(self, obj):
|
def get_is_connected(self, obj):
|
||||||
return hasattr(obj, 'connected_console') and obj.connected_console is not None
|
return hasattr(obj, 'connected_endpoint') and obj.connected_endpoint is not None
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -527,12 +527,12 @@ class NestedConsoleServerPortSerializer(WritableNestedSerializer):
|
|||||||
|
|
||||||
class ConsolePortSerializer(TaggitSerializer, ValidatedModelSerializer):
|
class ConsolePortSerializer(TaggitSerializer, ValidatedModelSerializer):
|
||||||
device = NestedDeviceSerializer()
|
device = NestedDeviceSerializer()
|
||||||
cs_port = NestedConsoleServerPortSerializer(required=False, allow_null=True)
|
connected_endpoint = NestedConsoleServerPortSerializer(required=False, allow_null=True)
|
||||||
tags = TagListSerializerField(required=False)
|
tags = TagListSerializerField(required=False)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ConsolePort
|
model = ConsolePort
|
||||||
fields = ['id', 'device', 'name', 'cs_port', 'connection_status', 'tags']
|
fields = ['id', 'device', 'name', 'connected_endpoint', 'connection_status', 'tags']
|
||||||
|
|
||||||
|
|
||||||
class NestedConsolePortSerializer(TaggitSerializer, ValidatedModelSerializer):
|
class NestedConsolePortSerializer(TaggitSerializer, ValidatedModelSerializer):
|
||||||
@ -545,7 +545,7 @@ class NestedConsolePortSerializer(TaggitSerializer, ValidatedModelSerializer):
|
|||||||
fields = ['id', 'url', 'device', 'name', 'is_connected']
|
fields = ['id', 'url', 'device', 'name', 'is_connected']
|
||||||
|
|
||||||
def get_is_connected(self, obj):
|
def get_is_connected(self, obj):
|
||||||
return obj.cs_port is not None
|
return obj.connected_endpoint is not None
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -331,13 +331,13 @@ class DeviceViewSet(CustomFieldModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class ConsolePortViewSet(ModelViewSet):
|
class ConsolePortViewSet(ModelViewSet):
|
||||||
queryset = ConsolePort.objects.select_related('device', 'cs_port__device').prefetch_related('tags')
|
queryset = ConsolePort.objects.select_related('device', 'connected_endpoint__device').prefetch_related('tags')
|
||||||
serializer_class = serializers.ConsolePortSerializer
|
serializer_class = serializers.ConsolePortSerializer
|
||||||
filter_class = filters.ConsolePortFilter
|
filter_class = filters.ConsolePortFilter
|
||||||
|
|
||||||
|
|
||||||
class ConsoleServerPortViewSet(ModelViewSet):
|
class ConsoleServerPortViewSet(ModelViewSet):
|
||||||
queryset = ConsoleServerPort.objects.select_related('device', 'connected_console__device').prefetch_related('tags')
|
queryset = ConsoleServerPort.objects.select_related('device', 'connected_endpoint__device').prefetch_related('tags')
|
||||||
serializer_class = serializers.ConsoleServerPortSerializer
|
serializer_class = serializers.ConsoleServerPortSerializer
|
||||||
filter_class = filters.ConsoleServerPortFilter
|
filter_class = filters.ConsoleServerPortFilter
|
||||||
|
|
||||||
@ -399,7 +399,7 @@ class InventoryItemViewSet(ModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class ConsoleConnectionViewSet(ListModelMixin, GenericViewSet):
|
class ConsoleConnectionViewSet(ListModelMixin, GenericViewSet):
|
||||||
queryset = ConsolePort.objects.select_related('device', 'cs_port__device').filter(cs_port__isnull=False)
|
queryset = ConsolePort.objects.select_related('device', 'connected_endpoint__device').filter(connected_endpoint__isnull=False)
|
||||||
serializer_class = serializers.ConsolePortSerializer
|
serializer_class = serializers.ConsolePortSerializer
|
||||||
filter_class = filters.ConsoleConnectionFilter
|
filter_class = filters.ConsoleConnectionFilter
|
||||||
|
|
||||||
|
@ -803,14 +803,14 @@ class ConsoleConnectionFilter(django_filters.FilterSet):
|
|||||||
def filter_site(self, queryset, name, value):
|
def filter_site(self, queryset, name, value):
|
||||||
if not value.strip():
|
if not value.strip():
|
||||||
return queryset
|
return queryset
|
||||||
return queryset.filter(cs_port__device__site__slug=value)
|
return queryset.filter(connected_endpoint__device__site__slug=value)
|
||||||
|
|
||||||
def filter_device(self, queryset, name, value):
|
def filter_device(self, queryset, name, value):
|
||||||
if not value.strip():
|
if not value.strip():
|
||||||
return queryset
|
return queryset
|
||||||
return queryset.filter(
|
return queryset.filter(
|
||||||
Q(device__name__icontains=value) |
|
Q(device__name__icontains=value) |
|
||||||
Q(cs_port__device__name__icontains=value)
|
Q(connected_endpoint__device__name__icontains=value)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -2151,7 +2151,7 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"device": 1,
|
"device": 1,
|
||||||
"name": "Console (RE0)",
|
"name": "Console (RE0)",
|
||||||
"cs_port": 27,
|
"connected_endpoint": 27,
|
||||||
"connection_status": true
|
"connection_status": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2161,7 +2161,7 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"device": 1,
|
"device": 1,
|
||||||
"name": "Console (RE1)",
|
"name": "Console (RE1)",
|
||||||
"cs_port": 38,
|
"connected_endpoint": 38,
|
||||||
"connection_status": true
|
"connection_status": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2171,7 +2171,7 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"device": 2,
|
"device": 2,
|
||||||
"name": "Console (RE0)",
|
"name": "Console (RE0)",
|
||||||
"cs_port": 5,
|
"connected_endpoint": 5,
|
||||||
"connection_status": true
|
"connection_status": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2181,7 +2181,7 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"device": 2,
|
"device": 2,
|
||||||
"name": "Console (RE1)",
|
"name": "Console (RE1)",
|
||||||
"cs_port": 16,
|
"connected_endpoint": 16,
|
||||||
"connection_status": true
|
"connection_status": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2191,7 +2191,7 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"device": 3,
|
"device": 3,
|
||||||
"name": "Console",
|
"name": "Console",
|
||||||
"cs_port": 49,
|
"connected_endpoint": 49,
|
||||||
"connection_status": true
|
"connection_status": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2201,7 +2201,7 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"device": 4,
|
"device": 4,
|
||||||
"name": "Console",
|
"name": "Console",
|
||||||
"cs_port": 48,
|
"connected_endpoint": 48,
|
||||||
"connection_status": true
|
"connection_status": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2211,7 +2211,7 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"device": 5,
|
"device": 5,
|
||||||
"name": "Console",
|
"name": "Console",
|
||||||
"cs_port": null,
|
"connected_endpoint": null,
|
||||||
"connection_status": true
|
"connection_status": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2221,7 +2221,7 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"device": 6,
|
"device": 6,
|
||||||
"name": "Console",
|
"name": "Console",
|
||||||
"cs_port": null,
|
"connected_endpoint": null,
|
||||||
"connection_status": true
|
"connection_status": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2231,7 +2231,7 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"device": 7,
|
"device": 7,
|
||||||
"name": "Console (RE0)",
|
"name": "Console (RE0)",
|
||||||
"cs_port": null,
|
"connected_endpoint": null,
|
||||||
"connection_status": true
|
"connection_status": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2241,7 +2241,7 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"device": 7,
|
"device": 7,
|
||||||
"name": "Console (RE1)",
|
"name": "Console (RE1)",
|
||||||
"cs_port": null,
|
"connected_endpoint": null,
|
||||||
"connection_status": true
|
"connection_status": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2251,7 +2251,7 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"device": 8,
|
"device": 8,
|
||||||
"name": "Console (RE0)",
|
"name": "Console (RE0)",
|
||||||
"cs_port": null,
|
"connected_endpoint": null,
|
||||||
"connection_status": true
|
"connection_status": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2261,7 +2261,7 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"device": 8,
|
"device": 8,
|
||||||
"name": "Console (RE1)",
|
"name": "Console (RE1)",
|
||||||
"cs_port": null,
|
"connected_endpoint": null,
|
||||||
"connection_status": true
|
"connection_status": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2271,7 +2271,7 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"device": 9,
|
"device": 9,
|
||||||
"name": "Console",
|
"name": "Console",
|
||||||
"cs_port": null,
|
"connected_endpoint": null,
|
||||||
"connection_status": true
|
"connection_status": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2281,7 +2281,7 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"device": 11,
|
"device": 11,
|
||||||
"name": "Serial",
|
"name": "Serial",
|
||||||
"cs_port": null,
|
"connected_endpoint": null,
|
||||||
"connection_status": true
|
"connection_status": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2291,7 +2291,7 @@
|
|||||||
"fields": {
|
"fields": {
|
||||||
"device": 12,
|
"device": 12,
|
||||||
"name": "Serial",
|
"name": "Serial",
|
||||||
"cs_port": null,
|
"connected_endpoint": null,
|
||||||
"connection_status": true
|
"connection_status": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -1301,8 +1301,8 @@ class ConsoleConnectionCSVForm(forms.ModelForm):
|
|||||||
'invalid_choice': 'Console server not found',
|
'invalid_choice': 'Console server not found',
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
cs_port = forms.CharField(
|
connected_endpoint = forms.CharField(
|
||||||
help_text='Console server port name'
|
help_text='Console server port'
|
||||||
)
|
)
|
||||||
device = FlexibleModelChoiceField(
|
device = FlexibleModelChoiceField(
|
||||||
queryset=Device.objects.all(),
|
queryset=Device.objects.all(),
|
||||||
@ -1322,7 +1322,7 @@ class ConsoleConnectionCSVForm(forms.ModelForm):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ConsolePort
|
model = ConsolePort
|
||||||
fields = ['console_server', 'cs_port', 'device', 'console_port', 'connection_status']
|
fields = ['console_server', 'connected_endpoint', 'device', 'console_port', 'connection_status']
|
||||||
|
|
||||||
def clean_console_port(self):
|
def clean_console_port(self):
|
||||||
|
|
||||||
@ -1336,7 +1336,7 @@ class ConsoleConnectionCSVForm(forms.ModelForm):
|
|||||||
device=self.cleaned_data['device'], name=console_port_name
|
device=self.cleaned_data['device'], name=console_port_name
|
||||||
)
|
)
|
||||||
# Check if the console port is already connected
|
# Check if the console port is already connected
|
||||||
if consoleport.cs_port is not None:
|
if consoleport.connected_endpoint is not None:
|
||||||
raise forms.ValidationError("{} {} is already connected".format(
|
raise forms.ValidationError("{} {} is already connected".format(
|
||||||
self.cleaned_data['device'], console_port_name
|
self.cleaned_data['device'], console_port_name
|
||||||
))
|
))
|
||||||
@ -1348,28 +1348,28 @@ class ConsoleConnectionCSVForm(forms.ModelForm):
|
|||||||
self.instance = consoleport
|
self.instance = consoleport
|
||||||
return consoleport
|
return consoleport
|
||||||
|
|
||||||
def clean_cs_port(self):
|
def clean_connected_endpoint(self):
|
||||||
|
|
||||||
cs_port_name = self.cleaned_data.get('cs_port')
|
consoleserverport_name = self.cleaned_data.get('connected_endpoint')
|
||||||
if not self.cleaned_data.get('console_server') or not cs_port_name:
|
if not self.cleaned_data.get('console_server') or not consoleserverport_name:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Retrieve console server port by name
|
# Retrieve console server port by name
|
||||||
cs_port = ConsoleServerPort.objects.get(
|
consoleserverport = ConsoleServerPort.objects.get(
|
||||||
device=self.cleaned_data['console_server'], name=cs_port_name
|
device=self.cleaned_data['console_server'], name=consoleserverport_name
|
||||||
)
|
)
|
||||||
# Check if the console server port is already connected
|
# Check if the console server port is already connected
|
||||||
if ConsolePort.objects.filter(cs_port=cs_port).count():
|
if ConsolePort.objects.filter(connected_endpoint=consoleserverport).count():
|
||||||
raise forms.ValidationError("{} {} is already connected".format(
|
raise forms.ValidationError("{} {} is already connected".format(
|
||||||
self.cleaned_data['console_server'], cs_port_name
|
self.cleaned_data['console_server'], consoleserverport_name
|
||||||
))
|
))
|
||||||
except ConsoleServerPort.DoesNotExist:
|
except ConsoleServerPort.DoesNotExist:
|
||||||
raise forms.ValidationError("Invalid console server port ({} {})".format(
|
raise forms.ValidationError("Invalid console server port ({} {})".format(
|
||||||
self.cleaned_data['console_server'], cs_port_name
|
self.cleaned_data['console_server'], consoleserverport_name
|
||||||
))
|
))
|
||||||
|
|
||||||
return cs_port
|
return consoleserverport
|
||||||
|
|
||||||
|
|
||||||
class ConsolePortConnectionForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelForm):
|
class ConsolePortConnectionForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelForm):
|
||||||
@ -1403,7 +1403,7 @@ class ConsolePortConnectionForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelF
|
|||||||
widget=APISelect(
|
widget=APISelect(
|
||||||
api_url='/api/dcim/devices/?site_id={{site}}&rack_id={{rack}}&is_console_server=True',
|
api_url='/api/dcim/devices/?site_id={{site}}&rack_id={{rack}}&is_console_server=True',
|
||||||
display_field='display_name',
|
display_field='display_name',
|
||||||
attrs={'filter-for': 'cs_port'}
|
attrs={'filter-for': 'connected_endpoint'}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
livesearch = forms.CharField(
|
livesearch = forms.CharField(
|
||||||
@ -1415,7 +1415,7 @@ class ConsolePortConnectionForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelF
|
|||||||
field_to_update='console_server',
|
field_to_update='console_server',
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
cs_port = ChainedModelChoiceField(
|
connected_endpoint = ChainedModelChoiceField(
|
||||||
queryset=ConsoleServerPort.objects.all(),
|
queryset=ConsoleServerPort.objects.all(),
|
||||||
chains=(
|
chains=(
|
||||||
('device', 'console_server'),
|
('device', 'console_server'),
|
||||||
@ -1429,9 +1429,9 @@ class ConsolePortConnectionForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelF
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ConsolePort
|
model = ConsolePort
|
||||||
fields = ['site', 'rack', 'console_server', 'livesearch', 'cs_port', 'connection_status']
|
fields = ['site', 'rack', 'console_server', 'livesearch', 'connected_endpoint', 'connection_status']
|
||||||
labels = {
|
labels = {
|
||||||
'cs_port': 'Port',
|
'connected_endpoint': 'Port',
|
||||||
'connection_status': 'Status',
|
'connection_status': 'Status',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
# Generated by Django 2.0.8 on 2018-10-18 19:41
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
import utilities.fields
|
import utilities.fields
|
||||||
@ -19,13 +17,13 @@ def console_connections_to_cables(apps, schema_editor):
|
|||||||
consoleserverport_type = ContentType.objects.get_for_model(ConsoleServerPort)
|
consoleserverport_type = ContentType.objects.get_for_model(ConsoleServerPort)
|
||||||
|
|
||||||
# Create a new Cable instance from each console connection
|
# Create a new Cable instance from each console connection
|
||||||
for consoleport in ConsolePort.objects.filter(cs_port__isnull=False):
|
for consoleport in ConsolePort.objects.filter(connected_endpoint__isnull=False):
|
||||||
c = Cable()
|
c = Cable()
|
||||||
# We have to assign GFK fields manually because we're inside a migration.
|
# We have to assign GFK fields manually because we're inside a migration.
|
||||||
c.endpoint_a_type = consoleport_type
|
c.endpoint_a_type = consoleport_type
|
||||||
c.endpoint_a_id = consoleport.id
|
c.endpoint_a_id = consoleport.id
|
||||||
c.endpoint_b_type = consoleserverport_type
|
c.endpoint_b_type = consoleserverport_type
|
||||||
c.endpoint_b_id = consoleport.cs_port_id
|
c.endpoint_b_id = consoleport.connected_endpoint_id
|
||||||
c.connection_status = consoleport.connection_status
|
c.connection_status = consoleport.connection_status
|
||||||
c.save()
|
c.save()
|
||||||
|
|
||||||
@ -87,6 +85,8 @@ class Migration(migrations.Migration):
|
|||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
|
|
||||||
|
# Create the Cable model
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Cable',
|
name='Cable',
|
||||||
fields=[
|
fields=[
|
||||||
@ -99,8 +99,8 @@ class Migration(migrations.Migration):
|
|||||||
('status', models.BooleanField(default=True)),
|
('status', models.BooleanField(default=True)),
|
||||||
('label', models.CharField(blank=True, max_length=100)),
|
('label', models.CharField(blank=True, max_length=100)),
|
||||||
('color', utilities.fields.ColorField(blank=True, max_length=6)),
|
('color', utilities.fields.ColorField(blank=True, max_length=6)),
|
||||||
('endpoint_a_type', models.ForeignKey(limit_choices_to={'model__in': ('consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontpanelport', 'rearpanelport')}, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.ContentType')),
|
('endpoint_a_type', models.ForeignKey(limit_choices_to={'model__in': ['consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontpanelport', 'rearpanelport']}, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.ContentType')),
|
||||||
('endpoint_b_type', models.ForeignKey(limit_choices_to={'model__in': ('consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontpanelport', 'rearpanelport')}, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.ContentType')),
|
('endpoint_b_type', models.ForeignKey(limit_choices_to={'model__in': ['consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontpanelport', 'rearpanelport']}, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.ContentType')),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.AlterUniqueTogether(
|
migrations.AlterUniqueTogether(
|
||||||
@ -108,6 +108,23 @@ class Migration(migrations.Migration):
|
|||||||
unique_together={('endpoint_b_type', 'endpoint_b_id'), ('endpoint_a_type', 'endpoint_a_id')},
|
unique_together={('endpoint_b_type', 'endpoint_b_id'), ('endpoint_a_type', 'endpoint_a_id')},
|
||||||
),
|
),
|
||||||
|
|
||||||
|
# Rename model fields
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='consoleport',
|
||||||
|
old_name='cs_port',
|
||||||
|
new_name='connected_endpoint'
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='consoleport',
|
||||||
|
name='connected_endpoint',
|
||||||
|
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='connected_endpoint', to='dcim.ConsoleServerPort'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='consoleserverport',
|
||||||
|
name='device',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consoleserverports', to='dcim.Device'),
|
||||||
|
),
|
||||||
|
|
||||||
# Copy console/power/interface connections as Cables
|
# Copy console/power/interface connections as Cables
|
||||||
migrations.RunPython(console_connections_to_cables),
|
migrations.RunPython(console_connections_to_cables),
|
||||||
migrations.RunPython(power_connections_to_cables),
|
migrations.RunPython(power_connections_to_cables),
|
||||||
|
@ -1629,11 +1629,10 @@ class ConsolePort(ComponentModel):
|
|||||||
name = models.CharField(
|
name = models.CharField(
|
||||||
max_length=50
|
max_length=50
|
||||||
)
|
)
|
||||||
cs_port = models.OneToOneField(
|
connected_endpoint = models.OneToOneField(
|
||||||
to='dcim.ConsoleServerPort',
|
to='dcim.ConsoleServerPort',
|
||||||
on_delete=models.SET_NULL,
|
on_delete=models.SET_NULL,
|
||||||
related_name='connected_console',
|
related_name='connected_endpoint',
|
||||||
verbose_name='Console server port',
|
|
||||||
blank=True,
|
blank=True,
|
||||||
null=True
|
null=True
|
||||||
)
|
)
|
||||||
@ -1644,7 +1643,7 @@ class ConsolePort(ComponentModel):
|
|||||||
|
|
||||||
tags = TaggableManager()
|
tags = TaggableManager()
|
||||||
|
|
||||||
csv_headers = ['console_server', 'cs_port', 'device', 'console_port', 'connection_status']
|
csv_headers = ['console_server', 'connected_endpoint', 'device', 'console_port', 'connection_status']
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ['device', 'name']
|
ordering = ['device', 'name']
|
||||||
@ -1658,8 +1657,8 @@ class ConsolePort(ComponentModel):
|
|||||||
|
|
||||||
def to_csv(self):
|
def to_csv(self):
|
||||||
return (
|
return (
|
||||||
self.cs_port.device.identifier if self.cs_port else None,
|
self.connected_endpoint.device.identifier if self.connected_endpoint else None,
|
||||||
self.cs_port.name if self.cs_port else None,
|
self.connected_endpoint.name if self.connected_endpoint else None,
|
||||||
self.device.identifier,
|
self.device.identifier,
|
||||||
self.name,
|
self.name,
|
||||||
self.get_connection_status_display(),
|
self.get_connection_status_display(),
|
||||||
@ -1687,7 +1686,7 @@ class ConsoleServerPort(ComponentModel):
|
|||||||
device = models.ForeignKey(
|
device = models.ForeignKey(
|
||||||
to='dcim.Device',
|
to='dcim.Device',
|
||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
related_name='cs_ports'
|
related_name='consoleserverports'
|
||||||
)
|
)
|
||||||
name = models.CharField(
|
name = models.CharField(
|
||||||
max_length=50
|
max_length=50
|
||||||
|
@ -622,15 +622,19 @@ class DeviceBayTable(BaseTable):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class ConsoleConnectionTable(BaseTable):
|
class ConsoleConnectionTable(BaseTable):
|
||||||
console_server = tables.LinkColumn('dcim:device', accessor=Accessor('cs_port.device'),
|
console_server = tables.LinkColumn(
|
||||||
args=[Accessor('cs_port.device.pk')], verbose_name='Console server')
|
'dcim:device',
|
||||||
cs_port = tables.Column(verbose_name='Port')
|
accessor=Accessor('connected_endpoint.device'),
|
||||||
|
args=[Accessor('connected_endpoint.device.pk')],
|
||||||
|
verbose_name='Console server'
|
||||||
|
)
|
||||||
|
connected_endpoint = tables.Column(verbose_name='Port')
|
||||||
device = tables.LinkColumn('dcim:device', args=[Accessor('device.pk')], verbose_name='Device')
|
device = tables.LinkColumn('dcim:device', args=[Accessor('device.pk')], verbose_name='Device')
|
||||||
name = tables.Column(verbose_name='Console port')
|
name = tables.Column(verbose_name='Console port')
|
||||||
|
|
||||||
class Meta(BaseTable.Meta):
|
class Meta(BaseTable.Meta):
|
||||||
model = ConsolePort
|
model = ConsolePort
|
||||||
fields = ('console_server', 'cs_port', 'device', 'name')
|
fields = ('console_server', 'connected_endpoint', 'device', 'name')
|
||||||
|
|
||||||
|
|
||||||
class PowerConnectionTable(BaseTable):
|
class PowerConnectionTable(BaseTable):
|
||||||
|
@ -2005,7 +2005,7 @@ class ConsolePortTest(APITestCase):
|
|||||||
data = {
|
data = {
|
||||||
'device': self.device.pk,
|
'device': self.device.pk,
|
||||||
'name': 'Test Console Port X',
|
'name': 'Test Console Port X',
|
||||||
'cs_port': consoleserverport.pk,
|
'connected_endpoint': consoleserverport.pk,
|
||||||
}
|
}
|
||||||
|
|
||||||
url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk})
|
url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk})
|
||||||
@ -2015,7 +2015,7 @@ class ConsolePortTest(APITestCase):
|
|||||||
self.assertEqual(ConsolePort.objects.count(), 3)
|
self.assertEqual(ConsolePort.objects.count(), 3)
|
||||||
consoleport1 = ConsolePort.objects.get(pk=response.data['id'])
|
consoleport1 = ConsolePort.objects.get(pk=response.data['id'])
|
||||||
self.assertEqual(consoleport1.name, data['name'])
|
self.assertEqual(consoleport1.name, data['name'])
|
||||||
self.assertEqual(consoleport1.cs_port_id, data['cs_port'])
|
self.assertEqual(consoleport1.connected_endpoint_id, data['connected_endpoint'])
|
||||||
|
|
||||||
def test_delete_consoleport(self):
|
def test_delete_consoleport(self):
|
||||||
|
|
||||||
@ -2820,17 +2820,17 @@ class ConsoleConnectionTest(APITestCase):
|
|||||||
device2 = Device.objects.create(
|
device2 = Device.objects.create(
|
||||||
device_type=devicetype, device_role=devicerole, name='Test Device 2', site=site
|
device_type=devicetype, device_role=devicerole, name='Test Device 2', site=site
|
||||||
)
|
)
|
||||||
cs_port1 = ConsoleServerPort.objects.create(device=device1, name='Test CS Port 1')
|
consoleserverport1 = ConsoleServerPort.objects.create(device=device1, name='Test Console Server Port 1')
|
||||||
cs_port2 = ConsoleServerPort.objects.create(device=device1, name='Test CS Port 2')
|
consoleserverport2 = ConsoleServerPort.objects.create(device=device1, name='Test Console Server Port 2')
|
||||||
cs_port3 = ConsoleServerPort.objects.create(device=device1, name='Test CS Port 3')
|
consoleserverport3 = ConsoleServerPort.objects.create(device=device1, name='Test Console Server Port 3')
|
||||||
ConsolePort.objects.create(
|
ConsolePort.objects.create(
|
||||||
device=device2, cs_port=cs_port1, name='Test Console Port 1', connection_status=True
|
device=device2, connected_endpoint=consoleserverport1, name='Test Console Port 1', connection_status=True
|
||||||
)
|
)
|
||||||
ConsolePort.objects.create(
|
ConsolePort.objects.create(
|
||||||
device=device2, cs_port=cs_port2, name='Test Console Port 2', connection_status=True
|
device=device2, connected_endpoint=consoleserverport2, name='Test Console Port 2', connection_status=True
|
||||||
)
|
)
|
||||||
ConsolePort.objects.create(
|
ConsolePort.objects.create(
|
||||||
device=device2, cs_port=cs_port3, name='Test Console Port 3', connection_status=True
|
device=device2, connected_endpoint=consoleserverport3, name='Test Console Port 3', connection_status=True
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_list_consoleconnections(self):
|
def test_list_consoleconnections(self):
|
||||||
|
@ -886,11 +886,11 @@ class DeviceView(View):
|
|||||||
|
|
||||||
# Console ports
|
# Console ports
|
||||||
console_ports = natsorted(
|
console_ports = natsorted(
|
||||||
ConsolePort.objects.filter(device=device).select_related('cs_port__device'), key=attrgetter('name')
|
ConsolePort.objects.filter(device=device).select_related('connected_endpoint__device'), key=attrgetter('name')
|
||||||
)
|
)
|
||||||
|
|
||||||
# Console server ports
|
# Console server ports
|
||||||
cs_ports = ConsoleServerPort.objects.filter(device=device).select_related('connected_console')
|
consoleserverports = ConsoleServerPort.objects.filter(device=device).select_related('connected_endpoint')
|
||||||
|
|
||||||
# Power ports
|
# Power ports
|
||||||
power_ports = natsorted(
|
power_ports = natsorted(
|
||||||
@ -941,7 +941,7 @@ class DeviceView(View):
|
|||||||
return render(request, 'dcim/device.html', {
|
return render(request, 'dcim/device.html', {
|
||||||
'device': device,
|
'device': device,
|
||||||
'console_ports': console_ports,
|
'console_ports': console_ports,
|
||||||
'cs_ports': cs_ports,
|
'consoleserverports': consoleserverports,
|
||||||
'power_ports': power_ports,
|
'power_ports': power_ports,
|
||||||
'power_outlets': power_outlets,
|
'power_outlets': power_outlets,
|
||||||
'interfaces': interfaces,
|
'interfaces': interfaces,
|
||||||
@ -1133,9 +1133,9 @@ class ConsolePortConnectView(PermissionRequiredMixin, View):
|
|||||||
consoleport.device.get_absolute_url(),
|
consoleport.device.get_absolute_url(),
|
||||||
escape(consoleport.device),
|
escape(consoleport.device),
|
||||||
escape(consoleport.name),
|
escape(consoleport.name),
|
||||||
consoleport.cs_port.device.get_absolute_url(),
|
consoleport.connected_endpoint.device.get_absolute_url(),
|
||||||
escape(consoleport.cs_port.device),
|
escape(consoleport.connected_endpoint.device),
|
||||||
escape(consoleport.cs_port.name),
|
escape(consoleport.connected_endpoint.name),
|
||||||
)
|
)
|
||||||
messages.success(request, mark_safe(msg))
|
messages.success(request, mark_safe(msg))
|
||||||
|
|
||||||
@ -1156,7 +1156,7 @@ class ConsolePortDisconnectView(PermissionRequiredMixin, View):
|
|||||||
consoleport = get_object_or_404(ConsolePort, pk=pk)
|
consoleport = get_object_or_404(ConsolePort, pk=pk)
|
||||||
form = ConfirmationForm()
|
form = ConfirmationForm()
|
||||||
|
|
||||||
if not consoleport.cs_port:
|
if not consoleport.connected_endpoint:
|
||||||
messages.warning(
|
messages.warning(
|
||||||
request, "Cannot disconnect console port {}: It is not connected to anything.".format(consoleport)
|
request, "Cannot disconnect console port {}: It is not connected to anything.".format(consoleport)
|
||||||
)
|
)
|
||||||
@ -1174,18 +1174,17 @@ class ConsolePortDisconnectView(PermissionRequiredMixin, View):
|
|||||||
form = ConfirmationForm(request.POST)
|
form = ConfirmationForm(request.POST)
|
||||||
|
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
|
consoleserverport = consoleport.connected_endpoint
|
||||||
cs_port = consoleport.cs_port
|
consoleport.connected_endpoint = None
|
||||||
consoleport.cs_port = None
|
|
||||||
consoleport.connection_status = None
|
consoleport.connection_status = None
|
||||||
consoleport.save()
|
consoleport.save()
|
||||||
msg = 'Disconnected <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.format(
|
msg = 'Disconnected <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.format(
|
||||||
consoleport.device.get_absolute_url(),
|
consoleport.device.get_absolute_url(),
|
||||||
escape(consoleport.device),
|
escape(consoleport.device),
|
||||||
escape(consoleport.name),
|
escape(consoleport.name),
|
||||||
cs_port.device.get_absolute_url(),
|
consoleserverport.device.get_absolute_url(),
|
||||||
escape(cs_port.device),
|
escape(consoleserverport.device),
|
||||||
escape(cs_port.name),
|
escape(consoleserverport.name),
|
||||||
)
|
)
|
||||||
messages.success(request, mark_safe(msg))
|
messages.success(request, mark_safe(msg))
|
||||||
|
|
||||||
@ -1264,7 +1263,7 @@ class ConsoleServerPortConnectView(PermissionRequiredMixin, View):
|
|||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
|
|
||||||
consoleport = form.cleaned_data['port']
|
consoleport = form.cleaned_data['port']
|
||||||
consoleport.cs_port = consoleserverport
|
consoleport.connected_endpoint = consoleserverport
|
||||||
consoleport.connection_status = form.cleaned_data['connection_status']
|
consoleport.connection_status = form.cleaned_data['connection_status']
|
||||||
consoleport.save()
|
consoleport.save()
|
||||||
msg = 'Connected <a href="{}">{}</a> {} to <a href="{}">{}</a> {}'.format(
|
msg = 'Connected <a href="{}">{}</a> {} to <a href="{}">{}</a> {}'.format(
|
||||||
@ -1294,7 +1293,7 @@ class ConsoleServerPortDisconnectView(PermissionRequiredMixin, View):
|
|||||||
consoleserverport = get_object_or_404(ConsoleServerPort, pk=pk)
|
consoleserverport = get_object_or_404(ConsoleServerPort, pk=pk)
|
||||||
form = ConfirmationForm()
|
form = ConfirmationForm()
|
||||||
|
|
||||||
if not hasattr(consoleserverport, 'connected_console'):
|
if not hasattr(consoleserverport, 'connected_endpoint'):
|
||||||
messages.warning(
|
messages.warning(
|
||||||
request,
|
request,
|
||||||
"Cannot disconnect console server port {}: Nothing is connected to it.".format(consoleserverport)
|
"Cannot disconnect console server port {}: Nothing is connected to it.".format(consoleserverport)
|
||||||
@ -1314,8 +1313,8 @@ class ConsoleServerPortDisconnectView(PermissionRequiredMixin, View):
|
|||||||
|
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
|
|
||||||
consoleport = consoleserverport.connected_console
|
consoleport = consoleserverport.connected_endpoint
|
||||||
consoleport.cs_port = None
|
consoleport.connected_endpoint = None
|
||||||
consoleport.connection_status = None
|
consoleport.connection_status = None
|
||||||
consoleport.save()
|
consoleport.save()
|
||||||
msg = 'Disconnected <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.format(
|
msg = 'Disconnected <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.format(
|
||||||
@ -1359,8 +1358,13 @@ class ConsoleServerPortBulkDisconnectView(PermissionRequiredMixin, BulkDisconnec
|
|||||||
model = ConsoleServerPort
|
model = ConsoleServerPort
|
||||||
form = forms.ConsoleServerPortBulkDisconnectForm
|
form = forms.ConsoleServerPortBulkDisconnectForm
|
||||||
|
|
||||||
def disconnect_objects(self, cs_ports):
|
def disconnect_objects(self, consoleserverports):
|
||||||
return ConsolePort.objects.filter(cs_port__in=cs_ports).update(cs_port=None, connection_status=None)
|
return ConsolePort.objects.filter(
|
||||||
|
connected_endpoint__in=consoleserverports
|
||||||
|
).update(
|
||||||
|
connected_endpoint=None,
|
||||||
|
connection_status=None
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class ConsoleServerPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
class ConsoleServerPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
||||||
@ -2125,8 +2129,13 @@ class InterfaceConnectionsBulkImportView(PermissionRequiredMixin, BulkImportView
|
|||||||
#
|
#
|
||||||
|
|
||||||
class ConsoleConnectionsListView(ObjectListView):
|
class ConsoleConnectionsListView(ObjectListView):
|
||||||
queryset = ConsolePort.objects.select_related('device', 'cs_port__device').filter(cs_port__isnull=False) \
|
queryset = ConsolePort.objects.select_related(
|
||||||
.order_by('cs_port__device__name', 'cs_port__name')
|
'device', 'connected_endpoint__device'
|
||||||
|
).filter(
|
||||||
|
connected_endpoint__isnull=False
|
||||||
|
).order_by(
|
||||||
|
'connected_endpoint__device__name', 'connected_endpoint__name'
|
||||||
|
)
|
||||||
filter = filters.ConsoleConnectionFilter
|
filter = filters.ConsoleConnectionFilter
|
||||||
filter_form = forms.ConsoleConnectionFilterForm
|
filter_form = forms.ConsoleConnectionFilterForm
|
||||||
table = tables.ConsoleConnectionTable
|
table = tables.ConsoleConnectionTable
|
||||||
|
@ -526,10 +526,10 @@ class TopologyMap(models.Model):
|
|||||||
from dcim.models import ConsolePort
|
from dcim.models import ConsolePort
|
||||||
|
|
||||||
# Add all console connections to the graph
|
# Add all console connections to the graph
|
||||||
console_ports = ConsolePort.objects.filter(device__in=devices, cs_port__device__in=devices)
|
console_ports = ConsolePort.objects.filter(device__in=devices, connected_endpoint__device__in=devices)
|
||||||
for cp in console_ports:
|
for cp in console_ports:
|
||||||
style = 'solid' if cp.connection_status == CONNECTION_STATUS_CONNECTED else 'dashed'
|
style = 'solid' if cp.connection_status == CONNECTION_STATUS_CONNECTED else 'dashed'
|
||||||
self.graph.edge(cp.cs_port.device.name, cp.device.name, style=style)
|
self.graph.edge(cp.connected_endpoint.device.name, cp.device.name, style=style)
|
||||||
|
|
||||||
def add_power_connections(self, devices):
|
def add_power_connections(self, devices):
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ class HomeView(View):
|
|||||||
'rack_count': Rack.objects.count(),
|
'rack_count': Rack.objects.count(),
|
||||||
'device_count': Device.objects.count(),
|
'device_count': Device.objects.count(),
|
||||||
'interface_connections_count': InterfaceConnection.objects.count(),
|
'interface_connections_count': InterfaceConnection.objects.count(),
|
||||||
'console_connections_count': ConsolePort.objects.filter(cs_port__isnull=False).count(),
|
'console_connections_count': ConsolePort.objects.filter(connected_endpoint__isnull=False).count(),
|
||||||
'power_connections_count': PowerPort.objects.filter(power_outlet__isnull=False).count(),
|
'power_connections_count': PowerPort.objects.filter(power_outlet__isnull=False).count(),
|
||||||
|
|
||||||
# IPAM
|
# IPAM
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
{% render_field form.console_server %}
|
{% render_field form.console_server %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% render_field form.cs_port %}
|
{% render_field form.connected_endpoint %}
|
||||||
{% render_field form.connection_status %}
|
{% render_field form.connection_status %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -4,5 +4,5 @@
|
|||||||
{% block title %}Disconnect console port {{ consoleport }}?{% endblock %}
|
{% block title %}Disconnect console port {{ consoleport }}?{% endblock %}
|
||||||
|
|
||||||
{% block message %}
|
{% block message %}
|
||||||
<p>Are you sure you want to disconnect this console port from {{ consoleport.cs_port.device }} {{ consoleport.cs_port }}?</p>
|
<p>Are you sure you want to disconnect this console port from {{ consoleport.connected_endpoint.device }} {{ consoleport.connected_endpoint }}?</p>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -4,5 +4,5 @@
|
|||||||
{% block title %}Disconnect {{ consoleserverport.device }} {{ consoleserverport }}?{% endblock %}
|
{% block title %}Disconnect {{ consoleserverport.device }} {{ consoleserverport }}?{% endblock %}
|
||||||
|
|
||||||
{% block message %}
|
{% block message %}
|
||||||
<p>Are you sure you want to disconnect {{ consoleserverport.connected_console.device }} {{ consoleserverport.connected_console }} from this port?</p>
|
<p>Are you sure you want to disconnect {{ consoleserverport.connected_endpoint.device }} {{ consoleserverport.connected_endpoint }} from this port?</p>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -573,7 +573,7 @@
|
|||||||
</form>
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if cs_ports or device.device_type.is_console_server %}
|
{% if consoleserverports or device.device_type.is_console_server %}
|
||||||
{% if perms.dcim.delete_consoleserverport %}
|
{% if perms.dcim.delete_consoleserverport %}
|
||||||
<form method="post">
|
<form method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
@ -594,7 +594,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for csp in cs_ports %}
|
{% for csp in consoleserverports %}
|
||||||
{% include 'dcim/inc/consoleserverport.html' %}
|
{% include 'dcim/inc/consoleserverport.html' %}
|
||||||
{% empty %}
|
{% empty %}
|
||||||
<tr>
|
<tr>
|
||||||
@ -604,7 +604,7 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div class="panel-footer">
|
<div class="panel-footer">
|
||||||
{% if cs_ports 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
|
||||||
</button>
|
</button>
|
||||||
@ -612,7 +612,7 @@
|
|||||||
<span class="glyphicon glyphicon-resize-full" aria-hidden="true"></span> Disconnect
|
<span class="glyphicon glyphicon-resize-full" aria-hidden="true"></span> Disconnect
|
||||||
</button>
|
</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if cs_ports and perms.dcim.delete_consoleserverport %}
|
{% if consoleserverports and perms.dcim.delete_consoleserverport %}
|
||||||
<button type="submit" formaction="{% url 'dcim:consoleserverport_bulk_delete' pk=device.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs">
|
<button type="submit" formaction="{% url 'dcim:consoleserverport_bulk_delete' pk=device.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs">
|
||||||
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Delete
|
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Delete
|
||||||
</button>
|
</button>
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
<tr class="consoleport{% if cp.cs_port and not cp.connection_status %} info{% endif %}">
|
<tr class="consoleport{% if cp.connected_endpoint %} {% if cp.connection_status %}success{% else %}info{% endif %}{% endif %}">
|
||||||
<td>
|
<td>
|
||||||
<i class="fa fa-fw fa-keyboard-o"></i> {{ cp }}
|
<i class="fa fa-fw fa-keyboard-o"></i> {{ cp }}
|
||||||
</td>
|
</td>
|
||||||
{% if cp.cs_port %}
|
{% if cp.connected_endpoint %}
|
||||||
<td>
|
<td>
|
||||||
<a href="{% url 'dcim:device' pk=cp.cs_port.device.pk %}">{{ cp.cs_port.device }}</a>
|
<a href="{% url 'dcim:device' pk=cp.connected_endpoint.device.pk %}">{{ cp.connected_endpoint.device }}</a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{ cp.cs_port }}
|
{{ cp.connected_endpoint }}
|
||||||
</td>
|
</td>
|
||||||
{% else %}
|
{% else %}
|
||||||
<td colspan="2">
|
<td colspan="2">
|
||||||
@ -16,7 +16,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
<td class="text-right">
|
<td class="text-right">
|
||||||
{% if perms.dcim.change_consoleport %}
|
{% if perms.dcim.change_consoleport %}
|
||||||
{% if cp.cs_port %}
|
{% if cp.connected_endpoint %}
|
||||||
{% if cp.connection_status %}
|
{% if cp.connection_status %}
|
||||||
<a href="#" class="btn btn-warning btn-xs consoleport-toggle connected" title="Mark planned" data="{{ cp.pk }}">
|
<a href="#" class="btn btn-warning btn-xs consoleport-toggle connected" title="Mark planned" data="{{ cp.pk }}">
|
||||||
<i class="glyphicon glyphicon-ban-circle" aria-hidden="true"></i>
|
<i class="glyphicon glyphicon-ban-circle" aria-hidden="true"></i>
|
||||||
@ -39,7 +39,7 @@
|
|||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if perms.dcim.delete_consoleport %}
|
{% if perms.dcim.delete_consoleport %}
|
||||||
{% if cp.cs_port %}
|
{% if cp.connected_endpoint %}
|
||||||
<button class="btn btn-danger btn-xs" disabled="disabled">
|
<button class="btn btn-danger btn-xs" disabled="disabled">
|
||||||
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
|
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
|
||||||
</button>
|
</button>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<tr class="consoleserverport{% if csp.connected_console and not csp.connected_console.connection_status %} info{% endif %}">
|
<tr class="consoleserverport{% if csp.connected_endpoint %} {%if csp.connected_endpoint.connection_status %}success{% else %}info{% endif %}{% endif %}">
|
||||||
{% if perms.dcim.change_consoleserverport or perms.dcim.delete_consoleserverport %}
|
{% if perms.dcim.change_consoleserverport or perms.dcim.delete_consoleserverport %}
|
||||||
<td class="pk">
|
<td class="pk">
|
||||||
<input name="pk" type="checkbox" value="{{ csp.pk }}" />
|
<input name="pk" type="checkbox" value="{{ csp.pk }}" />
|
||||||
@ -7,12 +7,12 @@
|
|||||||
<td>
|
<td>
|
||||||
<i class="fa fa-fw fa-keyboard-o"></i> {{ csp }}
|
<i class="fa fa-fw fa-keyboard-o"></i> {{ csp }}
|
||||||
</td>
|
</td>
|
||||||
{% if csp.connected_console %}
|
{% if csp.connected_endpoint %}
|
||||||
<td>
|
<td>
|
||||||
<a href="{% url 'dcim:device' pk=csp.connected_console.device.pk %}">{{ csp.connected_console.device }}</a>
|
<a href="{% url 'dcim:device' pk=csp.connected_endpoint.device.pk %}">{{ csp.connected_endpoint.device }}</a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{ csp.connected_console }}
|
{{ csp.connected_endpoint }}
|
||||||
</td>
|
</td>
|
||||||
{% else %}
|
{% else %}
|
||||||
<td colspan="2">
|
<td colspan="2">
|
||||||
@ -21,13 +21,13 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
<td class="text-right">
|
<td class="text-right">
|
||||||
{% if perms.dcim.change_consoleserverport %}
|
{% if perms.dcim.change_consoleserverport %}
|
||||||
{% if csp.connected_console %}
|
{% if csp.connected_endpoint %}
|
||||||
{% if csp.connected_console.connection_status %}
|
{% if csp.connected_endpoint.connection_status %}
|
||||||
<a href="#" class="btn btn-warning btn-xs consoleport-toggle connected" title="Mark planned" data="{{ csp.connected_console.pk }}">
|
<a href="#" class="btn btn-warning btn-xs consoleport-toggle connected" title="Mark planned" data="{{ csp.connected_endpoint.pk }}">
|
||||||
<i class="glyphicon glyphicon-ban-circle" aria-hidden="true"></i>
|
<i class="glyphicon glyphicon-ban-circle" aria-hidden="true"></i>
|
||||||
</a>
|
</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a href="#" class="btn btn-success btn-xs consoleport-toggle" title="Mark installed" data="{{ csp.connected_console.pk }}">
|
<a href="#" class="btn btn-success btn-xs consoleport-toggle" title="Mark installed" data="{{ csp.connected_endpoint.pk }}">
|
||||||
<i class="fa fa-plug" aria-hidden="true"></i>
|
<i class="fa fa-plug" aria-hidden="true"></i>
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -44,7 +44,7 @@
|
|||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if perms.dcim.delete_consoleserverport %}
|
{% if perms.dcim.delete_consoleserverport %}
|
||||||
{% if csp.connected_console %}
|
{% if csp.connected_endpoint %}
|
||||||
<button class="btn btn-danger btn-xs" disabled="disabled">
|
<button class="btn btn-danger btn-xs" disabled="disabled">
|
||||||
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
|
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
|
||||||
</button>
|
</button>
|
||||||
|
Loading…
Reference in New Issue
Block a user