From 9991985170d816d7a5fd5a8bb16299a821256ea9 Mon Sep 17 00:00:00 2001 From: Brian Candler Date: Thu, 17 Jan 2019 11:56:10 +0000 Subject: [PATCH 01/18] Clarify how chassis-based switches and routers are supposed to be modelled --- docs/core-functionality/devices.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/core-functionality/devices.md b/docs/core-functionality/devices.md index e51bf541c29..176a7067617 100644 --- a/docs/core-functionality/devices.md +++ b/docs/core-functionality/devices.md @@ -13,6 +13,10 @@ Some devices house child devices which share physical resources, like space and !!! note This parent/child relationship is **not** suitable for modeling chassis-based devices, wherein child members share a common control plane. + For that application you should create a single Device for the chassis, and add Interfaces directly to it. Interfaces can be created in bulk using range patterns, e.g. "Gi1/[1-24]". + + Add Inventory Items if you want to record the line cards themselves as separate entities. There is no explicit relationship between each interface and its line card, but it may be implied by the naming (e.g. interfaces "Gi1/x" are on line card 1) + ## Manufacturers Each device type must be assigned to a manufacturer. The model number of a device type must be unique to its manufacturer. @@ -93,6 +97,10 @@ Pass-through ports can also be used to model "bump in the wire" devices, such as Device bays represent the ability of a device to house child devices. For example, you might install four blade servers into a 2U chassis. The chassis would appear in the rack elevation as a 2U device with four device bays. Each server within it would be defined as a 0U device installed in one of the device bays. Child devices do not appear within rack elevations, but they are included in the "Non-Racked Devices" list within the rack view. +Child devices are first-class Devices in their own right: that is, fully independent managed entities which don't share any control plane with the parent. Just like normal devices, child devices have their own platform (OS), role, tags, and interfaces. You cannot create a LAG between interfaces in different child devices. + +Therefore, Device bays are **not** suitable for modeling chassis-based switches and routers. These should instead be modeled as a single Device, with the line cards as Inventory Items. + ## Device Roles Devices can be organized by functional roles. These roles are fully customizable. For example, you might create roles for core switches, distribution switches, and access switches. @@ -111,7 +119,7 @@ The assignment of platforms to devices is an optional feature, and may be disreg # Inventory Items -Inventory items represent hardware components installed within a device, such as a power supply or CPU. Currently, these are used merely for inventory tracking, although future development might see their functionality expand. Like device types, each item can optionally be assigned a manufacturer. +Inventory items represent hardware components installed within a device, such as a power supply or CPU or line card. Currently, these are used merely for inventory tracking, although future development might see their functionality expand. Like device types, each item can optionally be assigned a manufacturer. --- From 2f1018c7420253a9e53e4bad5eafa1f2443b8938 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 31 Jan 2019 16:12:00 -0500 Subject: [PATCH 02/18] Post-release version bump --- netbox/netbox/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index f2692776afb..d857af00e2e 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -22,7 +22,7 @@ except ImportError: ) -VERSION = '2.5.5' +VERSION = '2.5.6-dev' BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) From 69a5d3644a407f9de314294c7ca419b3e95224b1 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 1 Feb 2019 09:12:48 -0500 Subject: [PATCH 03/18] Closes #2844: Correct display of far cable end for pass-through ports --- CHANGELOG.md | 8 ++++++++ netbox/dcim/models.py | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf51633f830..12a2fbaa644 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +v2.5.6 (FUTURE) + +## Bug Fixes + +* [#2844](https://github.com/digitalocean/netbox/issues/2844) - Correct display of far cable end for pass-through ports + +--- + v2.5.5 (2019-01-31) ## Enhancements diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 8c6ed96502e..6a6e0067d32 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -169,9 +169,9 @@ class CableTermination(models.Model): def get_cable_peer(self): if self.cable is None: return None - if self._cabled_as_a: + if self._cabled_as_a.exists(): return self.cable.termination_b - if self._cabled_as_b: + if self._cabled_as_b.exists(): return self.cable.termination_a From f733d5a4da9a88f881eb5892e7a1de09a2a7de48 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 6 Feb 2019 10:23:30 -0500 Subject: [PATCH 04/18] Fixes #2857: Add display_name to DeviceType API serializer; fix DeviceType list for bulk device edit --- CHANGELOG.md | 1 + netbox/dcim/api/nested_serializers.py | 2 +- netbox/dcim/api/serializers.py | 4 ++-- netbox/dcim/forms.py | 3 ++- netbox/dcim/models.py | 2 +- netbox/dcim/tables.py | 2 +- netbox/templates/dcim/device.html | 4 ++-- netbox/templates/dcim/device_inventory.html | 2 +- netbox/templates/dcim/inc/devicebay.html | 2 +- netbox/templates/dcim/inc/rack_elevation.html | 2 +- netbox/templates/dcim/rack.html | 2 +- 11 files changed, 14 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12a2fbaa644..b7d487c70c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ v2.5.6 (FUTURE) ## Bug Fixes * [#2844](https://github.com/digitalocean/netbox/issues/2844) - Correct display of far cable end for pass-through ports +* [#2857](https://github.com/digitalocean/netbox/issues/2857) - Add `display_name` to DeviceType API serializer; fix DeviceType list for bulk device edit --- diff --git a/netbox/dcim/api/nested_serializers.py b/netbox/dcim/api/nested_serializers.py index 4d747859545..e53259e942f 100644 --- a/netbox/dcim/api/nested_serializers.py +++ b/netbox/dcim/api/nested_serializers.py @@ -100,7 +100,7 @@ class NestedDeviceTypeSerializer(WritableNestedSerializer): class Meta: model = DeviceType - fields = ['id', 'url', 'manufacturer', 'model', 'slug'] + fields = ['id', 'url', 'manufacturer', 'model', 'slug', 'display_name'] class NestedRearPortTemplateSerializer(WritableNestedSerializer): diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 765ed83dd08..c17400a359b 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -180,8 +180,8 @@ class DeviceTypeSerializer(TaggitSerializer, CustomFieldModelSerializer): class Meta: model = DeviceType fields = [ - 'id', 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', - 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'instance_count', + 'id', 'manufacturer', 'model', 'slug', 'display_name', 'part_number', 'u_height', 'is_full_depth', + 'subdevice_role', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'instance_count', ] diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 4d02506fec3..d4217b75ddc 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1599,7 +1599,8 @@ class DeviceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditF required=False, label='Type', widget=APISelect( - api_url="/api/dcim/device-types/" + api_url="/api/dcim/device-types/", + display_field='display_name' ) ) device_role = forms.ModelChoiceField( diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 6a6e0067d32..524689ecb75 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -980,7 +980,7 @@ class DeviceType(ChangeLoggedModel, CustomFieldModel): }) @property - def full_name(self): + def display_name(self): return '{} {}'.format(self.manufacturer.name, self.model) @property diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index 0ab1d594c42..dca1a8fd155 100644 --- a/netbox/dcim/tables.py +++ b/netbox/dcim/tables.py @@ -517,7 +517,7 @@ class DeviceTable(BaseTable): device_role = tables.TemplateColumn(DEVICE_ROLE, verbose_name='Role') device_type = tables.LinkColumn( 'dcim:devicetype', args=[Accessor('device_type.pk')], verbose_name='Type', - text=lambda record: record.device_type.full_name + text=lambda record: record.device_type.display_name ) class Meta(BaseTable.Meta): diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 8ee50c4234f..29ff467ce53 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -163,7 +163,7 @@ Device Type - {{ device.device_type.full_name }} ({{ device.device_type.u_height }}U) + {{ device.device_type.display_name }} ({{ device.device_type.u_height }}U) @@ -416,7 +416,7 @@ {% endif %} - {{ rd.device_type.full_name }} + {{ rd.device_type.display_name }} {% endfor %} diff --git a/netbox/templates/dcim/device_inventory.html b/netbox/templates/dcim/device_inventory.html index d9f8c549506..106e5a6e256 100644 --- a/netbox/templates/dcim/device_inventory.html +++ b/netbox/templates/dcim/device_inventory.html @@ -13,7 +13,7 @@ - + diff --git a/netbox/templates/dcim/inc/devicebay.html b/netbox/templates/dcim/inc/devicebay.html index 656116c89e1..dc2977855ec 100644 --- a/netbox/templates/dcim/inc/devicebay.html +++ b/netbox/templates/dcim/inc/devicebay.html @@ -15,7 +15,7 @@ {{ devicebay.installed_device }} {% else %} diff --git a/netbox/templates/dcim/inc/rack_elevation.html b/netbox/templates/dcim/inc/rack_elevation.html index e7beeb9ba3a..ced6eb92902 100644 --- a/netbox/templates/dcim/inc/rack_elevation.html +++ b/netbox/templates/dcim/inc/rack_elevation.html @@ -26,7 +26,7 @@
  • {% ifequal u.device.face face_id %} + data-content="{{ u.device.device_role }}
    {{ u.device.device_type.display_name }} ({{ u.device.device_type.u_height }}U){% if u.device.asset_tag %}
    {{ u.device.asset_tag }}{% endif %}{% if u.device.serial %}
    {{ u.device.serial }}{% endif %}"> {{ u.device }} {% if u.device.devicebay_count %} ({{ u.device.get_children.count }}/{{ u.device.devicebay_count }}) diff --git a/netbox/templates/dcim/rack.html b/netbox/templates/dcim/rack.html index 1d92aac2240..fe9e2ab7c0c 100644 --- a/netbox/templates/dcim/rack.html +++ b/netbox/templates/dcim/rack.html @@ -208,7 +208,7 @@
    {{ device }}
  • - + + {# Checkbox #} {% if perms.dcim.change_interface or perms.dcim.delete_interface %} From ca51fab4d8611d50672cc994bee8f72d98387e23 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 6 Feb 2019 10:44:05 -0500 Subject: [PATCH 06/18] Fixes #2845: Enable filtering of rack unit list by unit ID --- CHANGELOG.md | 1 + netbox/dcim/api/views.py | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd60dc2fc83..8a95ee6265b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ v2.5.6 (FUTURE) ## Bug Fixes * [#2844](https://github.com/digitalocean/netbox/issues/2844) - Correct display of far cable end for pass-through ports +* [#2845](https://github.com/digitalocean/netbox/issues/2845) - Enable filtering of rack unit list by unit ID * [#2856](https://github.com/digitalocean/netbox/issues/2856) - Fix navigation links between LAG interfaces and their members on device view * [#2857](https://github.com/digitalocean/netbox/issues/2857) - Add `display_name` to DeviceType API serializer; fix DeviceType list for bulk device edit diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index d01358447dc..4e14d816379 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -159,6 +159,11 @@ class RackViewSet(CustomFieldModelViewSet): exclude_pk = None elevation = rack.get_rack_units(face, exclude_pk) + # Enable filtering rack units by ID + q = request.GET.get('q', None) + if q: + elevation = [u for u in elevation if q in str(u['id'])] + page = self.paginate_queryset(elevation) if page is not None: rack_units = serializers.RackUnitSerializer(page, many=True, context={'request': request}) From 42d1d6e1b0678b6fea956c6247d3d7f48e889c30 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 6 Feb 2019 10:48:14 -0500 Subject: [PATCH 07/18] Fixes #2841: Fix filtering by VRF for prefix and IP address lists --- CHANGELOG.md | 1 + netbox/ipam/forms.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a95ee6265b..a4d87d347ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ v2.5.6 (FUTURE) ## Bug Fixes +* [#2841](https://github.com/digitalocean/netbox/issues/2841) - Fix filtering by VRF for prefix and IP address lists * [#2844](https://github.com/digitalocean/netbox/issues/2844) - Correct display of far cable end for pass-through ports * [#2845](https://github.com/digitalocean/netbox/issues/2845) - Enable filtering of rack unit list by unit ID * [#2856](https://github.com/digitalocean/netbox/issues/2856) - Fix navigation links between LAG interfaces and their members on device view diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py index 0864223d135..d0e25f580c4 100644 --- a/netbox/ipam/forms.py +++ b/netbox/ipam/forms.py @@ -531,7 +531,7 @@ class PrefixFilterForm(BootstrapMixin, CustomFieldFilterForm): null_label='-- Global --', widget=APISelectMultiple( api_url="/api/ipam/vrfs/", - value_field="slug", + value_field="rd", null_option=True, ) ) @@ -980,7 +980,7 @@ class IPAddressFilterForm(BootstrapMixin, CustomFieldFilterForm): null_label='-- Global --', widget=APISelectMultiple( api_url="/api/ipam/vrfs/", - value_field="slug", + value_field="rd", null_option=True, ) ) From 375e66047d9e591c742674ba4c3451b3219a2997 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 8 Feb 2019 09:04:43 -0500 Subject: [PATCH 08/18] Fixes #2864: Correct display of VRF name when no RD is assigned --- CHANGELOG.md | 1 + netbox/ipam/models.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4d87d347ab..fdf0cb1e43b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ v2.5.6 (FUTURE) * [#2845](https://github.com/digitalocean/netbox/issues/2845) - Enable filtering of rack unit list by unit ID * [#2856](https://github.com/digitalocean/netbox/issues/2856) - Fix navigation links between LAG interfaces and their members on device view * [#2857](https://github.com/digitalocean/netbox/issues/2857) - Add `display_name` to DeviceType API serializer; fix DeviceType list for bulk device edit +* [#2864](https://github.com/digitalocean/netbox/issues/2864) - Correct display of VRF name when no RD is assigned --- diff --git a/netbox/ipam/models.py b/netbox/ipam/models.py index 7c879595fd7..181852ad33a 100644 --- a/netbox/ipam/models.py +++ b/netbox/ipam/models.py @@ -81,9 +81,9 @@ class VRF(ChangeLoggedModel, CustomFieldModel): @property def display_name(self): - if self.name and self.rd: + if self.rd: return "{} ({})".format(self.name, self.rd) - return None + return self.name class RIR(ChangeLoggedModel): From 5256077a3ca291c318337de55960c188501f81ec Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 8 Feb 2019 09:10:31 -0500 Subject: [PATCH 09/18] Fixes #2862: Follow return URL when connecting a cable --- CHANGELOG.md | 1 + netbox/templates/dcim/cable_connect.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fdf0cb1e43b..52e57e3c3c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ v2.5.6 (FUTURE) * [#2845](https://github.com/digitalocean/netbox/issues/2845) - Enable filtering of rack unit list by unit ID * [#2856](https://github.com/digitalocean/netbox/issues/2856) - Fix navigation links between LAG interfaces and their members on device view * [#2857](https://github.com/digitalocean/netbox/issues/2857) - Add `display_name` to DeviceType API serializer; fix DeviceType list for bulk device edit +* [#2862](https://github.com/digitalocean/netbox/issues/2862) - Follow return URL when connecting a cable * [#2864](https://github.com/digitalocean/netbox/issues/2864) - Correct display of VRF name when no RD is assigned --- diff --git a/netbox/templates/dcim/cable_connect.html b/netbox/templates/dcim/cable_connect.html index 965a94ac7cb..cad396966b2 100644 --- a/netbox/templates/dcim/cable_connect.html +++ b/netbox/templates/dcim/cable_connect.html @@ -4,7 +4,7 @@ {% load form_helpers %} {% block content %} -
    + {% csrf_token %} {% for field in form.hidden_fields %} {{ field }} From 100809f11acd45404ed1925cc98f33157cedd8ef Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 8 Feb 2019 09:31:10 -0500 Subject: [PATCH 10/18] Closes #2854: Enable bulk editing of pass-through ports --- CHANGELOG.md | 4 +++ netbox/dcim/forms.py | 42 +++++++++++++++++++++++++++++++ netbox/dcim/urls.py | 2 ++ netbox/dcim/views.py | 16 ++++++++++++ netbox/templates/dcim/device.html | 6 +++++ 5 files changed, 70 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52e57e3c3c7..7ba9607a007 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ v2.5.6 (FUTURE) +## Enhancements + +* [#2854](https://github.com/digitalocean/netbox/issues/2854) - Enable bulk editing of pass-through ports + ## Bug Fixes * [#2841](https://github.com/digitalocean/netbox/issues/2841) - Fix filtering by VRF for prefix and IP address lists diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index d4217b75ddc..bf774dfcbd7 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -2360,6 +2360,27 @@ class FrontPortCreateForm(ComponentForm): } +class FrontPortBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Interface.objects.all(), + widget=forms.MultipleHiddenInput() + ) + type = forms.ChoiceField( + choices=add_blank_choice(PORT_TYPE_CHOICES), + required=False, + widget=StaticSelect2() + ) + description = forms.CharField( + max_length=100, + required=False + ) + + class Meta: + nullable_fields = [ + 'description', + ] + + class FrontPortBulkRenameForm(BulkRenameForm): pk = forms.ModelMultipleChoiceField( queryset=FrontPort.objects.all(), @@ -2413,6 +2434,27 @@ class RearPortCreateForm(ComponentForm): ) +class RearPortBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Interface.objects.all(), + widget=forms.MultipleHiddenInput() + ) + type = forms.ChoiceField( + choices=add_blank_choice(PORT_TYPE_CHOICES), + required=False, + widget=StaticSelect2() + ) + description = forms.CharField( + max_length=100, + required=False + ) + + class Meta: + nullable_fields = [ + 'description', + ] + + class RearPortBulkRenameForm(BulkRenameForm): pk = forms.ModelMultipleChoiceField( queryset=RearPort.objects.all(), diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index dc1fbbf39c4..21d620af15e 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -215,6 +215,7 @@ urlpatterns = [ # Front ports # url(r'^devices/front-ports/add/$', views.DeviceBulkAddFrontPortView.as_view(), name='device_bulk_add_frontport'), url(r'^devices/(?P\d+)/front-ports/add/$', views.FrontPortCreateView.as_view(), name='frontport_add'), + url(r'^devices/(?P\d+)/front-ports/edit/$', views.FrontPortBulkEditView.as_view(), name='frontport_bulk_edit'), url(r'^devices/(?P\d+)/front-ports/delete/$', views.FrontPortBulkDeleteView.as_view(), name='frontport_bulk_delete'), url(r'^front-ports/(?P\d+)/connect/$', views.CableCreateView.as_view(), name='frontport_connect', kwargs={'termination_a_type': FrontPort}), url(r'^front-ports/(?P\d+)/edit/$', views.FrontPortEditView.as_view(), name='frontport_edit'), @@ -226,6 +227,7 @@ urlpatterns = [ # Rear ports # url(r'^devices/rear-ports/add/$', views.DeviceBulkAddRearPortView.as_view(), name='device_bulk_add_rearport'), url(r'^devices/(?P\d+)/rear-ports/add/$', views.RearPortCreateView.as_view(), name='rearport_add'), + url(r'^devices/(?P\d+)/rear-ports/edit/$', views.RearPortBulkEditView.as_view(), name='rearport_bulk_edit'), url(r'^devices/(?P\d+)/rear-ports/delete/$', views.RearPortBulkDeleteView.as_view(), name='rearport_bulk_delete'), url(r'^rear-ports/(?P\d+)/connect/$', views.CableCreateView.as_view(), name='rearport_connect', kwargs={'termination_a_type': RearPort}), url(r'^rear-ports/(?P\d+)/edit/$', views.RearPortEditView.as_view(), name='rearport_edit'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 350ed15420c..9aa4b235485 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1360,6 +1360,14 @@ class FrontPortDeleteView(PermissionRequiredMixin, ObjectDeleteView): model = FrontPort +class FrontPortBulkEditView(PermissionRequiredMixin, BulkEditView): + permission_required = 'dcim.change_frontport' + queryset = FrontPort.objects.all() + parent_model = Device + table = tables.FrontPortTable + form = forms.FrontPortBulkEditForm + + class FrontPortBulkRenameView(PermissionRequiredMixin, BulkRenameView): permission_required = 'dcim.change_frontport' queryset = FrontPort.objects.all() @@ -1404,6 +1412,14 @@ class RearPortDeleteView(PermissionRequiredMixin, ObjectDeleteView): model = RearPort +class RearPortBulkEditView(PermissionRequiredMixin, BulkEditView): + permission_required = 'dcim.change_rearport' + queryset = RearPort.objects.all() + parent_model = Device + table = tables.RearPortTable + form = forms.RearPortBulkEditForm + + class RearPortBulkRenameView(PermissionRequiredMixin, BulkRenameView): permission_required = 'dcim.change_rearport' queryset = RearPort.objects.all() diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 29ff467ce53..716752c57b7 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -698,6 +698,9 @@ + @@ -752,6 +755,9 @@ + From 5da9d6b46b8e3500b55a71645cbceec72c8fb452 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 8 Feb 2019 09:57:04 -0500 Subject: [PATCH 11/18] Closes #2839: Add "110 punch" type for pass-through ports --- CHANGELOG.md | 1 + netbox/dcim/constants.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ba9607a007..b8e65679603 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ v2.5.6 (FUTURE) ## Enhancements +* [#2839](https://github.com/digitalocean/netbox/issues/2839) - Add "110 punch" type for pass-through ports * [#2854](https://github.com/digitalocean/netbox/issues/2854) - Enable bulk editing of pass-through ports ## Bug Fixes diff --git a/netbox/dcim/constants.py b/netbox/dcim/constants.py index 27f8b6f7980..f8f9231fd89 100644 --- a/netbox/dcim/constants.py +++ b/netbox/dcim/constants.py @@ -255,6 +255,7 @@ IFACE_MODE_CHOICES = [ # Pass-through port types PORT_TYPE_8P8C = 1000 +PORT_TYPE_110_PUNCH = 1100 PORT_TYPE_ST = 2000 PORT_TYPE_SC = 2100 PORT_TYPE_FC = 2200 @@ -267,6 +268,7 @@ PORT_TYPE_CHOICES = [ 'Copper', [ [PORT_TYPE_8P8C, '8P8C'], + [PORT_TYPE_110_PUNCH, '110 Punch'], ], ], [ From dfa4dfa4a4326a640009aac3783e4d460a63975a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 13 Feb 2019 10:06:56 -0500 Subject: [PATCH 12/18] Fixes #2877: Fixed device role label display on light background color --- CHANGELOG.md | 1 + netbox/dcim/tables.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8e65679603..9c5c8fbe7e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ v2.5.6 (FUTURE) * [#2857](https://github.com/digitalocean/netbox/issues/2857) - Add `display_name` to DeviceType API serializer; fix DeviceType list for bulk device edit * [#2862](https://github.com/digitalocean/netbox/issues/2862) - Follow return URL when connecting a cable * [#2864](https://github.com/digitalocean/netbox/issues/2864) - Correct display of VRF name when no RD is assigned +* [#2877](https://github.com/digitalocean/netbox/issues/2877) - Fixed device role label display on light background color --- diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index dca1a8fd155..3cbd9378dd1 100644 --- a/netbox/dcim/tables.py +++ b/netbox/dcim/tables.py @@ -136,7 +136,8 @@ PLATFORM_ACTIONS = """ """ DEVICE_ROLE = """ - +{% load helpers %} + """ STATUS_LABEL = """ From 3b4bcc881f4ddb72fb3780535857eabc3c8d2fad Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 13 Feb 2019 10:09:33 -0500 Subject: [PATCH 13/18] Fix broken test --- netbox/dcim/tests/test_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 980c57e865b..aa57d4790af 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -855,7 +855,7 @@ class DeviceTypeTest(APITestCase): self.assertEqual( sorted(response.data['results'][0]), - ['id', 'manufacturer', 'model', 'slug', 'url'] + ['display_name', 'id', 'manufacturer', 'model', 'slug', 'url'] ) def test_create_devicetype(self): From 57fecdbf173a6d611e9e9387fd6dd9cd8021d941 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 13 Feb 2019 10:26:54 -0500 Subject: [PATCH 14/18] Closes #2851: Include circuit provider in pass-through port connection details --- netbox/templates/dcim/inc/frontport.html | 14 +++++++++++++- netbox/templates/dcim/inc/rearport.html | 14 +++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/netbox/templates/dcim/inc/frontport.html b/netbox/templates/dcim/inc/frontport.html index 3ac87e09086..467101be1d2 100644 --- a/netbox/templates/dcim/inc/frontport.html +++ b/netbox/templates/dcim/inc/frontport.html @@ -29,7 +29,19 @@ {{ frontport.cable }} {% with far_end=frontport.get_cable_peer %} -
    + {% endwith %} {% else %} diff --git a/netbox/templates/dcim/inc/rearport.html b/netbox/templates/dcim/inc/rearport.html index fc6b5c1df15..f994f09b227 100644 --- a/netbox/templates/dcim/inc/rearport.html +++ b/netbox/templates/dcim/inc/rearport.html @@ -28,7 +28,19 @@ {{ rearport.cable }} {% with far_end=rearport.get_cable_peer %} - + {% endwith %} {% else %} From 95dea1faaa2e1f9b6281b315cbb121914af9a873 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 13 Feb 2019 10:45:42 -0500 Subject: [PATCH 15/18] Closes #2866: Add cellular interface types (GSM/CDMA/LTE) --- CHANGELOG.md | 1 + netbox/dcim/constants.py | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c5c8fbe7e7..17b674f12c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ v2.5.6 (FUTURE) * [#2839](https://github.com/digitalocean/netbox/issues/2839) - Add "110 punch" type for pass-through ports * [#2854](https://github.com/digitalocean/netbox/issues/2854) - Enable bulk editing of pass-through ports +* [#2866](https://github.com/digitalocean/netbox/issues/2866) - Add cellular interface types (GSM/CDMA/LTE) ## Bug Fixes diff --git a/netbox/dcim/constants.py b/netbox/dcim/constants.py index f8f9231fd89..22d4468fc4a 100644 --- a/netbox/dcim/constants.py +++ b/netbox/dcim/constants.py @@ -91,6 +91,10 @@ IFACE_FF_80211G = 2610 IFACE_FF_80211N = 2620 IFACE_FF_80211AC = 2630 IFACE_FF_80211AD = 2640 +# Cellular +IFACE_FF_GSM = 2810 +IFACE_FF_CDMA = 2820 +IFACE_FF_LTE = 2830 # SONET IFACE_FF_SONET_OC3 = 6100 IFACE_FF_SONET_OC12 = 6200 @@ -174,6 +178,14 @@ IFACE_FF_CHOICES = [ [IFACE_FF_80211AD, 'IEEE 802.11ad'], ] ], + [ + 'Cellular', + [ + [IFACE_FF_GSM, 'GSM'], + [IFACE_FF_CDMA, 'CDMA'], + [IFACE_FF_LTE, 'LTE'], + ] + ], [ 'SONET', [ From cc3b26998b88e60ba4090a1707a49c1cdcb387db Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 13 Feb 2019 11:34:16 -0500 Subject: [PATCH 16/18] Fixes #2880: Sanitize user password if an exception is raised during login --- CHANGELOG.md | 1 + netbox/users/views.py | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17b674f12c6..f10eb2242ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ v2.5.6 (FUTURE) * [#2862](https://github.com/digitalocean/netbox/issues/2862) - Follow return URL when connecting a cable * [#2864](https://github.com/digitalocean/netbox/issues/2864) - Correct display of VRF name when no RD is assigned * [#2877](https://github.com/digitalocean/netbox/issues/2877) - Fixed device role label display on light background color +* [#2880](https://github.com/digitalocean/netbox/issues/2880) - Sanitize user password if an exception is raised during login --- diff --git a/netbox/users/views.py b/netbox/users/views.py index 171d444b98d..6ec98493655 100644 --- a/netbox/users/views.py +++ b/netbox/users/views.py @@ -7,6 +7,7 @@ from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.decorators import method_decorator from django.utils.http import is_safe_url +from django.views.decorators.debug import sensitive_post_parameters from django.views.generic import View from secrets.forms import UserKeyForm @@ -23,6 +24,10 @@ from .models import Token class LoginView(View): template_name = 'login.html' + @method_decorator(sensitive_post_parameters('password')) + def dispatch(self, *args, **kwargs): + return super().dispatch(*args, **kwargs) + def get(self, request): form = LoginForm(request) From 109b233e144ad4d09b1f19cf8ddd4d442232c74c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 13 Feb 2019 17:05:02 -0500 Subject: [PATCH 17/18] Closes #2758: Add cable trace button to pass-through ports --- CHANGELOG.md | 1 + netbox/templates/dcim/inc/frontport.html | 3 +++ netbox/templates/dcim/inc/rearport.html | 3 +++ 3 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f10eb2242ea..abb38308e16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ v2.5.6 (FUTURE) ## Enhancements +* [#2758](https://github.com/digitalocean/netbox/issues/2758) - Add cable trace button to pass-through ports * [#2839](https://github.com/digitalocean/netbox/issues/2839) - Add "110 punch" type for pass-through ports * [#2854](https://github.com/digitalocean/netbox/issues/2854) - Enable bulk editing of pass-through ports * [#2866](https://github.com/digitalocean/netbox/issues/2866) - Add cellular interface types (GSM/CDMA/LTE) diff --git a/netbox/templates/dcim/inc/frontport.html b/netbox/templates/dcim/inc/frontport.html index 467101be1d2..6ec5857ac30 100644 --- a/netbox/templates/dcim/inc/frontport.html +++ b/netbox/templates/dcim/inc/frontport.html @@ -27,6 +27,9 @@ {% if frontport.cable %} {% with far_end=frontport.get_cable_peer %} {% with far_end=rearport.get_cable_peer %}
    Model{{ device.device_type.full_name }}{{ device.device_type.display_name }}
    Serial Number - {{ devicebay.installed_device.device_type.full_name }} + {{ devicebay.installed_device.device_type.display_name }} {{ device.device_role }}{{ device.device_type.full_name }}{{ device.device_type.display_name }} {% if device.parent_bay %} {{ device.parent_bay }} From 73c983516dbb4474c428d93595cd566eaa5b5d11 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 6 Feb 2019 10:28:25 -0500 Subject: [PATCH 05/18] Fixes #2856: Fix navigation links between LAG interfaces and their members on device view --- CHANGELOG.md | 1 + netbox/templates/dcim/inc/interface.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7d487c70c2..cd60dc2fc83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ v2.5.6 (FUTURE) ## Bug Fixes * [#2844](https://github.com/digitalocean/netbox/issues/2844) - Correct display of far cable end for pass-through ports +* [#2856](https://github.com/digitalocean/netbox/issues/2856) - Fix navigation links between LAG interfaces and their members on device view * [#2857](https://github.com/digitalocean/netbox/issues/2857) - Add `display_name` to DeviceType API serializer; fix DeviceType list for bulk device edit --- diff --git a/netbox/templates/dcim/inc/interface.html b/netbox/templates/dcim/inc/interface.html index 3d805720857..7c1e9f26779 100644 --- a/netbox/templates/dcim/inc/interface.html +++ b/netbox/templates/dcim/inc/interface.html @@ -1,5 +1,5 @@ {% load helpers %} -
    {{ far_end.parent }} + {% if far_end.parent.provider %} + + + {{ far_end.parent.provider }} + {{ far_end.parent }} + + {% else %} + + {{ far_end.parent }} + + {% endif %} + {{ far_end }} {{ far_end.parent }} + {% if far_end.parent.provider %} + + + {{ far_end.parent.provider }} + {{ far_end.parent }} + + {% else %} + + {{ far_end.parent }} + + {% endif %} + {{ far_end }} {{ frontport.cable }} + + + diff --git a/netbox/templates/dcim/inc/rearport.html b/netbox/templates/dcim/inc/rearport.html index f994f09b227..e16cc82c5f1 100644 --- a/netbox/templates/dcim/inc/rearport.html +++ b/netbox/templates/dcim/inc/rearport.html @@ -26,6 +26,9 @@ {% if rearport.cable %} {{ rearport.cable }} + + + From 8152dc4b044ed6a86b7c8d14aea821f281915a87 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 13 Feb 2019 17:07:15 -0500 Subject: [PATCH 18/18] Release v2.5.6 --- CHANGELOG.md | 2 +- netbox/netbox/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abb38308e16..b03164bfb72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -v2.5.6 (FUTURE) +v2.5.6 (2019-02-13) ## Enhancements diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index d857af00e2e..a0f9b267fb0 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -22,7 +22,7 @@ except ImportError: ) -VERSION = '2.5.6-dev' +VERSION = '2.5.6' BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))