Просмотр исходного кода

Renamed ConsolePort.cs_port to connected_endpoint

Jeremy Stretch 7 лет назад
Родитель
Сommit
1595a5ecd7

+ 6 - 6
netbox/dcim/api/serializers.py

@@ -504,8 +504,8 @@ class ConsoleServerPortSerializer(TaggitSerializer, ValidatedModelSerializer):
 
     class Meta:
         model = ConsoleServerPort
-        fields = ['id', 'device', 'name', 'connected_console', 'tags']
-        read_only_fields = ['connected_console']
+        fields = ['id', 'device', 'name', 'connected_endpoint', 'tags']
+        read_only_fields = ['connected_endpoint']
 
 
 class NestedConsoleServerPortSerializer(WritableNestedSerializer):
@@ -518,7 +518,7 @@ class NestedConsoleServerPortSerializer(WritableNestedSerializer):
         fields = ['id', 'url', 'device', 'name', 'is_connected']
 
     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):
     device = NestedDeviceSerializer()
-    cs_port = NestedConsoleServerPortSerializer(required=False, allow_null=True)
+    connected_endpoint = NestedConsoleServerPortSerializer(required=False, allow_null=True)
     tags = TagListSerializerField(required=False)
 
     class Meta:
         model = ConsolePort
-        fields = ['id', 'device', 'name', 'cs_port', 'connection_status', 'tags']
+        fields = ['id', 'device', 'name', 'connected_endpoint', 'connection_status', 'tags']
 
 
 class NestedConsolePortSerializer(TaggitSerializer, ValidatedModelSerializer):
@@ -545,7 +545,7 @@ class NestedConsolePortSerializer(TaggitSerializer, ValidatedModelSerializer):
         fields = ['id', 'url', 'device', 'name', 'is_connected']
 
     def get_is_connected(self, obj):
-        return obj.cs_port is not None
+        return obj.connected_endpoint is not None
 
 
 #

+ 3 - 3
netbox/dcim/api/views.py

@@ -331,13 +331,13 @@ class DeviceViewSet(CustomFieldModelViewSet):
 #
 
 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
     filter_class = filters.ConsolePortFilter
 
 
 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
     filter_class = filters.ConsoleServerPortFilter
 
@@ -399,7 +399,7 @@ class InventoryItemViewSet(ModelViewSet):
 #
 
 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
     filter_class = filters.ConsoleConnectionFilter
 

+ 2 - 2
netbox/dcim/filters.py

@@ -803,14 +803,14 @@ class ConsoleConnectionFilter(django_filters.FilterSet):
     def filter_site(self, queryset, name, value):
         if not value.strip():
             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):
         if not value.strip():
             return queryset
         return queryset.filter(
             Q(device__name__icontains=value) |
-            Q(cs_port__device__name__icontains=value)
+            Q(connected_endpoint__device__name__icontains=value)
         )
 
 

+ 15 - 15
netbox/dcim/fixtures/dcim.json

@@ -2151,7 +2151,7 @@
     "fields": {
         "device": 1,
         "name": "Console (RE0)",
-        "cs_port": 27,
+        "connected_endpoint": 27,
         "connection_status": true
     }
 },
@@ -2161,7 +2161,7 @@
     "fields": {
         "device": 1,
         "name": "Console (RE1)",
-        "cs_port": 38,
+        "connected_endpoint": 38,
         "connection_status": true
     }
 },
@@ -2171,7 +2171,7 @@
     "fields": {
         "device": 2,
         "name": "Console (RE0)",
-        "cs_port": 5,
+        "connected_endpoint": 5,
         "connection_status": true
     }
 },
@@ -2181,7 +2181,7 @@
     "fields": {
         "device": 2,
         "name": "Console (RE1)",
-        "cs_port": 16,
+        "connected_endpoint": 16,
         "connection_status": true
     }
 },
@@ -2191,7 +2191,7 @@
     "fields": {
         "device": 3,
         "name": "Console",
-        "cs_port": 49,
+        "connected_endpoint": 49,
         "connection_status": true
     }
 },
