Renamed Cable endpoints to terminations

This commit is contained in:
Jeremy Stretch 2018-10-24 14:38:44 -04:00
parent 9985f2cb82
commit 54c917beff
14 changed files with 100 additions and 100 deletions

View File

@ -284,7 +284,7 @@ CONNECTION_STATUS_CHOICES = [
] ]
# Cable endpoint types # Cable endpoint types
CABLE_ENDPOINT_TYPES = [ CABLE_TERMINATION_TYPES = [
'consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontpanelport', 'rearpanelport', 'consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontpanelport', 'rearpanelport',
] ]
@ -297,7 +297,7 @@ CABLE_TYPE_CHOICES = (
(CABLE_TYPE_FIBER, 'Fiber'), (CABLE_TYPE_FIBER, 'Fiber'),
) )
CABLE_ENDPOINT_TYPE_CHOICES = { CABLE_TERMINATION_TYPE_CHOICES = {
# (API endpoint, human-friendly name) # (API endpoint, human-friendly name)
'consoleport': ('console-ports', 'Console port'), 'consoleport': ('console-ports', 'Console port'),
'consoleserverport': ('console-server-ports', 'Console server port'), 'consoleserverport': ('console-server-ports', 'Console server port'),
@ -308,7 +308,7 @@ CABLE_ENDPOINT_TYPE_CHOICES = {
'rearpanelport': ('rear-panel-ports', 'Rear panel port'), 'rearpanelport': ('rear-panel-ports', 'Rear panel port'),
} }
COMPATIBLE_ENDPOINT_TYPES = { COMPATIBLE_TERMINATION_TYPES = {
'consoleport': ['consoleserverport', 'frontpanelport', 'rearpanelport'], 'consoleport': ['consoleserverport', 'frontpanelport', 'rearpanelport'],
'consoleserverport': ['consoleport', 'frontpanelport', 'rearpanelport'], 'consoleserverport': ['consoleport', 'frontpanelport', 'rearpanelport'],
'powerport': ['poweroutlet'], 'powerport': ['poweroutlet'],

View File

@ -2137,38 +2137,38 @@ class RearPanelPortBulkRenameForm(BulkRenameForm):
# #
class CableForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelForm): class CableForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelForm):
endpoint_b_site = forms.ModelChoiceField( termination_b_site = forms.ModelChoiceField(
queryset=Site.objects.all(), queryset=Site.objects.all(),
label='Site', label='Site',
required=False, required=False,
widget=forms.Select( widget=forms.Select(
attrs={'filter-for': 'endpoint_b_rack'} attrs={'filter-for': 'termination_b_rack'}
) )
) )
endpoint_b_rack = ChainedModelChoiceField( termination_b_rack = ChainedModelChoiceField(
queryset=Rack.objects.all(), queryset=Rack.objects.all(),
chains=( chains=(
('site', 'endpoint_b_site'), ('site', 'termination_b_site'),
), ),
label='Rack', label='Rack',
required=False, required=False,
widget=APISelect( widget=APISelect(
api_url='/api/dcim/racks/?site_id={{endpoint_b_site}}', api_url='/api/dcim/racks/?site_id={{termination_b_site}}',
attrs={'filter-for': 'endpoint_b_device', 'nullable': 'true'} attrs={'filter-for': 'termination_b_device', 'nullable': 'true'}
) )
) )
endpoint_b_device = ChainedModelChoiceField( termination_b_device = ChainedModelChoiceField(
queryset=Device.objects.all(), queryset=Device.objects.all(),
chains=( chains=(
('site', 'endpoint_b_site'), ('site', 'termination_b_site'),
('rack', 'endpoint_b_rack'), ('rack', 'termination_b_rack'),
), ),
label='Device', label='Device',
required=False, required=False,
widget=APISelect( widget=APISelect(
api_url='/api/dcim/devices/?site_id={{endpoint_b_site}}&rack_id={{endpoint_b_rack}}', api_url='/api/dcim/devices/?site_id={termination_b_site}}&rack_id={{termination_b_rack}}',
display_field='display_name', display_field='display_name',
attrs={'filter-for': 'endpoint_b_id'} attrs={'filter-for': 'termination_b_id'}
) )
) )
livesearch = forms.CharField( livesearch = forms.CharField(
@ -2177,20 +2177,20 @@ class CableForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelForm):
widget=Livesearch( widget=Livesearch(
query_key='q', query_key='q',
query_url='dcim-api:device-list', query_url='dcim-api:device-list',
field_to_update='endpoint_b_device' field_to_update='termination_b_device'
) )
) )
endpoint_b_type = forms.ModelChoiceField( termination_b_type = forms.ModelChoiceField(
queryset=ContentType.objects.all(), queryset=ContentType.objects.all(),
label='Type', label='Type',
widget=ContentTypeSelect( widget=ContentTypeSelect(
attrs={'filter-for': 'endpoint_b_id'} attrs={'filter-for': 'termination_b_id'}
) )
) )
endpoint_b_id = forms.IntegerField( termination_b_id = forms.IntegerField(
label='Name', label='Name',
widget=APISelect( widget=APISelect(
api_url='/api/dcim/{{endpoint_b_type}}s/?device_id={{endpoint_b_device}}', api_url='/api/dcim/{{termination_b_type}}s/?device_id={{termination_b_device}}',
disabled_indicator='is_connected' disabled_indicator='is_connected'
) )
) )
@ -2198,17 +2198,17 @@ class CableForm(BootstrapMixin, ChainedFieldsMixin, forms.ModelForm):
class Meta: class Meta:
model = Cable model = Cable
fields = [ fields = [
'endpoint_b_site', 'endpoint_b_rack', 'endpoint_b_device', 'livesearch', 'endpoint_b_type', 'termination_b_site', 'termination_b_rack', 'termination_b_device', 'livesearch', 'termination_b_type',
'endpoint_b_id', 'status', 'label', 'termination_b_id', 'status', 'label',
] ]
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(CableForm, self).__init__(*args, **kwargs) super(CableForm, self).__init__(*args, **kwargs)
# Define available types for endpoint B based on the type of endpoint A # Define available types for endpoint B based on the type of endpoint A
endpoint_a_type = self.instance.endpoint_a._meta.model_name termination_a_type = self.instance.termination_a._meta.model_name
self.fields['endpoint_b_type'].queryset = ContentType.objects.filter( self.fields['termination_b_type'].queryset = ContentType.objects.filter(
model__in=COMPATIBLE_ENDPOINT_TYPES.get(endpoint_a_type) model__in=COMPATIBLE_TERMINATION_TYPES.get(termination_a_type)
) )

