diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 4de82d4e3..3beec4cf7 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.3.7 + placeholder: v3.3.8 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 5f0a17aa7..6688de9fe 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.3.7 + placeholder: v3.3.8 validations: required: true - type: dropdown diff --git a/docs/installation/3-netbox.md b/docs/installation/3-netbox.md index f42e28deb..72c054e5b 100644 --- a/docs/installation/3-netbox.md +++ b/docs/installation/3-netbox.md @@ -36,7 +36,7 @@ This documentation provides two options for installing NetBox: from a downloadab Download the [latest stable release](https://github.com/netbox-community/netbox/releases) from GitHub as a tarball or ZIP archive and extract it to your desired path. In this example, we'll use `/opt/netbox` as the NetBox root. ```no-highlight -sudo wget https://github.com/netbox-community/netbox/archive/vX.Y.Z.tar.gz +sudo wget https://github.com/netbox-community/netbox/archive/refs/tags/vX.Y.Z.tar.gz sudo tar -xzf vX.Y.Z.tar.gz -C /opt sudo ln -s /opt/netbox-X.Y.Z/ /opt/netbox ``` diff --git a/docs/release-notes/version-3.3.md b/docs/release-notes/version-3.3.md index df84c8de4..a46424df0 100644 --- a/docs/release-notes/version-3.3.md +++ b/docs/release-notes/version-3.3.md @@ -1,9 +1,24 @@ # NetBox v3.3 -## v3.3.8 (FUTURE) +## v3.3.9 (FUTURE) + +--- + +## v3.3.8 (2022-11-16) + +### Enhancements + +* [#10356](https://github.com/netbox-community/netbox/issues/10356) - Add backplane Ethernet interface types +* [#10902](https://github.com/netbox-community/netbox/issues/10902) - Add location selector to power feed form +* [#10904](https://github.com/netbox-community/netbox/issues/10904) - Use front/rear port colors in cable trace SVG +* [#10914](https://github.com/netbox-community/netbox/issues/10914) - Include "add module type" button on manufacturer view +* [#10915](https://github.com/netbox-community/netbox/issues/10915) - Add count of L2VPNs to tenant view +* [#10919](https://github.com/netbox-community/netbox/issues/10919) - Include device location under cable view +* [#10920](https://github.com/netbox-community/netbox/issues/10920) - Include request cookies when queuing a custom script ### Bug Fixes +* [#9439](https://github.com/netbox-community/netbox/issues/9439) - Ensure thread safety of change logging functions * [#10709](https://github.com/netbox-community/netbox/issues/10709) - Correct UI display for `azuread-v2-tenant-oauth2` SSO backend * [#10829](https://github.com/netbox-community/netbox/issues/10829) - Fix bulk edit/delete buttons ad top of object lists * [#10837](https://github.com/netbox-community/netbox/issues/10837) - Correct cookie paths when `BASE_PATH` is set diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index 7d35a40f9..14ddc9930 100644 --- a/netbox/dcim/choices.py +++ b/netbox/dcim/choices.py @@ -783,6 +783,17 @@ class InterfaceTypeChoices(ChoiceSet): TYPE_400GE_QSFP_DD = '400gbase-x-qsfpdd' TYPE_400GE_OSFP = '400gbase-x-osfp' + # Ethernet Backplane + TYPE_1GE_KX = '1000base-kx' + TYPE_10GE_KR = '10gbase-kr' + TYPE_10GE_KX4 = '10gbase-kx4' + TYPE_25GE_KR = '25gbase-kr' + TYPE_40GE_KR4 = '40gbase-kr4' + TYPE_50GE_KR = '50gbase-kr' + TYPE_100GE_KP4 = '100gbase-kp4' + TYPE_100GE_KR2 = '100gbase-kr2' + TYPE_100GE_KR4 = '100gbase-kr4' + # Wireless TYPE_80211A = 'ieee802.11a' TYPE_80211G = 'ieee802.11g' @@ -911,6 +922,20 @@ class InterfaceTypeChoices(ChoiceSet): (TYPE_400GE_OSFP, 'OSFP (400GE)'), ) ), + ( + 'Ethernet (backplane)', + ( + (TYPE_1GE_KX, '1000BASE-KX (1GE)'), + (TYPE_10GE_KR, '10GBASE-KR (10GE)'), + (TYPE_10GE_KX4, '10GBASE-KX4 (10GE)'), + (TYPE_25GE_KR, '25GBASE-KR (25GE)'), + (TYPE_40GE_KR4, '40GBASE-KR4 (40GE)'), + (TYPE_50GE_KR, '50GBASE-KR (50GE)'), + (TYPE_100GE_KP4, '100GBASE-KP4 (100GE)'), + (TYPE_100GE_KR2, '100GBASE-KR2 (100GE)'), + (TYPE_100GE_KR4, '100GBASE-KR4 (100GE)'), + ) + ), ( 'Wireless', ( diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index 8f1626361..da50b8f2a 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -877,10 +877,21 @@ class PowerFeedForm(NetBoxModelForm): 'site_id': '$site' } ) + location = DynamicModelChoiceField( + queryset=Location.objects.all(), + required=False, + query_params={ + 'site_id': '$site' + }, + initial_params={ + 'racks': '$rack' + } + ) rack = DynamicModelChoiceField( queryset=Rack.objects.all(), required=False, query_params={ + 'location_id': '$location', 'site_id': '$site' } ) @@ -888,14 +899,14 @@ class PowerFeedForm(NetBoxModelForm): fieldsets = ( ('Power Panel', ('region', 'site', 'power_panel')), - ('Power Feed', ('rack', 'name', 'status', 'type', 'mark_connected', 'tags')), + ('Power Feed', ('location', 'rack', 'name', 'status', 'type', 'mark_connected', 'tags')), ('Characteristics', ('supply', 'voltage', 'amperage', 'phase', 'max_utilization')), ) class Meta: model = PowerFeed fields = [ - 'region', 'site_group', 'site', 'power_panel', 'rack', 'name', 'status', 'type', 'mark_connected', 'supply', + 'region', 'site_group', 'site', 'power_panel', 'location', 'rack', 'name', 'status', 'type', 'mark_connected', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization', 'comments', 'tags', ] widgets = { diff --git a/netbox/dcim/svg/cables.py b/netbox/dcim/svg/cables.py index 9a847acc9..33adef798 100644 --- a/netbox/dcim/svg/cables.py +++ b/netbox/dcim/svg/cables.py @@ -166,7 +166,7 @@ class CableTraceSVG: """ if hasattr(instance, 'parent_object'): # Termination - return 'f0f0f0' + return getattr(instance, 'color', 'f0f0f0') or 'f0f0f0' if hasattr(instance, 'device_role'): # Device return instance.device_role.color diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 4ff440c46..ff0551fff 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -29,7 +29,7 @@ django.utils.encoding.force_text = force_str # Environment setup # -VERSION = '3.3.8-dev' +VERSION = '3.3.9-dev' # Hostname HOSTNAME = platform.node() diff --git a/netbox/templates/dcim/inc/cable_termination.html b/netbox/templates/dcim/inc/cable_termination.html index ced9bda50..0ee4c1ccf 100644 --- a/netbox/templates/dcim/inc/cable_termination.html +++ b/netbox/templates/dcim/inc/cable_termination.html @@ -7,6 +7,10 @@ Site {{ terminations.0.device.site|linkify }} + + Location + {{ terminations.0.device.location|linkify|placeholder }} + Rack {{ terminations.0.device.rack|linkify|placeholder }} diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py index 69ab615fc..ba3388c75 100644 --- a/netbox/utilities/utils.py +++ b/netbox/utilities/utils.py @@ -410,6 +410,7 @@ def copy_safe_request(request): } return NetBoxFakeRequest({ 'META': meta, + 'COOKIES': request.COOKIES, 'POST': request.POST, 'GET': request.GET, 'FILES': request.FILES, diff --git a/requirements.txt b/requirements.txt index 73abfa259..8e89b47c5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,7 +9,7 @@ django-pglocks==1.0.4 django-prometheus==2.2.0 django-redis==5.2.0 django-rich==1.4.0 -django-rq==2.5.1 +django-rq==2.6.0 django-tables2==2.4.1 django-taggit==3.0.0 django-timezone-field==5.0 @@ -19,13 +19,13 @@ graphene-django==2.15.0 gunicorn==20.1.0 Jinja2==3.1.2 Markdown==3.3.7 -mkdocs-material==8.5.7 +mkdocs-material==8.5.10 mkdocstrings[python-legacy]==0.19.0 netaddr==0.8.0 Pillow==9.3.0 psycopg2-binary==2.9.5 PyYAML==6.0 -sentry-sdk==1.10.1 +sentry-sdk==1.11.0 social-auth-app-django==5.0.0 social-auth-core[openidconnect]==4.3.0 svgwrite==1.4.3