diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 9565d5ef0..0777d20aa 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -2355,8 +2355,7 @@ class CableForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelForm): attrs={'filter-for': 'endpoint_b_id'} ) ) - endpoint_b_id = forms.ChoiceField( - choices=[], + endpoint_b_id = forms.IntegerField( label='Name', widget=APISelect( api_url='/api/dcim/{{endpoint_b_type}}s/?device_id={{endpoint_b_device}}', @@ -2380,14 +2379,6 @@ class CableForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelForm): model__in=COMPATIBLE_ENDPOINT_TYPES.get(endpoint_a_type) ) - def clean(self): - - # Assign endpoint B - cleaned_data = super(CableForm, self).clean() - - - - # # Device bays diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index ac283b79f..3e011b4c3 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -5,8 +5,8 @@ from ipam.views import ServiceCreateView from secrets.views import secret_add from . import views from .models import ( - Device, DeviceRole, DeviceType, Interface, Manufacturer, Platform, Rack, RackGroup, RackReservation, RackRole, - Region, Site, VirtualChassis, + ConsolePort, ConsoleServerPort, Device, DeviceRole, DeviceType, Interface, Manufacturer, Platform, PowerPort, + PowerOutlet, Rack, RackGroup, RackReservation, RackRole, Region, Site, VirtualChassis, ) app_name = 'dcim' @@ -162,7 +162,7 @@ urlpatterns = [ url(r'^devices/(?P\d+)/console-ports/add/$', views.ConsolePortCreateView.as_view(), name='consoleport_add'), url(r'^devices/(?P\d+)/console-ports/delete/$', views.ConsolePortBulkDeleteView.as_view(), name='consoleport_bulk_delete'), # url(r'^console-ports/(?P\d+)/connect/$', views.ConsolePortConnectView.as_view(), name='consoleport_connect'), - url(r'^console-ports/(?P\d+)/connect/$', views.CableConnectView.as_view(), name='consoleport_connect', kwargs={'endpoint_a_type': 'consoleport'}), + url(r'^console-ports/(?P\d+)/connect/$', views.CableConnectView.as_view(), name='consoleport_connect', kwargs={'endpoint_a_type': ConsolePort}), url(r'^console-ports/(?P\d+)/disconnect/$', views.ConsolePortDisconnectView.as_view(), name='consoleport_disconnect'), url(r'^console-ports/(?P\d+)/edit/$', views.ConsolePortEditView.as_view(), name='consoleport_edit'), url(r'^console-ports/(?P\d+)/delete/$', views.ConsolePortDeleteView.as_view(), name='consoleport_delete'), @@ -173,7 +173,7 @@ urlpatterns = [ url(r'^devices/(?P\d+)/console-server-ports/disconnect/$', views.ConsoleServerPortBulkDisconnectView.as_view(), name='consoleserverport_bulk_disconnect'), url(r'^devices/(?P\d+)/console-server-ports/delete/$', views.ConsoleServerPortBulkDeleteView.as_view(), name='consoleserverport_bulk_delete'), # url(r'^console-server-ports/(?P\d+)/connect/$', views.ConsoleServerPortConnectView.as_view(), name='consoleserverport_connect'), - url(r'^console-server-ports/(?P\d+)/connect/$', views.CableConnectView.as_view(), name='consoleserverport_connect', kwargs={'endpoint_a_type': 'consoleserverport'}), + url(r'^console-server-ports/(?P\d+)/connect/$', views.CableConnectView.as_view(), name='consoleserverport_connect', kwargs={'endpoint_a_type': ConsoleServerPort}), url(r'^console-server-ports/(?P\d+)/disconnect/$', views.ConsoleServerPortDisconnectView.as_view(), name='consoleserverport_disconnect'), url(r'^console-server-ports/(?P\d+)/edit/$', views.ConsoleServerPortEditView.as_view(), name='consoleserverport_edit'), url(r'^console-server-ports/(?P\d+)/delete/$', views.ConsoleServerPortDeleteView.as_view(), name='consoleserverport_delete'), @@ -184,7 +184,7 @@ urlpatterns = [ url(r'^devices/(?P\d+)/power-ports/add/$', views.PowerPortCreateView.as_view(), name='powerport_add'), url(r'^devices/(?P\d+)/power-ports/delete/$', views.PowerPortBulkDeleteView.as_view(), name='powerport_bulk_delete'), # url(r'^power-ports/(?P\d+)/connect/$', views.PowerPortConnectView.as_view(), name='powerport_connect'), - url(r'^power-ports/(?P\d+)/connect/$', views.CableConnectView.as_view(), name='powerport_connect', kwargs={'endpoint_a_type': 'powerport'}), + url(r'^power-ports/(?P\d+)/connect/$', views.CableConnectView.as_view(), name='powerport_connect', kwargs={'endpoint_a_type': PowerPort}), url(r'^power-ports/(?P\d+)/disconnect/$', views.PowerPortDisconnectView.as_view(), name='powerport_disconnect'), url(r'^power-ports/(?P\d+)/edit/$', views.PowerPortEditView.as_view(), name='powerport_edit'), url(r'^power-ports/(?P\d+)/delete/$', views.PowerPortDeleteView.as_view(), name='powerport_delete'), @@ -195,7 +195,7 @@ urlpatterns = [ url(r'^devices/(?P\d+)/power-outlets/disconnect/$', views.PowerOutletBulkDisconnectView.as_view(), name='poweroutlet_bulk_disconnect'), url(r'^devices/(?P\d+)/power-outlets/delete/$', views.PowerOutletBulkDeleteView.as_view(), name='poweroutlet_bulk_delete'), # url(r'^power-outlets/(?P\d+)/connect/$', views.PowerOutletConnectView.as_view(), name='poweroutlet_connect'), - url(r'^power-outlets/(?P\d+)/connect/$', views.CableConnectView.as_view(), name='poweroutlet_connect', kwargs={'endpoint_a_type': 'poweroutlet'}), + url(r'^power-outlets/(?P\d+)/connect/$', views.CableConnectView.as_view(), name='poweroutlet_connect', kwargs={'endpoint_a_type': PowerOutlet}), url(r'^power-outlets/(?P\d+)/disconnect/$', views.PowerOutletDisconnectView.as_view(), name='poweroutlet_disconnect'), url(r'^power-outlets/(?P\d+)/edit/$', views.PowerOutletEditView.as_view(), name='poweroutlet_edit'), url(r'^power-outlets/(?P\d+)/delete/$', views.PowerOutletDeleteView.as_view(), name='poweroutlet_delete'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index f598d6b51..a97b3a98a 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -2161,17 +2161,12 @@ class CableConnectView(PermissionRequiredMixin, ObjectEditView): template_name = 'dcim/cable_connect.html' def alter_obj(self, obj, request, url_args, url_kwargs): + # Retrieve endpoint A based on the given type and PK endpoint_a_type = url_kwargs.get('endpoint_a_type') endpoint_a_id = url_kwargs.get('endpoint_a_id') - try: - model = apps.get_model( - app_label='dcim', - model_name=endpoint_a_type - ) - obj.endpoint_a = model.objects.get(pk=endpoint_a_id) - except ObjectDoesNotExist: - raise Http404 + obj.endpoint_a = endpoint_a_type.objects.get(pk=endpoint_a_id) + return obj