View File

@ -21,14 +21,14 @@ def console_connections_to_cables(apps, schema_editor):
for consoleport in ConsolePort.objects.filter(connected_endpoint__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.termination_a_type = consoleport_type
c.endpoint_a_id = consoleport.id c.termination_a_id = consoleport.id
c.endpoint_b_type = consoleserverport_type c.termination_b_type = consoleserverport_type
c.endpoint_b_id = consoleport.connected_endpoint_id c.termination_b_id = consoleport.connected_endpoint_id
c.connection_status = consoleport.connection_status c.connection_status = consoleport.connection_status
c.save() c.save()
cable_count = Cable.objects.filter(endpoint_a_type=consoleport_type).count() cable_count = Cable.objects.filter(termination_a_type=consoleport_type).count()
print("{} cables created".format(cable_count)) print("{} cables created".format(cable_count))
@ -50,14 +50,14 @@ def power_connections_to_cables(apps, schema_editor):
for powerport in PowerPort.objects.filter(connected_endpoint__isnull=False): for powerport in PowerPort.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 = powerport_type c.termination_a_type = powerport_type
c.endpoint_a_id = powerport.id c.termination_a_id = powerport.id
c.endpoint_b_type = poweroutlet_type c.termination_b_type = poweroutlet_type
c.endpoint_b_id = powerport.connected_endpoint_id c.termination_b_id = powerport.connected_endpoint_id
c.connection_status = powerport.connection_status c.connection_status = powerport.connection_status
c.save() c.save()
cable_count = Cable.objects.filter(endpoint_a_type=powerport_type).count() cable_count = Cable.objects.filter(termination_a_type=powerport_type).count()
print("{} cables created".format(cable_count)) print("{} cables created".format(cable_count))
@ -78,10 +78,10 @@ def interface_connections_to_cables(apps, schema_editor):
for conn in InterfaceConnection.objects.all(): for conn in InterfaceConnection.objects.all():
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 = interface_type c.termination_a_type = interface_type
c.endpoint_a_id = conn.interface_a_id c.termination_a_id = conn.interface_a_id
c.endpoint_b_type = interface_type c.termination_b_type = interface_type
c.endpoint_b_id = conn.interface_b_id c.termination_b_id = conn.interface_b_id
c.connection_status = conn.connection_status c.connection_status = conn.connection_status
c.save() c.save()
@ -96,7 +96,7 @@ def interface_connections_to_cables(apps, schema_editor):
connection_status=conn.connection_status connection_status=conn.connection_status
) )
cable_count = Cable.objects.filter(endpoint_a_type=interface_type).count() cable_count = Cable.objects.filter(termination_a_type=interface_type).count()
print("{} cables created".format(cable_count)) print("{} cables created".format(cable_count))
@ -117,19 +117,19 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
('created', models.DateField(auto_now_add=True, null=True)), ('created', models.DateField(auto_now_add=True, null=True)),
('last_updated', models.DateTimeField(auto_now=True, null=True)), ('last_updated', models.DateTimeField(auto_now=True, null=True)),
('endpoint_a_id', models.PositiveIntegerField()), ('termination_a_id', models.PositiveIntegerField()),
('endpoint_b_id', models.PositiveIntegerField()), ('termination_b_id', models.PositiveIntegerField()),
('type', models.PositiveSmallIntegerField(blank=True, null=True)), ('type', models.PositiveSmallIntegerField(blank=True, null=True)),
('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')), ('termination_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')), ('termination_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(
name='cable', name='cable',
unique_together={('endpoint_b_type', 'endpoint_b_id'), ('endpoint_a_type', 'endpoint_a_id')}, unique_together={('termination_b_type', 'termination_b_id'), ('termination_a_type', 'termination_a_id')},
), ),
# Alter console port models # Alter console port models