@@ -2201,7 +2201,7 @@
     "fields": {
         "device": 4,
         "name": "Console",
-        "cs_port": 48,
+        "connected_endpoint": 48,
         "connection_status": true
     }
 },
@@ -2211,7 +2211,7 @@
     "fields": {
         "device": 5,
         "name": "Console",
-        "cs_port": null,
+        "connected_endpoint": null,
         "connection_status": true
     }
 },
@@ -2221,7 +2221,7 @@
     "fields": {
         "device": 6,
         "name": "Console",
-        "cs_port": null,
+        "connected_endpoint": null,
         "connection_status": true
     }
 },
@@ -2231,7 +2231,7 @@
     "fields": {
         "device": 7,
         "name": "Console (RE0)",
-        "cs_port": null,
+        "connected_endpoint": null,
         "connection_status": true
     }
 },
@@ -2241,7 +2241,7 @@
     "fields": {
         "device": 7,
         "name": "Console (RE1)",
-        "cs_port": null,
+        "connected_endpoint": null,
         "connection_status": true
     }
 },
@@ -2251,7 +2251,7 @@
     "fields": {
         "device": 8,
         "name": "Console (RE0)",
-        "cs_port": null,
+        "connected_endpoint": null,
         "connection_status": true
     }
 },
@@ -2261,7 +2261,7 @@
     "fields": {
         "device": 8,
         "name": "Console (RE1)",
-        "cs_port": null,
+        "connected_endpoint": null,
         "connection_status": true
     }
 },
@@ -2271,7 +2271,7 @@
     "fields": {
         "device": 9,
         "name": "Console",
-        "cs_port": null,
+        "connected_endpoint": null,
         "connection_status": true
     }
 },
@@ -2281,7 +2281,7 @@
     "fields": {
         "device": 11,
         "name": "Serial",
-        "cs_port": null,
+        "connected_endpoint": null,
         "connection_status": true
     }
 },
@@ -2291,7 +2291,7 @@
     "fields": {
         "device": 12,
         "name": "Serial",
-        "cs_port": null,
+        "connected_endpoint": null,
         "connection_status": true
     }
 },

+ 17 - 17
netbox/dcim/forms.py

@@ -1301,8 +1301,8 @@ class ConsoleConnectionCSVForm(forms.ModelForm):
             'invalid_choice': 'Console server not found',
         }
     )
-    cs_port = forms.CharField(
-        help_text='Console server port name'
+    connected_endpoint = forms.CharField(
+        help_text='Console server port'
     )
     device = FlexibleModelChoiceField(
         queryset=Device.objects.all(),
@@ -1322,7 +1322,7 @@ class ConsoleConnectionCSVForm(forms.ModelForm):
 
     class Meta:
         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):
 
@@ -1336,7 +1336,7 @@ class ConsoleConnectionCSVForm(forms.ModelForm):
                 device=self.cleaned_data['device'], name=console_port_name
             )
             # 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(
                     self.cleaned_data['device'], console_port_name
                 ))
@@ -1348,28 +1348,28 @@ class ConsoleConnectionCSVForm(forms.ModelForm):
         self.instance = consoleport
         return consoleport
 
-    def clean_cs_port(self):
+    def clean_connected_endpoint(self):
 
-        cs_port_name = self.cleaned_data.get('cs_port')
-        if not self.cleaned_data.get('console_server') or not cs_port_name:
+        consoleserverport_name = self.cleaned_data.get('connected_endpoint')
+        if not self.cleaned_data.get('console_server') or not consoleserverport_name:
             return None
 
         try:
             # Retrieve console server port by name
-            cs_port = ConsoleServerPort.objects.get(
-                device=self.cleaned_data['console_server'], name=cs_port_name
+            consoleserverport = ConsoleServerPort.objects.get(
+                device=self.cleaned_data['console_server'], name=consoleserverport_name
             )
             # 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(
-                    self.cleaned_data['console_server'], cs_port_name
+                    self.cleaned_data['console_server'], consoleserverport_name
                 ))
         except ConsoleServerPort.DoesNotExist:
             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):
@@ -1403,7 +1403,7 @@ class ConsolePortConnectionForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelF
         widget=APISelect(
             api_url='/api/dcim/devices/?site_id={{site}}&rack_id={{rack}}&is_console_server=True',
             display_field='display_name',
-            attrs={'filter-for': 'cs_port'}
+            attrs={'filter-for': 'connected_endpoint'}
         )
     )
     livesearch = forms.CharField(
@@ -1415,7 +1415,7 @@ class ConsolePortConnectionForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelF
             field_to_update='console_server',
         )
     )
-    cs_port = ChainedModelChoiceField(
+    connected_endpoint = ChainedModelChoiceField(
         queryset=ConsoleServerPort.objects.all(),
         chains=(
             ('device', 'console_server'),
@@ -1429,9 +1429,9 @@ class ConsolePortConnectionForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelF
 
     class Meta:
         model = ConsolePort
-        fields = ['site', 'rack', 'console_server', 'livesearch', 'cs_port', 'connection_status']
+        fields = ['site', 'rack', 'console_server', 'livesearch', 'connected_endpoint', 'connection_status']
         labels = {
-            'cs_port': 'Port',
+            'connected_endpoint': 'Port',
             'connection_status': 'Status',
         }
 

+ 23 - 6
netbox/dcim/migrations/0066_cables.py

@@ -1,5 +1,3 @@
-# Generated by Django 2.0.8 on 2018-10-18 19:41
-
 from django.db import migrations, models
 import django.db.models.deletion
 import utilities.fields
@@ -19,13 +17,13 @@ def console_connections_to_cables(apps, schema_editor):
     consoleserverport_type = ContentType.objects.get_for_model(ConsoleServerPort)
 
     # 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()
         # We have to assign GFK fields manually because we're inside a migration.
         c.endpoint_a_type = consoleport_type
         c.endpoint_a_id = consoleport.id
         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.save()
 
@@ -87,6 +85,8 @@ class Migration(migrations.Migration):
     ]
 
     operations = [
+
+        # Create the Cable model
         migrations.CreateModel(
             name='Cable',
             fields=[
@@ -99,8 +99,8 @@ class Migration(migrations.Migration):
                 ('status', models.BooleanField(default=True)),
                 ('label', models.CharField(blank=True, max_length=100)),
                 ('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_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_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')),
             ],
         ),
         migrations.AlterUniqueTogether(
@@ -108,6 +108,23 @@ class Migration(migrations.Migration):
             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
         migrations.RunPython(console_connections_to_cables),
         migrations.RunPython(power_connections_to_cables),

+ 6 - 7
netbox/dcim/models.py

@@ -1629,11 +1629,10 @@ class ConsolePort(ComponentModel):
     name = models.CharField(
         max_length=50
     )
-    cs_port = models.OneToOneField(
+    connected_endpoint = models.OneToOneField(
         to='dcim.ConsoleServerPort',
         on_delete=models.SET_NULL,
-        related_name='connected_console',
-        verbose_name='Console server port',
+        related_name='connected_endpoint',
         blank=True,
         null=True
     )
@@ -1644,7 +1643,7 @@ class ConsolePort(ComponentModel):
 
     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:
         ordering = ['device', 'name']
@@ -1658,8 +1657,8 @@ class ConsolePort(ComponentModel):
 
     def to_csv(self):
         return (
-            self.cs_port.device.identifier if self.cs_port else None,
-            self.cs_port.name if self.cs_port else None,
+            self.connected_endpoint.device.identifier if self.connected_endpoint else None,
+            self.connected_endpoint.name if self.connected_endpoint else None,
             self.device.identifier,
             self.name,
             self.get_connection_status_display(),
@@ -1687,7 +1686,7 @@ class ConsoleServerPort(ComponentModel):
     device = models.ForeignKey(
         to='dcim.Device',
         on_delete=models.CASCADE,
-        related_name='cs_ports'
+        related_name='consoleserverports'
     )
     name = models.CharField(
         max_length=50

+ 8 - 4
netbox/dcim/tables.py

@@ -622,15 +622,19 @@ class DeviceBayTable(BaseTable):
 #
 
 class ConsoleConnectionTable(BaseTable):
-    console_server = tables.LinkColumn('dcim:device', accessor=Accessor('cs_port.device'),
-                                       args=[Accessor('cs_port.device.pk')], verbose_name='Console server')
-    cs_port = tables.Column(verbose_name='Port')
+    console_server = tables.LinkColumn(
+        'dcim:device',
+        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')
     name = tables.Column(verbose_name='Console port')
 
     class Meta(BaseTable.Meta):
         model = ConsolePort
-        fields = ('console_server', 'cs_port', 'device', 'name')
+        fields = ('console_server', 'connected_endpoint', 'device', 'name')
 
 
 class PowerConnectionTable(BaseTable):

+ 8 - 8
netbox/dcim/tests/test_api.py

@@ -2005,7 +2005,7 @@ class ConsolePortTest(APITestCase):
         data = {
             'device': self.device.pk,
             'name': 'Test Console Port X',
-            'cs_port': consoleserverport.pk,
+            'connected_endpoint': consoleserverport.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)
         consoleport1 = ConsolePort.objects.get(pk=response.data['id'])
         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):
 
@@ -2820,17 +2820,17 @@ class ConsoleConnectionTest(APITestCase):
         device2 = Device.objects.create(
             device_type=devicetype, device_role=devicerole, name='Test Device 2', site=site
         )
-        cs_port1 = ConsoleServerPort.objects.create(device=device1, name='Test CS Port 1')
-        cs_port2 = ConsoleServerPort.objects.create(device=device1, name='Test CS Port 2')
-        cs_port3 = ConsoleServerPort.objects.create(device=device1, name='Test CS Port 3')
+        consoleserverport1 = ConsoleServerPort.objects.create(device=device1, name='Test Console Server Port 1')
+        consoleserverport2 = ConsoleServerPort.objects.create(device=device1, name='Test Console Server Port 2')
+        consoleserverport3 = ConsoleServerPort.objects.create(device=device1, name='Test Console Server Port 3')
         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(
-            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(
-            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):

+ 30 - 21
netbox/dcim/views.py

@@ -886,11 +886,11 @@ class DeviceView(View):
 
         # Console ports
         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
-        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 = natsorted(
@@ -941,7 +941,7 @@ class DeviceView(View):
         return render(request, 'dcim/device.html', {
             'device': device,
             'console_ports': console_ports,
-            'cs_ports': cs_ports,
+            'consoleserverports': consoleserverports,
             'power_ports': power_ports,
             'power_outlets': power_outlets,
             'interfaces': interfaces,
@@ -1133,9 +1133,9 @@ class ConsolePortConnectView(PermissionRequiredMixin, View):
                 consoleport.device.get_absolute_url(),
                 escape(consoleport.device),
                 escape(consoleport.name),
-                consoleport.cs_port.device.get_absolute_url(),
-                escape(consoleport.cs_port.device),
-                escape(consoleport.cs_port.name),
+                consoleport.connected_endpoint.device.get_absolute_url(),
+                escape(consoleport.connected_endpoint.device),
+                escape(consoleport.connected_endpoint.name),
             )
             messages.success(request, mark_safe(msg))
 
@@ -1156,7 +1156,7 @@ class ConsolePortDisconnectView(PermissionRequiredMixin, View):
         consoleport = get_object_or_404(ConsolePort, pk=pk)
         form = ConfirmationForm()
 
-        if not consoleport.cs_port:
+        if not consoleport.connected_endpoint:
             messages.warning(
                 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)
 
         if form.is_valid():
-
-            cs_port = consoleport.cs_port
-            consoleport.cs_port = None
+            consoleserverport = consoleport.connected_endpoint
+            consoleport.connected_endpoint = None
             consoleport.connection_status = None
             consoleport.save()
             msg = 'Disconnected <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.format(
                 consoleport.device.get_absolute_url(),
                 escape(consoleport.device),
                 escape(consoleport.name),
-                cs_port.device.get_absolute_url(),
-                escape(cs_port.device),
-                escape(cs_port.name),
+                consoleserverport.device.get_absolute_url(),
+                escape(consoleserverport.device),
+                escape(consoleserverport.name),
             )
             messages.success(request, mark_safe(msg))
 
@@ -1264,7 +1263,7 @@ class ConsoleServerPortConnectView(PermissionRequiredMixin, View):
         if form.is_valid():
 
             consoleport = form.cleaned_data['port']
-            consoleport.cs_port = consoleserverport
+            consoleport.connected_endpoint = consoleserverport
             consoleport.connection_status = form.cleaned_data['connection_status']
             consoleport.save()
             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)
         form = ConfirmationForm()
 
-        if not hasattr(consoleserverport, 'connected_console'):
+        if not hasattr(consoleserverport, 'connected_endpoint'):
             messages.warning(
                 request,
                 "Cannot disconnect console server port {}: Nothing is connected to it.".format(consoleserverport)
@@ -1314,8 +1313,8 @@ class ConsoleServerPortDisconnectView(PermissionRequiredMixin, View):
 
         if form.is_valid():
 
-            consoleport = consoleserverport.connected_console
-            consoleport.cs_port = None
+            consoleport = consoleserverport.connected_endpoint
+            consoleport.connected_endpoint = None
             consoleport.connection_status = None
             consoleport.save()
             msg = 'Disconnected <a href="{}">{}</a> {} from <a href="{}">{}</a> {}'.format(
@@ -1359,8 +1358,13 @@ class ConsoleServerPortBulkDisconnectView(PermissionRequiredMixin, BulkDisconnec
     model = ConsoleServerPort
     form = forms.ConsoleServerPortBulkDisconnectForm
 
-    def disconnect_objects(self, cs_ports):
-        return ConsolePort.objects.filter(cs_port__in=cs_ports).update(cs_port=None, connection_status=None)
+    def disconnect_objects(self, consoleserverports):
+        return ConsolePort.objects.filter(
+            connected_endpoint__in=consoleserverports
+        ).update(
+            connected_endpoint=None,
+            connection_status=None
+        )
 
 
 class ConsoleServerPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
@@ -2125,8 +2129,13 @@ class InterfaceConnectionsBulkImportView(PermissionRequiredMixin, BulkImportView
 #
 
 class ConsoleConnectionsListView(ObjectListView):
-    queryset = ConsolePort.objects.select_related('device', 'cs_port__device').filter(cs_port__isnull=False) \
-        .order_by('cs_port__device__name', 'cs_port__name')
+    queryset = ConsolePort.objects.select_related(
+        'device', 'connected_endpoint__device'
+    ).filter(
+        connected_endpoint__isnull=False
+    ).order_by(
+        'connected_endpoint__device__name', 'connected_endpoint__name'
+    )
     filter = filters.ConsoleConnectionFilter
     filter_form = forms.ConsoleConnectionFilterForm
     table = tables.ConsoleConnectionTable

+ 2 - 2
netbox/extras/models.py

@@ -526,10 +526,10 @@ class TopologyMap(models.Model):
         from dcim.models import ConsolePort
 
         # 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:
             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):
 

+ 1 - 1
netbox/netbox/views.py

@@ -167,7 +167,7 @@ class HomeView(View):
             'rack_count': Rack.objects.count(),
             'device_count': Device.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(),
 
             # IPAM

+ 1 - 1
netbox/templates/dcim/consoleport_connect.html

@@ -35,7 +35,7 @@
                             {% render_field form.console_server %}
                         </div>
                     </div>
-                    {% render_field form.cs_port %}
+                    {% render_field form.connected_endpoint %}
                     {% render_field form.connection_status %}
                 </div>
             </div>

+ 1 - 1
netbox/templates/dcim/consoleport_disconnect.html

@@ -4,5 +4,5 @@
 {% block title %}Disconnect console port {{ consoleport }}?{% endblock %}
 
 {% 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 %}

+ 1 - 1
netbox/templates/dcim/consoleserverport_disconnect.html

@@ -4,5 +4,5 @@
 {% block title %}Disconnect {{ consoleserverport.device }} {{ consoleserverport }}?{% endblock %}
 
 {% 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 %}

+ 4 - 4
netbox/templates/dcim/device.html

@@ -573,7 +573,7 @@
                     </form>
                 {% 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 %}
                     <form method="post">
                     {% csrf_token %}
@@ -594,7 +594,7 @@
                             </tr>
                         </thead>
                         <tbody>
-                            {% for csp in cs_ports %}
+                            {% for csp in consoleserverports %}
                                 {% include 'dcim/inc/consoleserverport.html' %}
                             {% empty %}
                                 <tr>
@@ -604,7 +604,7 @@
                         </tbody>
                     </table>
                     <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">
                                 <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename
                             </button>
@@ -612,7 +612,7 @@
                                 <span class="glyphicon glyphicon-resize-full" aria-hidden="true"></span> Disconnect
                             </button>
                         {% 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">
                                 <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Delete
                             </button>

+ 6 - 6
netbox/templates/dcim/inc/consoleport.html

@@ -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>
         <i class="fa fa-fw fa-keyboard-o"></i> {{ cp }}
     </td>
-    {% if cp.cs_port %}
+    {% if cp.connected_endpoint %}
         <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>
-            {{ cp.cs_port }}
+            {{ cp.connected_endpoint }}
         </td>
     {% else %}
         <td colspan="2">
@@ -16,7 +16,7 @@
     {% endif %}
     <td class="text-right">
         {% if perms.dcim.change_consoleport %}
-            {% if cp.cs_port %}
+            {% if cp.connected_endpoint %}
                 {% if cp.connection_status %}
                     <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>
@@ -39,7 +39,7 @@
             </a>
         {% endif %}
         {% if perms.dcim.delete_consoleport %}
-            {% if cp.cs_port %}
+            {% if cp.connected_endpoint %}
                 <button class="btn btn-danger btn-xs" disabled="disabled">
                     <i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
                 </button>

+ 9 - 9
netbox/templates/dcim/inc/consoleserverport.html

@@ -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 %}
         <td class="pk">
             <input name="pk" type="checkbox" value="{{ csp.pk }}" />
@@ -7,12 +7,12 @@
     <td>
         <i class="fa fa-fw fa-keyboard-o"></i> {{ csp }}
     </td>
-    {% if csp.connected_console %}
+    {% if csp.connected_endpoint %}
         <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>
-            {{ csp.connected_console }}
+            {{ csp.connected_endpoint }}
         </td>
     {% else %}
         <td colspan="2">
@@ -21,13 +21,13 @@
     {% endif %}
     <td class="text-right">
         {% if perms.dcim.change_consoleserverport %}
-            {% if csp.connected_console %}
-                {% if csp.connected_console.connection_status %}
-                    <a href="#" class="btn btn-warning btn-xs consoleport-toggle connected" title="Mark planned" data="{{ csp.connected_console.pk }}">
+            {% if csp.connected_endpoint %}
+                {% if csp.connected_endpoint.connection_status %}
+                    <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>
                     </a>
                 {% 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>
                     </a>
                 {% endif %}
@@ -44,7 +44,7 @@
             </a>
         {% endif %}
         {% if perms.dcim.delete_consoleserverport %}
-            {% if csp.connected_console %}
+            {% if csp.connected_endpoint %}
                 <button class="btn btn-danger btn-xs" disabled="disabled">
                     <i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
                 </button>