View File

@ -2327,27 +2327,27 @@ class Cable(ChangeLoggedModel):
""" """
A physical connection between two endpoints. A physical connection between two endpoints.
""" """
endpoint_a_type = models.ForeignKey( termination_a_type = models.ForeignKey(
to=ContentType, to=ContentType,
limit_choices_to={'model__in': CABLE_ENDPOINT_TYPES}, limit_choices_to={'model__in': CABLE_TERMINATION_TYPES},
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='+' related_name='+'
) )
endpoint_a_id = models.PositiveIntegerField() termination_a_id = models.PositiveIntegerField()
endpoint_a = GenericForeignKey( termination_a = GenericForeignKey(
ct_field='endpoint_a_type', ct_field='termination_a_type',
fk_field='endpoint_a_id' fk_field='termination_a_id'
) )
endpoint_b_type = models.ForeignKey( termination_b_type = models.ForeignKey(
to=ContentType, to=ContentType,
limit_choices_to={'model__in': CABLE_ENDPOINT_TYPES}, limit_choices_to={'model__in': CABLE_TERMINATION_TYPES},
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='+' related_name='+'
) )
endpoint_b_id = models.PositiveIntegerField() termination_b_id = models.PositiveIntegerField()
endpoint_b = GenericForeignKey( termination_b = GenericForeignKey(
ct_field='endpoint_b_type', ct_field='termination_b_type',
fk_field='endpoint_b_id' fk_field='termination_b_id'
) )
type = models.PositiveSmallIntegerField( type = models.PositiveSmallIntegerField(
choices=CABLE_TYPE_CHOICES, choices=CABLE_TYPE_CHOICES,
@ -2368,8 +2368,8 @@ class Cable(ChangeLoggedModel):
class Meta: class Meta:
unique_together = ( unique_together = (
('endpoint_a_type', 'endpoint_a_id'), ('termination_a_type', 'termination_a_id'),
('endpoint_b_type', 'endpoint_b_id'), ('termination_b_type', 'termination_b_id'),
) )
# TODO: This should follow all cables in a path # TODO: This should follow all cables in a path
@ -2377,4 +2377,4 @@ class Cable(ChangeLoggedModel):
""" """
Return the endpoints connected by this cable path. Return the endpoints connected by this cable path.
""" """
return (self.endpoint_a, self.endpoint_b) return (self.termination_a, self.termination_b)

View File

@ -26,11 +26,11 @@ def update_connected_endpoints(instance, **kwargs):
""" """
When a Cable is saved, update its connected endpoints. When a Cable is saved, update its connected endpoints.
""" """
endpoint_a, endpoint_b = instance.get_path_endpoints() termination_a, termination_b = instance.get_path_endpoints()
endpoint_a.connected_endpoint = endpoint_b termination_a.connected_endpoint = termination_b
endpoint_a.save() termination_a.save()
endpoint_b.connected_endpoint = endpoint_a termination_b.connected_endpoint = termination_a
endpoint_b.save() termination_b.save()
@receiver(post_delete, sender=Cable) @receiver(post_delete, sender=Cable)
@ -38,8 +38,8 @@ def nullify_connected_endpoints(instance, **kwargs):
""" """
When a Cable is deleted, nullify its connected endpoints. When a Cable is deleted, nullify its connected endpoints.
""" """
endpoint_a, endpoint_b = instance.get_path_endpoints() termination_a, termination_b = instance.get_path_endpoints()
endpoint_a.connected_endpoint = None termination_a.connected_endpoint = None
endpoint_a.save() termination_a.save()
endpoint_b.connected_endpoint = None termination_b.connected_endpoint = None
endpoint_b.save() termination_b.save()

View File

@ -623,22 +623,22 @@ class DeviceBayTable(BaseTable):
class CableTable(BaseTable): class CableTable(BaseTable):
device_a = tables.LinkColumn( device_a = tables.LinkColumn(
viewname='dcim:device', viewname='dcim:device',
accessor=Accessor('endpoint_a.device'), accessor=Accessor('termination_a.device'),
args=[Accessor('endpoint_a.device.pk')], args=[Accessor('termination_a.device.pk')],
verbose_name='Device A' verbose_name='Device A'
) )
termination_a = tables.Column( termination_a = tables.Column(
accessor=Accessor('endpoint_a.name'), accessor=Accessor('termination_a.name'),
verbose_name='Component' verbose_name='Component'
) )
device_b = tables.LinkColumn( device_b = tables.LinkColumn(
viewname='dcim:device', viewname='dcim:device',
accessor=Accessor('endpoint_b.device'), accessor=Accessor('termination_b.device'),
args=[Accessor('endpoint_b.device.pk')], args=[Accessor('termination_b.device.pk')],
verbose_name='Device B' verbose_name='Device B'
) )
termination_b = tables.Column( termination_b = tables.Column(
accessor=Accessor('endpoint_b.name'), accessor=Accessor('termination_b.name'),
verbose_name='Component' verbose_name='Component'
) )
# django-tables2 adds CSS `class="label"` which causes rendering issues # django-tables2 adds CSS `class="label"` which causes rendering issues

View File

@ -162,7 +162,7 @@ urlpatterns = [
url(r'^devices/(?P<pk>\d+)/console-ports/add/$', views.ConsolePortCreateView.as_view(), name='consoleport_add'), url(r'^devices/(?P<pk>\d+)/console-ports/add/$', views.ConsolePortCreateView.as_view(), name='consoleport_add'),
url(r'^devices/(?P<pk>\d+)/console-ports/delete/$', views.ConsolePortBulkDeleteView.as_view(), name='consoleport_bulk_delete'), url(r'^devices/(?P<pk>\d+)/console-ports/delete/$', views.ConsolePortBulkDeleteView.as_view(), name='consoleport_bulk_delete'),
# url(r'^console-ports/(?P<pk>\d+)/connect/$', views.ConsolePortConnectView.as_view(), name='consoleport_connect'), # url(r'^console-ports/(?P<pk>\d+)/connect/$', views.ConsolePortConnectView.as_view(), name='consoleport_connect'),
url(r'^console-ports/(?P<endpoint_a_id>\d+)/connect/$', views.CableCreateView.as_view(), name='consoleport_connect', kwargs={'endpoint_a_type': ConsolePort}), url(r'^console-ports/(?P<termination_a_id>\d+)/connect/$', views.CableCreateView.as_view(), name='consoleport_connect', kwargs={'termination_a_type': ConsolePort}),
url(r'^console-ports/(?P<pk>\d+)/disconnect/$', views.ConsolePortDisconnectView.as_view(), name='consoleport_disconnect'), url(r'^console-ports/(?P<pk>\d+)/disconnect/$', views.ConsolePortDisconnectView.as_view(), name='consoleport_disconnect'),
url(r'^console-ports/(?P<pk>\d+)/edit/$', views.ConsolePortEditView.as_view(), name='consoleport_edit'), url(r'^console-ports/(?P<pk>\d+)/edit/$', views.ConsolePortEditView.as_view(), name='consoleport_edit'),
url(r'^console-ports/(?P<pk>\d+)/delete/$', views.ConsolePortDeleteView.as_view(), name='consoleport_delete'), url(r'^console-ports/(?P<pk>\d+)/delete/$', views.ConsolePortDeleteView.as_view(), name='consoleport_delete'),
@ -173,7 +173,7 @@ urlpatterns = [
url(r'^devices/(?P<pk>\d+)/console-server-ports/disconnect/$', views.ConsoleServerPortBulkDisconnectView.as_view(), name='consoleserverport_bulk_disconnect'), url(r'^devices/(?P<pk>\d+)/console-server-ports/disconnect/$', views.ConsoleServerPortBulkDisconnectView.as_view(), name='consoleserverport_bulk_disconnect'),
url(r'^devices/(?P<pk>\d+)/console-server-ports/delete/$', views.ConsoleServerPortBulkDeleteView.as_view(), name='consoleserverport_bulk_delete'), url(r'^devices/(?P<pk>\d+)/console-server-ports/delete/$', views.ConsoleServerPortBulkDeleteView.as_view(), name='consoleserverport_bulk_delete'),
# url(r'^console-server-ports/(?P<pk>\d+)/connect/$', views.ConsoleServerPortConnectView.as_view(), name='consoleserverport_connect'), # url(r'^console-server-ports/(?P<pk>\d+)/connect/$', views.ConsoleServerPortConnectView.as_view(), name='consoleserverport_connect'),
url(r'^console-server-ports/(?P<endpoint_a_id>\d+)/connect/$', views.CableCreateView.as_view(), name='consoleserverport_connect', kwargs={'endpoint_a_type': ConsoleServerPort}), url(r'^console-server-ports/(?P<termination_a_id>\d+)/connect/$', views.CableCreateView.as_view(), name='consoleserverport_connect', kwargs={'termination_a_type': ConsoleServerPort}),
url(r'^console-server-ports/(?P<pk>\d+)/disconnect/$', views.ConsoleServerPortDisconnectView.as_view(), name='consoleserverport_disconnect'), url(r'^console-server-ports/(?P<pk>\d+)/disconnect/$', views.ConsoleServerPortDisconnectView.as_view(), name='consoleserverport_disconnect'),
url(r'^console-server-ports/(?P<pk>\d+)/edit/$', views.ConsoleServerPortEditView.as_view(), name='consoleserverport_edit'), url(r'^console-server-ports/(?P<pk>\d+)/edit/$', views.ConsoleServerPortEditView.as_view(), name='consoleserverport_edit'),
url(r'^console-server-ports/(?P<pk>\d+)/delete/$', views.ConsoleServerPortDeleteView.as_view(), name='consoleserverport_delete'), url(r'^console-server-ports/(?P<pk>\d+)/delete/$', views.ConsoleServerPortDeleteView.as_view(), name='consoleserverport_delete'),
@ -184,7 +184,7 @@ urlpatterns = [
url(r'^devices/(?P<pk>\d+)/power-ports/add/$', views.PowerPortCreateView.as_view(), name='powerport_add'), url(r'^devices/(?P<pk>\d+)/power-ports/add/$', views.PowerPortCreateView.as_view(), name='powerport_add'),
url(r'^devices/(?P<pk>\d+)/power-ports/delete/$', views.PowerPortBulkDeleteView.as_view(), name='powerport_bulk_delete'), url(r'^devices/(?P<pk>\d+)/power-ports/delete/$', views.PowerPortBulkDeleteView.as_view(), name='powerport_bulk_delete'),
# url(r'^power-ports/(?P<pk>\d+)/connect/$', views.PowerPortConnectView.as_view(), name='powerport_connect'), # url(r'^power-ports/(?P<pk>\d+)/connect/$', views.PowerPortConnectView.as_view(), name='powerport_connect'),
url(r'^power-ports/(?P<endpoint_a_id>\d+)/connect/$', views.CableCreateView.as_view(), name='powerport_connect', kwargs={'endpoint_a_type': PowerPort}), url(r'^power-ports/(?P<termination_a_id>\d+)/connect/$', views.CableCreateView.as_view(), name='powerport_connect', kwargs={'termination_a_type': PowerPort}),
url(r'^power-ports/(?P<pk>\d+)/disconnect/$', views.PowerPortDisconnectView.as_view(), name='powerport_disconnect'), url(r'^power-ports/(?P<pk>\d+)/disconnect/$', views.PowerPortDisconnectView.as_view(), name='powerport_disconnect'),
url(r'^power-ports/(?P<pk>\d+)/edit/$', views.PowerPortEditView.as_view(), name='powerport_edit'), url(r'^power-ports/(?P<pk>\d+)/edit/$', views.PowerPortEditView.as_view(), name='powerport_edit'),
url(r'^power-ports/(?P<pk>\d+)/delete/$', views.PowerPortDeleteView.as_view(), name='powerport_delete'), url(r'^power-ports/(?P<pk>\d+)/delete/$', views.PowerPortDeleteView.as_view(), name='powerport_delete'),
@ -195,7 +195,7 @@ urlpatterns = [
url(r'^devices/(?P<pk>\d+)/power-outlets/disconnect/$', views.PowerOutletBulkDisconnectView.as_view(), name='poweroutlet_bulk_disconnect'), url(r'^devices/(?P<pk>\d+)/power-outlets/disconnect/$', views.PowerOutletBulkDisconnectView.as_view(), name='poweroutlet_bulk_disconnect'),
url(r'^devices/(?P<pk>\d+)/power-outlets/delete/$', views.PowerOutletBulkDeleteView.as_view(), name='poweroutlet_bulk_delete'), url(r'^devices/(?P<pk>\d+)/power-outlets/delete/$', views.PowerOutletBulkDeleteView.as_view(), name='poweroutlet_bulk_delete'),
# url(r'^power-outlets/(?P<pk>\d+)/connect/$', views.PowerOutletConnectView.as_view(), name='poweroutlet_connect'), # url(r'^power-outlets/(?P<pk>\d+)/connect/$', views.PowerOutletConnectView.as_view(), name='poweroutlet_connect'),
url(r'^power-outlets/(?P<endpoint_a_id>\d+)/connect/$', views.CableCreateView.as_view(), name='poweroutlet_connect', kwargs={'endpoint_a_type': PowerOutlet}), url(r'^power-outlets/(?P<termination_a_id>\d+)/connect/$', views.CableCreateView.as_view(), name='poweroutlet_connect', kwargs={'termination_a_type': PowerOutlet}),
url(r'^power-outlets/(?P<pk>\d+)/disconnect/$', views.PowerOutletDisconnectView.as_view(), name='poweroutlet_disconnect'), url(r'^power-outlets/(?P<pk>\d+)/disconnect/$', views.PowerOutletDisconnectView.as_view(), name='poweroutlet_disconnect'),
url(r'^power-outlets/(?P<pk>\d+)/edit/$', views.PowerOutletEditView.as_view(), name='poweroutlet_edit'), url(r'^power-outlets/(?P<pk>\d+)/edit/$', views.PowerOutletEditView.as_view(), name='poweroutlet_edit'),
url(r'^power-outlets/(?P<pk>\d+)/delete/$', views.PowerOutletDeleteView.as_view(), name='poweroutlet_delete'), url(r'^power-outlets/(?P<pk>\d+)/delete/$', views.PowerOutletDeleteView.as_view(), name='poweroutlet_delete'),
@ -207,7 +207,7 @@ urlpatterns = [
url(r'^devices/(?P<pk>\d+)/interfaces/edit/$', views.InterfaceBulkEditView.as_view(), name='interface_bulk_edit'), url(r'^devices/(?P<pk>\d+)/interfaces/edit/$', views.InterfaceBulkEditView.as_view(), name='interface_bulk_edit'),
url(r'^devices/(?P<pk>\d+)/interfaces/disconnect/$', views.InterfaceBulkDisconnectView.as_view(), name='interface_bulk_disconnect'), url(r'^devices/(?P<pk>\d+)/interfaces/disconnect/$', views.InterfaceBulkDisconnectView.as_view(), name='interface_bulk_disconnect'),
url(r'^devices/(?P<pk>\d+)/interfaces/delete/$', views.InterfaceBulkDeleteView.as_view(), name='interface_bulk_delete'), url(r'^devices/(?P<pk>\d+)/interfaces/delete/$', views.InterfaceBulkDeleteView.as_view(), name='interface_bulk_delete'),
url(r'^interfaces/(?P<endpoint_a_id>\d+)/connect/$', views.CableCreateView.as_view(), name='interface_connect', kwargs={'endpoint_a_type': Interface}), url(r'^interfaces/(?P<termination_a_id>\d+)/connect/$', views.CableCreateView.as_view(), name='interface_connect', kwargs={'termination_a_type': Interface}),
url(r'^interfaces/(?P<pk>\d+)/$', views.InterfaceView.as_view(), name='interface'), url(r'^interfaces/(?P<pk>\d+)/$', views.InterfaceView.as_view(), name='interface'),
url(r'^interfaces/(?P<pk>\d+)/edit/$', views.InterfaceEditView.as_view(), name='interface_edit'), url(r'^interfaces/(?P<pk>\d+)/edit/$', views.InterfaceEditView.as_view(), name='interface_edit'),
url(r'^interfaces/(?P<pk>\d+)/assign-vlans/$', views.InterfaceAssignVLANsView.as_view(), name='interface_assign_vlans'), url(r'^interfaces/(?P<pk>\d+)/assign-vlans/$', views.InterfaceAssignVLANsView.as_view(), name='interface_assign_vlans'),

View File

@ -2015,7 +2015,7 @@ class DeviceBulkAddDeviceBayView(PermissionRequiredMixin, BulkComponentCreateVie
class CableListView(ObjectListView): class CableListView(ObjectListView):
queryset = Cable.objects.prefetch_related( queryset = Cable.objects.prefetch_related(
'endpoint_a__device', 'endpoint_b__device' 'termination_a__device', 'termination_b__device'
) )
# filter = filters.CableFilter # filter = filters.CableFilter
# filter_form = forms.CableFilterForm # filter_form = forms.CableFilterForm
@ -2032,9 +2032,9 @@ class CableCreateView(PermissionRequiredMixin, ObjectEditView):
def alter_obj(self, obj, request, url_args, url_kwargs): def alter_obj(self, obj, request, url_args, url_kwargs):
# Retrieve endpoint A based on the given type and PK # Retrieve endpoint A based on the given type and PK
endpoint_a_type = url_kwargs.get('endpoint_a_type') termination_a_type = url_kwargs.get('termination_a_type')
endpoint_a_id = url_kwargs.get('endpoint_a_id') termination_a_id = url_kwargs.get('termination_a_id')
obj.endpoint_a = endpoint_a_type.objects.get(pk=endpoint_a_id) obj.termination_a = termination_a_type.objects.get(pk=termination_a_id)
return obj return obj

View File

@ -20,8 +20,8 @@
</div> </div>
</div> </div>
{% endif %} {% endif %}
{% with endpoint_a=form.instance.endpoint_a %} {% with termination_a=form.instance.termination_a %}
<h3>{% block title %}Connect {{ endpoint_a.device }} {{ endpoint_a }}{% endblock %}</h3> <h3>{% block title %}Connect {{ termination_a.device }} {{ termination_a }}{% endblock %}</h3>
<div class="row"> <div class="row">
<div class="col-md-5"> <div class="col-md-5">
<div class="panel panel-default"> <div class="panel panel-default">
@ -32,25 +32,25 @@
<div class="form-group"> <div class="form-group">
<label class="col-md-3 control-label required">Site</label> <label class="col-md-3 control-label required">Site</label>
<div class="col-md-9"> <div class="col-md-9">
<p class="form-control-static">{{ endpoint_a.device.site }}</p> <p class="form-control-static">{{ termination_a.device.site }}</p>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-md-3 control-label required">Rack</label> <label class="col-md-3 control-label required">Rack</label>
<div class="col-md-9"> <div class="col-md-9">
<p class="form-control-static">{{ endpoint_a.device.rack|default:"None" }}</p> <p class="form-control-static">{{ termination_a.device.rack|default:"None" }}</p>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-md-3 control-label required">Device</label> <label class="col-md-3 control-label required">Device</label>
<div class="col-md-9"> <div class="col-md-9">
<p class="form-control-static">{{ endpoint_a.device }}</p> <p class="form-control-static">{{ termination_a.device }}</p>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-md-3 control-label required">Name</label> <label class="col-md-3 control-label required">Name</label>
<div class="col-md-9"> <div class="col-md-9">
<p class="form-control-static">{{ endpoint_a }}</p> <p class="form-control-static">{{ termination_a }}</p>
</div> </div>
</div> </div>
</div> </div>
@ -74,13 +74,13 @@
{% render_field form.livesearch %} {% render_field form.livesearch %}
</div> </div>
<div class="tab-pane" id="select"> <div class="tab-pane" id="select">
{% render_field form.endpoint_b_site %} {% render_field form.termination_b_site %}
{% render_field form.endpoint_b_rack %} {% render_field form.termination_b_rack %}
{% render_field form.endpoint_b_device %} {% render_field form.termination_b_device %}
</div> </div>
</div> </div>
{% render_field form.endpoint_b_type %} {% render_field form.termination_b_type %}
{% render_field form.endpoint_b_id %} {% render_field form.termination_b_id %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -30,7 +30,7 @@
<i class="glyphicon glyphicon-resize-full" aria-hidden="true"></i> <i class="glyphicon glyphicon-resize-full" aria-hidden="true"></i>
</a> </a>
{% else %} {% else %}
<a href="{% url 'dcim:consoleport_connect' endpoint_a_id=cp.pk %}" title="Connect" class="btn btn-success btn-xs"> <a href="{% url 'dcim:consoleport_connect' termination_a_id=cp.pk %}" title="Connect" class="btn btn-success btn-xs">
<i class="glyphicon glyphicon-resize-small" aria-hidden="true"></i> <i class="glyphicon glyphicon-resize-small" aria-hidden="true"></i>
</a> </a>
{% endif %} {% endif %}

View File

@ -35,7 +35,7 @@
<i class="glyphicon glyphicon-resize-full" aria-hidden="true"></i> <i class="glyphicon glyphicon-resize-full" aria-hidden="true"></i>
</a> </a>
{% else %} {% else %}
<a href="{% url 'dcim:consoleserverport_connect' endpoint_a_id=csp.pk %}" title="Connect" class="btn btn-success btn-xs"> <a href="{% url 'dcim:consoleserverport_connect' termination_a_id=csp.pk %}" title="Connect" class="btn btn-success btn-xs">
<i class="glyphicon glyphicon-resize-small" aria-hidden="true"></i> <i class="glyphicon glyphicon-resize-small" aria-hidden="true"></i>
</a> </a>
{% endif %} {% endif %}

View File

@ -106,7 +106,7 @@
<i class="glyphicon glyphicon-resize-full" aria-hidden="true"></i> <i class="glyphicon glyphicon-resize-full" aria-hidden="true"></i>
</a> </a>
{% else %} {% else %}
<a href="{% url 'dcim:interface_connect' endpoint_a_id=device.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-success btn-xs" title="Connect"> <a href="{% url 'dcim:interface_connect' termination_a_id=device.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-success btn-xs" title="Connect">
<i class="glyphicon glyphicon-resize-small" aria-hidden="true"></i> <i class="glyphicon glyphicon-resize-small" aria-hidden="true"></i>
</a> </a>
{% endif %} {% endif %}

View File

@ -35,7 +35,7 @@
<i class="glyphicon glyphicon-resize-full" aria-hidden="true"></i> <i class="glyphicon glyphicon-resize-full" aria-hidden="true"></i>
</a> </a>
{% else %} {% else %}
<a href="{% url 'dcim:poweroutlet_connect' endpoint_a_id=po.pk %}" title="Connect" class="btn btn-success btn-xs"> <a href="{% url 'dcim:poweroutlet_connect' termination_a_id=po.pk %}" title="Connect" class="btn btn-success btn-xs">
<i class="glyphicon glyphicon-resize-small" aria-hidden="true"></i> <i class="glyphicon glyphicon-resize-small" aria-hidden="true"></i>
</a> </a>
{% endif %} {% endif %}

View File

@ -30,7 +30,7 @@
<i class="glyphicon glyphicon-resize-full" aria-hidden="true"></i> <i class="glyphicon glyphicon-resize-full" aria-hidden="true"></i>
</a> </a>
{% else %} {% else %}
<a href="{% url 'dcim:powerport_connect' endpoint_a_id=pp.pk %}" title="Connect" class="btn btn-success btn-xs"> <a href="{% url 'dcim:powerport_connect' termination_a_id=pp.pk %}" title="Connect" class="btn btn-success btn-xs">
<i class="glyphicon glyphicon-resize-small" aria-hidden="true"></i> <i class="glyphicon glyphicon-resize-small" aria-hidden="true"></i>
</a> </a>
{% endif %} {% endif %}