From 422eeddbef30369cb6630027d94162423e8c2c6f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 13 May 2020 17:32:27 -0400 Subject: [PATCH 01/20] 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 f06a27980..56fd9bb0f 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -16,7 +16,7 @@ from django.core.validators import URLValidator # Environment setup # -VERSION = '2.8.4' +VERSION = '2.8.5-dev' # Hostname HOSTNAME = platform.node() From 2c2d6c6d47b68a659a527bc2aeb45c01e1e97083 Mon Sep 17 00:00:00 2001 From: John Anderson Date: Fri, 15 May 2020 02:31:45 -0400 Subject: [PATCH 02/20] fixes #3304 - primary IP address caching invalidation --- docs/release-notes/version-2.8.md | 8 ++++++++ netbox/dcim/views.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index 5d8687588..cb611f25f 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -1,5 +1,13 @@ # NetBox v2.8 +v2.8.5 (FUTURE) + +### Bug Fixes + +* [#3304](https://github.com/netbox-community/netbox/issues/3304) - Fix caching invalidation issue related to device/virtual machine primary IP addresses + +--- + v2.8.4 (2020-05-13) ### Enhancements diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index cd1b4edf4..d141f93c6 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1105,7 +1105,7 @@ class DeviceView(PermissionRequiredMixin, View): def get(self, request, pk): device = get_object_or_404(Device.objects.prefetch_related( - 'site__region', 'rack__group', 'tenant__group', 'device_role', 'platform' + 'site__region', 'rack__group', 'tenant__group', 'device_role', 'platform', 'primary_ip4', 'primary_ip6' ), pk=pk) # VirtualChassis members From 14744da8f6f045dfe38b16ba40a6f1e96fe9b114 Mon Sep 17 00:00:00 2001 From: John Anderson Date: Fri, 15 May 2020 02:45:48 -0400 Subject: [PATCH 03/20] fixes #4647 - caching invalidation related to assinging new IP addresses to interfaces --- docs/release-notes/version-2.8.md | 2 ++ netbox/ipam/forms.py | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index cb611f25f..ed5f01709 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -5,6 +5,8 @@ v2.8.5 (FUTURE) ### Bug Fixes * [#3304](https://github.com/netbox-community/netbox/issues/3304) - Fix caching invalidation issue related to device/virtual machine primary IP addresses +* [#4647](https://github.com/netbox-community/netbox/issues/4647) - Fix caching invalidation issue related to assinging new IP addresses to interfaces + --- diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py index f5fd6e5f8..5906e19a4 100644 --- a/netbox/ipam/forms.py +++ b/netbox/ipam/forms.py @@ -618,7 +618,12 @@ class IPAddressForm(BootstrapMixin, TenancyForm, ReturnURLForm, CustomFieldModel if self.instance and self.instance.interface: self.fields['interface'].queryset = Interface.objects.filter( device=self.instance.interface.device, virtual_machine=self.instance.interface.virtual_machine - ) + ).prefetch_related( + 'device__primary_ip4', + 'device__primary_ip6', + 'virtual_machine__primary_ip4', + 'virtual_machine__primary_ip6', + ) # We prefetch the primary address fields to ensure cache invalidation does not balk on the save() else: self.fields['interface'].choices = [] From 8394ff55371d658012e769f03e3aeb22f308ba8d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 15 May 2020 09:02:56 -0400 Subject: [PATCH 04/20] Fixes #4644: Fix ordering of services table by parent --- docs/release-notes/version-2.8.md | 4 ++-- netbox/ipam/tables.py | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index ed5f01709..6165e6a15 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -5,8 +5,8 @@ v2.8.5 (FUTURE) ### Bug Fixes * [#3304](https://github.com/netbox-community/netbox/issues/3304) - Fix caching invalidation issue related to device/virtual machine primary IP addresses -* [#4647](https://github.com/netbox-community/netbox/issues/4647) - Fix caching invalidation issue related to assinging new IP addresses to interfaces - +* [#4644](https://github.com/netbox-community/netbox/issues/4644) - Fix ordering of services table by parent +* [#4647](https://github.com/netbox-community/netbox/issues/4647) - Fix caching invalidation issue related to assigning new IP addresses to interfaces --- diff --git a/netbox/ipam/tables.py b/netbox/ipam/tables.py index d8b50c11d..ca48c2951 100644 --- a/netbox/ipam/tables.py +++ b/netbox/ipam/tables.py @@ -667,6 +667,9 @@ class ServiceTable(BaseTable): viewname='ipam:service', args=[Accessor('pk')] ) + parent = tables.LinkColumn( + order_by=('device', 'virtual_machine') + ) tags = TagColumn( url_name='ipam:service_list' ) From ba91b3aa2e1a85a481f163506409189187dd8921 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 15 May 2020 09:13:51 -0400 Subject: [PATCH 05/20] Fixes #4646: Correct UI link for reports with custom name --- docs/release-notes/version-2.8.md | 1 + netbox/extras/reports.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index 6165e6a15..32d20d700 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -6,6 +6,7 @@ v2.8.5 (FUTURE) * [#3304](https://github.com/netbox-community/netbox/issues/3304) - Fix caching invalidation issue related to device/virtual machine primary IP addresses * [#4644](https://github.com/netbox-community/netbox/issues/4644) - Fix ordering of services table by parent +* [#4646](https://github.com/netbox-community/netbox/issues/4646) - Correct UI link for reports with custom name * [#4647](https://github.com/netbox-community/netbox/issues/4647) - Fix caching invalidation issue related to assigning new IP addresses to interfaces --- diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py index 373acdde7..d4db12daa 100644 --- a/netbox/extras/reports.py +++ b/netbox/extras/reports.py @@ -92,7 +92,7 @@ class Report(object): self.active_test = None self.failed = False - self.logger = logging.getLogger(f"netbox.reports.{self.module}.{self.name}") + self.logger = logging.getLogger(f"netbox.reports.{self.full_name}") # Compile test methods and initialize results skeleton test_methods = [] @@ -120,7 +120,7 @@ class Report(object): @property def full_name(self): - return '.'.join([self.module, self.name]) + return '.'.join([self.__module__, self.__class__.__name__]) def _log(self, obj, message, level=LOG_DEFAULT): """ From a64351279ddc883a5b90838f4977b22f40ec3503 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 15 May 2020 09:36:16 -0400 Subject: [PATCH 06/20] Fixes #4648: Fix bulk CSV import of child devices --- docs/release-notes/version-2.8.md | 1 + netbox/dcim/forms.py | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index 32d20d700..6d1907eb0 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -8,6 +8,7 @@ v2.8.5 (FUTURE) * [#4644](https://github.com/netbox-community/netbox/issues/4644) - Fix ordering of services table by parent * [#4646](https://github.com/netbox-community/netbox/issues/4646) - Correct UI link for reports with custom name * [#4647](https://github.com/netbox-community/netbox/issues/4647) - Fix caching invalidation issue related to assigning new IP addresses to interfaces +* [#4648](https://github.com/netbox-community/netbox/issues/4648) - Fix bulk CSV import of child devices --- diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 5d3ec1019..cdd42ddae 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1956,7 +1956,7 @@ class ChildDeviceCSVForm(BaseDeviceCSVForm): help_text='Parent device' ) device_bay = CSVModelChoiceField( - queryset=Device.objects.all(), + queryset=DeviceBay.objects.all(), to_field_name='name', help_text='Device bay in which this device is installed' ) @@ -1976,6 +1976,20 @@ class ChildDeviceCSVForm(BaseDeviceCSVForm): params = {f"device__{self.fields['parent'].to_field_name}": data.get('parent')} self.fields['device_bay'].queryset = self.fields['device_bay'].queryset.filter(**params) + def clean(self): + super().clean() + + # Set parent_bay reverse relationship + device_bay = self.cleaned_data.get('device_bay') + if device_bay: + self.instance.parent_bay = device_bay + + # Inherit site and rack from parent device + parent = self.cleaned_data.get('parent') + if parent: + self.instance.site = parent.site + self.instance.rack = parent.rack + class DeviceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField( From 3c8e7e739d2fe4cbb7729a91d49e95f8b09c20b1 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 15 May 2020 09:44:00 -0400 Subject: [PATCH 07/20] Fixes #4649: Fix interface assignment for bulk-imported IP addresses --- docs/release-notes/version-2.8.md | 1 + netbox/ipam/forms.py | 12 ------------ 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index 6d1907eb0..60adf53cc 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -9,6 +9,7 @@ v2.8.5 (FUTURE) * [#4646](https://github.com/netbox-community/netbox/issues/4646) - Correct UI link for reports with custom name * [#4647](https://github.com/netbox-community/netbox/issues/4647) - Fix caching invalidation issue related to assigning new IP addresses to interfaces * [#4648](https://github.com/netbox-community/netbox/issues/4648) - Fix bulk CSV import of child devices +* [#4649](https://github.com/netbox-community/netbox/issues/4649) - Fix interface assignment for bulk-imported IP addresses --- diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py index 5906e19a4..fc1352ec9 100644 --- a/netbox/ipam/forms.py +++ b/netbox/ipam/forms.py @@ -780,18 +780,6 @@ class IPAddressCSVForm(CustomFieldModelCSVForm): def save(self, *args, **kwargs): - # Set interface - if self.cleaned_data['device'] and self.cleaned_data['interface_name']: - self.instance.interface = Interface.objects.get( - device=self.cleaned_data['device'], - name=self.cleaned_data['interface_name'] - ) - elif self.cleaned_data['virtual_machine'] and self.cleaned_data['interface_name']: - self.instance.interface = Interface.objects.get( - virtual_machine=self.cleaned_data['virtual_machine'], - name=self.cleaned_data['interface_name'] - ) - ipaddress = super().save(*args, **kwargs) # Set as primary for device/VM From cd236aa8862cf05e90e227c589cd0e054afc6e6b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 15 May 2020 10:11:36 -0400 Subject: [PATCH 08/20] Closes #4645: Update minimum required version of PostgreSQL to 9.6 --- docs/index.md | 2 +- docs/installation/1-postgresql.md | 4 ++-- docs/release-notes/version-2.8.md | 2 ++ netbox/templates/exceptions/programming_error.html | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/index.md b/docs/index.md index 3880c9d07..ee7f77f69 100644 --- a/docs/index.md +++ b/docs/index.md @@ -49,7 +49,7 @@ NetBox is built on the [Django](https://djangoproject.com/) Python framework and | HTTP service | nginx or Apache | | WSGI service | gunicorn or uWSGI | | Application | Django/Python | -| Database | PostgreSQL 9.4+ | +| Database | PostgreSQL 9.6+ | | Task queuing | Redis/django-rq | | Live device access | NAPALM | diff --git a/docs/installation/1-postgresql.md b/docs/installation/1-postgresql.md index afe3a51d2..933e32edc 100644 --- a/docs/installation/1-postgresql.md +++ b/docs/installation/1-postgresql.md @@ -3,7 +3,7 @@ This section entails the installation and configuration of a local PostgreSQL database. If you already have a PostgreSQL database service in place, skip to [the next section](2-redis.md). !!! warning - NetBox requires PostgreSQL 9.4 or higher. Please note that MySQL and other relational databases are **not** supported. + NetBox requires PostgreSQL 9.6 or higher. Please note that MySQL and other relational databases are **not** supported. The installation instructions provided here have been tested to work on Ubuntu 18.04 and CentOS 7.5. The particular commands needed to install dependencies on other distributions may vary significantly. Unfortunately, this is outside the control of the NetBox maintainers. Please consult your distribution's documentation for assistance with any errors. @@ -51,7 +51,7 @@ At a minimum, we need to create a database for NetBox and assign it a username a ```no-highlight # sudo -u postgres psql -psql (9.4.5) +psql (10.10) Type "help" for help. postgres=# CREATE DATABASE netbox; diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index 60adf53cc..9574894a3 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -2,6 +2,8 @@ v2.8.5 (FUTURE) +**Note:** The minimum required version of PostgreSQL is now 9.6. + ### Bug Fixes * [#3304](https://github.com/netbox-community/netbox/issues/3304) - Fix caching invalidation issue related to device/virtual machine primary IP addresses diff --git a/netbox/templates/exceptions/programming_error.html b/netbox/templates/exceptions/programming_error.html index 6f10c2e27..48ab707b7 100644 --- a/netbox/templates/exceptions/programming_error.html +++ b/netbox/templates/exceptions/programming_error.html @@ -10,7 +10,7 @@ python3 manage.py migrate from the command line.

- Unsupported PostgreSQL version - Ensure that PostgreSQL version 9.4 or higher is in use. You + Unsupported PostgreSQL version - Ensure that PostgreSQL version 9.6 or higher is in use. You can check this by connecting to the database using NetBox's credentials and issuing a query for SELECT VERSION().

From d2e1428c75ce787d33486e69b501f0fac3bda84d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 20 May 2020 09:36:55 -0400 Subject: [PATCH 09/20] Closes #4665: Add NEMA L14 and L21 power port/outlet types --- docs/release-notes/version-2.8.md | 4 ++++ netbox/dcim/choices.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index 9574894a3..ad86ca9df 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -4,6 +4,10 @@ v2.8.5 (FUTURE) **Note:** The minimum required version of PostgreSQL is now 9.6. +### Enhancements + +* [#4665](https://github.com/netbox-community/netbox/issues/4665) - Add NEMA L14 and L21 power port/outlet types + ### Bug Fixes * [#3304](https://github.com/netbox-community/netbox/issues/3304) - Fix caching invalidation issue related to device/virtual machine primary IP addresses diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index 8433bb152..479563093 100644 --- a/netbox/dcim/choices.py +++ b/netbox/dcim/choices.py @@ -276,6 +276,10 @@ class PowerPortTypeChoices(ChoiceSet): TYPE_NEMA_L620P = 'nema-l6-20p' TYPE_NEMA_L630P = 'nema-l6-30p' TYPE_NEMA_L650P = 'nema-l6-50p' + TYPE_NEMA_L1420P = 'nema-l14-20p' + TYPE_NEMA_L1430P = 'nema-l14-30p' + TYPE_NEMA_L2120P = 'nema-l21-20p' + TYPE_NEMA_L2130P = 'nema-l21-30p' # California style TYPE_CS6361C = 'cs6361c' TYPE_CS6365C = 'cs6365c' @@ -337,6 +341,10 @@ class PowerPortTypeChoices(ChoiceSet): (TYPE_NEMA_L620P, 'NEMA L6-20P'), (TYPE_NEMA_L630P, 'NEMA L6-30P'), (TYPE_NEMA_L650P, 'NEMA L6-50P'), + (TYPE_NEMA_L1420P, 'NEMA L14-20P'), + (TYPE_NEMA_L1430P, 'NEMA L14-30P'), + (TYPE_NEMA_L2120P, 'NEMA L21-20P'), + (TYPE_NEMA_L2130P, 'NEMA L21-30P'), )), ('California Style', ( (TYPE_CS6361C, 'CS6361C'), @@ -405,6 +413,10 @@ class PowerOutletTypeChoices(ChoiceSet): TYPE_NEMA_L620R = 'nema-l6-20r' TYPE_NEMA_L630R = 'nema-l6-30r' TYPE_NEMA_L650R = 'nema-l6-50r' + TYPE_NEMA_L1420R = 'nema-l14-20r' + TYPE_NEMA_L1430R = 'nema-l14-30r' + TYPE_NEMA_L2120R = 'nema-l21-20r' + TYPE_NEMA_L2130R = 'nema-l21-30r' # California style TYPE_CS6360C = 'CS6360C' TYPE_CS6364C = 'CS6364C' @@ -467,6 +479,10 @@ class PowerOutletTypeChoices(ChoiceSet): (TYPE_NEMA_L620R, 'NEMA L6-20R'), (TYPE_NEMA_L630R, 'NEMA L6-30R'), (TYPE_NEMA_L650R, 'NEMA L6-50R'), + (TYPE_NEMA_L1420R, 'NEMA L14-20R'), + (TYPE_NEMA_L1430R, 'NEMA L14-30R'), + (TYPE_NEMA_L2120R, 'NEMA L21-20R'), + (TYPE_NEMA_L2130R, 'NEMA L21-30R'), )), ('California Style', ( (TYPE_CS6360C, 'CS6360C'), From 1f5d2520c3f17be08497820e3b7d7904e80eaac9 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 20 May 2020 10:37:26 -0400 Subject: [PATCH 10/20] Formatting fix --- docs/release-notes/version-2.8.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index ad86ca9df..16712bb79 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -1,6 +1,6 @@ # NetBox v2.8 -v2.8.5 (FUTURE) +## v2.8.5 (FUTURE) **Note:** The minimum required version of PostgreSQL is now 9.6. @@ -19,7 +19,7 @@ v2.8.5 (FUTURE) --- -v2.8.4 (2020-05-13) +## v2.8.4 (2020-05-13) ### Enhancements From 27700d316f7ae94522c073f4533822003288fd6c Mon Sep 17 00:00:00 2001 From: Sander Steffann Date: Fri, 22 May 2020 22:24:05 +0200 Subject: [PATCH 11/20] Add `perms` to PluginTemplateExtension context --- netbox/extras/templatetags/plugins.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netbox/extras/templatetags/plugins.py b/netbox/extras/templatetags/plugins.py index b66cce0a6..3f593fa10 100644 --- a/netbox/extras/templatetags/plugins.py +++ b/netbox/extras/templatetags/plugins.py @@ -18,6 +18,7 @@ def _get_registered_content(obj, method, template_context): 'object': obj, 'request': template_context['request'], 'settings': template_context['settings'], + 'perms': template_context['perms'], } model_name = obj._meta.label_lower From ff3b348771c07802b13c6a813ef6e4aed4e0b46c Mon Sep 17 00:00:00 2001 From: Sander Steffann Date: Fri, 22 May 2020 22:28:04 +0200 Subject: [PATCH 12/20] Add `csrf_token` to PluginTemplateExtension context --- netbox/extras/templatetags/plugins.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netbox/extras/templatetags/plugins.py b/netbox/extras/templatetags/plugins.py index b66cce0a6..e63d25df1 100644 --- a/netbox/extras/templatetags/plugins.py +++ b/netbox/extras/templatetags/plugins.py @@ -18,6 +18,7 @@ def _get_registered_content(obj, method, template_context): 'object': obj, 'request': template_context['request'], 'settings': template_context['settings'], + 'csrf_token': template_context['csrf_token'], } model_name = obj._meta.label_lower From 74c29b0bb72bd6ba9a2ba1e19f8121da1d0f043e Mon Sep 17 00:00:00 2001 From: kobayashi Date: Tue, 26 May 2020 01:17:10 -0400 Subject: [PATCH 13/20] Fixes #4684: Fix ignored comment when importing DeviceType --- docs/release-notes/version-2.8.md | 1 + netbox/dcim/forms.py | 1 + netbox/dcim/tests/test_views.py | 2 ++ 3 files changed, 4 insertions(+) diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index 16712bb79..5507d420e 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -16,6 +16,7 @@ * [#4647](https://github.com/netbox-community/netbox/issues/4647) - Fix caching invalidation issue related to assigning new IP addresses to interfaces * [#4648](https://github.com/netbox-community/netbox/issues/4648) - Fix bulk CSV import of child devices * [#4649](https://github.com/netbox-community/netbox/issues/4649) - Fix interface assignment for bulk-imported IP addresses +* [#4684](https://github.com/netbox-community/netbox/issues/4684) - Fix ignored comment field when adding device type via YAML/JSON import. --- diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index cdd42ddae..94cf51fcd 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -932,6 +932,7 @@ class DeviceTypeImportForm(BootstrapMixin, forms.ModelForm): model = DeviceType fields = [ 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', + 'comments', ] diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 65f37c1d5..7ee5d7845 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -366,6 +366,7 @@ manufacturer: Generic model: TEST-1000 slug: test-1000 u_height: 2 +comments: test comment console-ports: - name: Console Port 1 type: de-9 @@ -456,6 +457,7 @@ device-bays: self.assertHttpStatus(response, 200) dt = DeviceType.objects.get(model='TEST-1000') + self.assertEqual(dt.comments, 'test comment') # Verify all of the components were created self.assertEqual(dt.consoleport_templates.count(), 3) From 9cde377133af3ac0e61384757733afa4cc09f653 Mon Sep 17 00:00:00 2001 From: kobayashi Date: Tue, 26 May 2020 01:23:23 -0400 Subject: [PATCH 14/20] Closes #4676: Set default value of REMOTE_AUTH_AUTO_CREATE_USER as False in docs --- docs/configuration/optional-settings.md | 2 +- docs/release-notes/version-2.8.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/configuration/optional-settings.md b/docs/configuration/optional-settings.md index 4d5251f25..617878fbb 100644 --- a/docs/configuration/optional-settings.md +++ b/docs/configuration/optional-settings.md @@ -385,7 +385,7 @@ When remote user authentication is in use, this is the name of the HTTP header w ## REMOTE_AUTH_AUTO_CREATE_USER -Default: `True` +Default: `False` If true, NetBox will automatically create local accounts for users authenticated via a remote service. (Requires `REMOTE_AUTH_ENABLED`.) diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index 16712bb79..0827fc535 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -16,6 +16,7 @@ * [#4647](https://github.com/netbox-community/netbox/issues/4647) - Fix caching invalidation issue related to assigning new IP addresses to interfaces * [#4648](https://github.com/netbox-community/netbox/issues/4648) - Fix bulk CSV import of child devices * [#4649](https://github.com/netbox-community/netbox/issues/4649) - Fix interface assignment for bulk-imported IP addresses +* [#4676](https://github.com/netbox-community/netbox/issues/4676) - Set default value of `REMOTE_AUTH_AUTO_CREATE_USER` as `False` in docs --- From a5785552d9d832029b288aa22e9d8e09164c955e Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 May 2020 09:05:18 -0400 Subject: [PATCH 15/20] Changelog for #4651, #4652 --- docs/release-notes/version-2.8.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index 16712bb79..9d3979398 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -6,6 +6,8 @@ ### Enhancements +* [#4651](https://github.com/netbox-community/netbox/issues/4651) - Add `csrf_token` context for plugin templates +* [#4652](https://github.com/netbox-community/netbox/issues/4652) - Add permissions context for plugin templates * [#4665](https://github.com/netbox-community/netbox/issues/4665) - Add NEMA L14 and L21 power port/outlet types ### Bug Fixes From 92f49b471170f2c2c82d831694e9b7db8d6dd24f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 May 2020 09:36:27 -0400 Subject: [PATCH 16/20] Closes #4672: Set default color for rack and devices roles --- docs/release-notes/version-2.8.md | 1 + netbox/dcim/filters.py | 4 +- .../migrations/0106_role_default_color.py | 24 +++++++ netbox/dcim/models/__init__.py | 9 ++- netbox/extras/models/tags.py | 3 +- netbox/utilities/choices.py | 64 +++++++++++++++++++ netbox/utilities/constants.py | 31 --------- netbox/utilities/forms.py | 5 +- 8 files changed, 102 insertions(+), 39 deletions(-) create mode 100644 netbox/dcim/migrations/0106_role_default_color.py diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index 720e4b1a7..d761020ad 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -9,6 +9,7 @@ * [#4651](https://github.com/netbox-community/netbox/issues/4651) - Add `csrf_token` context for plugin templates * [#4652](https://github.com/netbox-community/netbox/issues/4652) - Add permissions context for plugin templates * [#4665](https://github.com/netbox-community/netbox/issues/4665) - Add NEMA L14 and L21 power port/outlet types +* [#4672](https://github.com/netbox-community/netbox/issues/4672) - Set default color for rack and devices roles ### Bug Fixes diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index 5bc6dd7f0..8c24180bb 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -4,7 +4,7 @@ from django.contrib.auth.models import User from extras.filters import CustomFieldFilterSet, LocalConfigContextFilterSet, CreatedUpdatedFilterSet from tenancy.filters import TenancyFilterSet from tenancy.models import Tenant -from utilities.constants import COLOR_CHOICES +from utilities.choices import ColorChoices from utilities.filters import ( BaseFilterSet, MultiValueCharFilter, MultiValueMACAddressFilter, MultiValueNumberFilter, NameSlugSearchFilterSet, TagFilter, TreeNodeMultipleChoiceFilter, @@ -1084,7 +1084,7 @@ class CableFilterSet(BaseFilterSet): choices=CableStatusChoices ) color = django_filters.MultipleChoiceFilter( - choices=COLOR_CHOICES + choices=ColorChoices ) device_id = MultiValueNumberFilter( method='filter_device' diff --git a/netbox/dcim/migrations/0106_role_default_color.py b/netbox/dcim/migrations/0106_role_default_color.py new file mode 100644 index 000000000..c4df1b33f --- /dev/null +++ b/netbox/dcim/migrations/0106_role_default_color.py @@ -0,0 +1,24 @@ +# Generated by Django 3.0.6 on 2020-05-26 13:33 + +from django.db import migrations +import utilities.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0105_interface_name_collation'), + ] + + operations = [ + migrations.AlterField( + model_name='devicerole', + name='color', + field=utilities.fields.ColorField(default='9e9e9e', max_length=6), + ), + migrations.AlterField( + model_name='rackrole', + name='color', + field=utilities.fields.ColorField(default='9e9e9e', max_length=6), + ), + ] diff --git a/netbox/dcim/models/__init__.py b/netbox/dcim/models/__init__.py index 490667153..1f6478119 100644 --- a/netbox/dcim/models/__init__.py +++ b/netbox/dcim/models/__init__.py @@ -23,6 +23,7 @@ from dcim.fields import ASNField from dcim.elevations import RackElevationSVG from extras.models import ConfigContextModel, CustomFieldModel, ObjectChange, TaggedItem from extras.utils import extras_features +from utilities.choices import ColorChoices from utilities.fields import ColorField, NaturalOrderingField from utilities.models import ChangeLoggedModel from utilities.utils import serialize_object, to_meters @@ -379,7 +380,9 @@ class RackRole(ChangeLoggedModel): slug = models.SlugField( unique=True ) - color = ColorField() + color = ColorField( + default=ColorChoices.COLOR_GREY + ) description = models.CharField( max_length=200, blank=True, @@ -1190,7 +1193,9 @@ class DeviceRole(ChangeLoggedModel): slug = models.SlugField( unique=True ) - color = ColorField() + color = ColorField( + default=ColorChoices.COLOR_GREY + ) vm_role = models.BooleanField( default=True, verbose_name='VM Role', diff --git a/netbox/extras/models/tags.py b/netbox/extras/models/tags.py index 3bad7fa8b..d68ca2ce6 100644 --- a/netbox/extras/models/tags.py +++ b/netbox/extras/models/tags.py @@ -3,6 +3,7 @@ from django.urls import reverse from django.utils.text import slugify from taggit.models import TagBase, GenericTaggedItemBase +from utilities.choices import ColorChoices from utilities.fields import ColorField from utilities.models import ChangeLoggedModel @@ -13,7 +14,7 @@ from utilities.models import ChangeLoggedModel class Tag(TagBase, ChangeLoggedModel): color = ColorField( - default='9e9e9e' + default=ColorChoices.COLOR_GREY ) description = models.CharField( max_length=200, diff --git a/netbox/utilities/choices.py b/netbox/utilities/choices.py index aba64e63b..ce0929a8b 100644 --- a/netbox/utilities/choices.py +++ b/netbox/utilities/choices.py @@ -80,6 +80,70 @@ def unpack_grouped_choices(choices): return unpacked_choices +# +# Generic color choices +# + +class ColorChoices(ChoiceSet): + COLOR_DARK_RED = 'aa1409' + COLOR_RED = 'f44336' + COLOR_PINK = 'e91e63' + COLOR_ROSE = 'ffe4e1' + COLOR_FUCHSIA = 'ff66ff' + COLOR_PURPLE = '9c27b0' + COLOR_DARK_PURPLE = '673ab7' + COLOR_INDIGO = '3f51b5' + COLOR_BLUE = '2196f3' + COLOR_LIGHT_BLUE = '03a9f4' + COLOR_CYAN = '00bcd4' + COLOR_TEAL = '009688' + COLOR_AQUA = '00ffff' + COLOR_DARK_GREEN = '2f6a31' + COLOR_GREEN = '4caf50' + COLOR_LIGHT_GREEN = '8bc34a' + COLOR_LIME = 'cddc39' + COLOR_YELLOW = 'ffeb3b' + COLOR_AMBER = 'ffc107' + COLOR_ORANGE = 'ff9800' + COLOR_DARK_ORANGE = 'ff5722' + COLOR_BROWN = '795548' + COLOR_LIGHT_GREY = 'c0c0c0' + COLOR_GREY = '9e9e9e' + COLOR_DARK_GREY = '607d8b' + COLOR_BLACK = '111111' + COLOR_WHITE = 'ffffff' + + CHOICES = ( + (COLOR_DARK_RED, 'Dark red'), + (COLOR_RED, 'Red'), + (COLOR_PINK, 'Pink'), + (COLOR_ROSE, 'Rose'), + (COLOR_FUCHSIA, 'Fuchsia'), + (COLOR_PURPLE, 'Purple'), + (COLOR_DARK_PURPLE, 'Dark purple'), + (COLOR_INDIGO, 'Indigo'), + (COLOR_BLUE, 'Blue'), + (COLOR_LIGHT_BLUE, 'Light blue'), + (COLOR_CYAN, 'Cyan'), + (COLOR_TEAL, 'Teal'), + (COLOR_AQUA, 'Aqua'), + (COLOR_DARK_GREEN, 'Dark green'), + (COLOR_GREEN, 'Green'), + (COLOR_LIGHT_GREEN, 'Light green'), + (COLOR_LIME, 'Lime'), + (COLOR_YELLOW, 'Yellow'), + (COLOR_AMBER, 'Amber'), + (COLOR_ORANGE, 'Orange'), + (COLOR_DARK_ORANGE, 'Dark orange'), + (COLOR_BROWN, 'Brown'), + (COLOR_LIGHT_GREY, 'Light grey'), + (COLOR_GREY, 'Grey'), + (COLOR_DARK_GREY, 'Dark grey'), + (COLOR_BLACK, 'Black'), + (COLOR_WHITE, 'White'), + ) + + # # Button color choices # diff --git a/netbox/utilities/constants.py b/netbox/utilities/constants.py index bdcdeef11..9a3a7d028 100644 --- a/netbox/utilities/constants.py +++ b/netbox/utilities/constants.py @@ -1,34 +1,3 @@ -COLOR_CHOICES = ( - ('aa1409', 'Dark red'), - ('f44336', 'Red'), - ('e91e63', 'Pink'), - ('ffe4e1', 'Rose'), - ('ff66ff', 'Fuschia'), - ('9c27b0', 'Purple'), - ('673ab7', 'Dark purple'), - ('3f51b5', 'Indigo'), - ('2196f3', 'Blue'), - ('03a9f4', 'Light blue'), - ('00bcd4', 'Cyan'), - ('009688', 'Teal'), - ('00ffff', 'Aqua'), - ('2f6a31', 'Dark green'), - ('4caf50', 'Green'), - ('8bc34a', 'Light green'), - ('cddc39', 'Lime'), - ('ffeb3b', 'Yellow'), - ('ffc107', 'Amber'), - ('ff9800', 'Orange'), - ('ff5722', 'Dark orange'), - ('795548', 'Brown'), - ('c0c0c0', 'Light grey'), - ('9e9e9e', 'Grey'), - ('607d8b', 'Dark grey'), - ('111111', 'Black'), - ('ffffff', 'White'), -) - - # # Filter lookup expressions # diff --git a/netbox/utilities/forms.py b/netbox/utilities/forms.py index bfc783631..17ef4dd84 100644 --- a/netbox/utilities/forms.py +++ b/netbox/utilities/forms.py @@ -14,8 +14,7 @@ from django.forms import BoundField from django.forms.models import fields_for_model from django.urls import reverse -from .choices import unpack_grouped_choices -from .constants import * +from .choices import ColorChoices, unpack_grouped_choices from .validators import EnhancedURLValidator NUMERIC_EXPANSION_PATTERN = r'\[((?:\d+[?:,-])+\d+)\]' @@ -163,7 +162,7 @@ class ColorSelect(forms.Select): option_template_name = 'widgets/colorselect_option.html' def __init__(self, *args, **kwargs): - kwargs['choices'] = add_blank_choice(COLOR_CHOICES) + kwargs['choices'] = add_blank_choice(ColorChoices) super().__init__(*args, **kwargs) self.attrs['class'] = 'netbox-select2-color-picker' From 88cffca2705dc3774680a1bc11441491df0d5e3e Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 May 2020 10:01:49 -0400 Subject: [PATCH 17/20] Closes #4650: Expose INTERNAL_IPS configuration parameter --- docs/configuration/optional-settings.md | 17 ++++++++++++++++- docs/release-notes/version-2.8.md | 1 + netbox/netbox/configuration.example.py | 4 ++++ netbox/netbox/settings.py | 10 +--------- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/docs/configuration/optional-settings.md b/docs/configuration/optional-settings.md index 617878fbb..3c4392915 100644 --- a/docs/configuration/optional-settings.md +++ b/docs/configuration/optional-settings.md @@ -86,7 +86,12 @@ CORS_ORIGIN_WHITELIST = [ Default: False -This setting enables debugging. This should be done only during development or troubleshooting. Never enable debugging on a production system, as it can expose sensitive data to unauthenticated users. +This setting enables debugging. This should be done only during development or troubleshooting. Note that only clients +which access NetBox from a recognized [internal IP address](#internal_ips) will see debugging tools in the user +interface. + +!!! warning + Never enable debugging on a production system, as it can expose sensitive data to unauthenticated users. --- @@ -184,6 +189,16 @@ HTTP_PROXIES = { --- +## INTERNAL_IPS + +Default: `('127.0.0.1', '::1',)` + +A list of IP addresses recognized as internal to the system, used to control the display of debugging output. For +example, the debugging toolbar will be viewable only when a client is accessing NetBox from one of the listed IP +addresses (and [`DEBUG`](#debug) is true). + +--- + ## LOGGING By default, all messages of INFO severity or higher will be logged to the console. Additionally, if `DEBUG` is False and email access has been configured, ERROR and CRITICAL messages will be emailed to the users defined in `ADMINS`. diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index d761020ad..f28f8af7d 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -6,6 +6,7 @@ ### Enhancements +* [#4650](https://github.com/netbox-community/netbox/issues/4650) - Expose `INTERNAL_IPS` configuration parameter * [#4651](https://github.com/netbox-community/netbox/issues/4651) - Add `csrf_token` context for plugin templates * [#4652](https://github.com/netbox-community/netbox/issues/4652) - Add permissions context for plugin templates * [#4665](https://github.com/netbox-community/netbox/issues/4665) - Add NEMA L14 and L21 power port/outlet types diff --git a/netbox/netbox/configuration.example.py b/netbox/netbox/configuration.example.py index a020c4322..941cbcd88 100644 --- a/netbox/netbox/configuration.example.py +++ b/netbox/netbox/configuration.example.py @@ -132,6 +132,10 @@ EXEMPT_VIEW_PERMISSIONS = [ # 'https': 'http://10.10.1.10:1080', # } +# IP addresses recognized as internal to the system. The debugging toolbar will be available only to clients accessing +# NetBox from an internal IP. +INTERNAL_IPS = ('127.0.0.1', '::1') + # Enable custom logging. Please see the Django documentation for detailed guidance on configuring custom logs: # https://docs.djangoproject.com/en/stable/topics/logging/ LOGGING = {} diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 56fd9bb0f..b1978d749 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -78,6 +78,7 @@ EMAIL = getattr(configuration, 'EMAIL', {}) ENFORCE_GLOBAL_UNIQUE = getattr(configuration, 'ENFORCE_GLOBAL_UNIQUE', False) EXEMPT_VIEW_PERMISSIONS = getattr(configuration, 'EXEMPT_VIEW_PERMISSIONS', []) HTTP_PROXIES = getattr(configuration, 'HTTP_PROXIES', None) +INTERNAL_IPS = getattr(configuration, 'INTERNAL_IPS', ('127.0.0.1', '::1')) LOGGING = getattr(configuration, 'LOGGING', {}) LOGIN_REQUIRED = getattr(configuration, 'LOGIN_REQUIRED', False) LOGIN_TIMEOUT = getattr(configuration, 'LOGIN_TIMEOUT', None) @@ -615,15 +616,6 @@ RQ_QUEUES = { 'check_releases': RQ_PARAMS, } -# -# Django debug toolbar -# - -INTERNAL_IPS = ( - '127.0.0.1', - '::1', -) - # # NetBox internal settings From e54d44143324067e92460958a8228f75db8cb459 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 May 2020 10:06:46 -0400 Subject: [PATCH 18/20] Remove "disable plugins" from bug report to prevent irrelevant search results --- .github/ISSUE_TEMPLATE/bug_report.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index e1012212d..54dc5ca8c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -30,10 +30,9 @@ about: Report a reproducible bug in the current release of NetBox library such as pynetbox. --> ### Steps to Reproduce -1. Disable any installed plugins by commenting out the `PLUGINS` setting in - `configuration.py`. -2. -3. +1. +2. +3. ### Expected Behavior From ccc31b2c7c8a5cdae988af2f569b5b49a1d7a059 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 May 2020 15:34:29 -0400 Subject: [PATCH 19/20] Fixes #4525: Allow passing initial data to custom script MultiObjectVar --- docs/release-notes/version-2.8.md | 1 + netbox/extras/forms.py | 6 +++--- netbox/utilities/forms.py | 15 ++++++++++++--- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index f28f8af7d..9bae04896 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -15,6 +15,7 @@ ### Bug Fixes * [#3304](https://github.com/netbox-community/netbox/issues/3304) - Fix caching invalidation issue related to device/virtual machine primary IP addresses +* [#4525](https://github.com/netbox-community/netbox/issues/4525) - Allow passing initial data to custom script MultiObjectVar * [#4644](https://github.com/netbox-community/netbox/issues/4644) - Fix ordering of services table by parent * [#4646](https://github.com/netbox-community/netbox/issues/4646) - Correct UI link for reports with custom name * [#4647](https://github.com/netbox-community/netbox/issues/4647) - Fix caching invalidation issue related to assigning new IP addresses to interfaces diff --git a/netbox/extras/forms.py b/netbox/extras/forms.py index 469b55efd..cb9930ae2 100644 --- a/netbox/extras/forms.py +++ b/netbox/extras/forms.py @@ -432,11 +432,11 @@ class ScriptForm(BootstrapMixin, forms.Form): def __init__(self, vars, *args, commit_default=True, **kwargs): - super().__init__(*args, **kwargs) - # Dynamically populate fields for variables for name, var in vars.items(): - self.fields[name] = var.as_field() + self.base_fields[name] = var.as_field() + + super().__init__(*args, **kwargs) # Toggle default commit behavior based on Meta option if not commit_default: diff --git a/netbox/utilities/forms.py b/netbox/utilities/forms.py index 17ef4dd84..979b6ac32 100644 --- a/netbox/utilities/forms.py +++ b/netbox/utilities/forms.py @@ -606,15 +606,18 @@ class DynamicModelChoiceMixin: filter = django_filters.ModelChoiceFilter widget = APISelect - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + def _get_initial_value(self, initial_data, field_name): + return initial_data.get(field_name) def get_bound_field(self, form, field_name): bound_field = BoundField(form, self, field_name) + # Override initial() to allow passing multiple values + bound_field.initial = self._get_initial_value(form.initial, field_name) + # Modify the QuerySet of the field before we return it. Limit choices to any data already bound: Options # will be populated on-demand via the APISelect widget. - data = self.prepare_value(bound_field.data or bound_field.initial) + data = bound_field.value() if data: filter = self.filter(field_name=self.to_field_name or 'pk', queryset=self.queryset) self.queryset = filter.filter(self.queryset, data) @@ -647,6 +650,12 @@ class DynamicModelMultipleChoiceField(DynamicModelChoiceMixin, forms.ModelMultip filter = django_filters.ModelMultipleChoiceFilter widget = APISelectMultiple + def _get_initial_value(self, initial_data, field_name): + # If a QueryDict has been passed as initial form data, get *all* listed values + if hasattr(initial_data, 'getlist'): + return initial_data.getlist(field_name) + return initial_data.get(field_name) + class LaxURLField(forms.URLField): """ From c9a7527f33dfdfb62190e3c41a56b323f95bb95f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 May 2020 16:17:01 -0400 Subject: [PATCH 20/20] Release v2.8.5 --- docs/release-notes/version-2.8.md | 2 +- netbox/netbox/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index 9bae04896..5ca86217a 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -1,6 +1,6 @@ # NetBox v2.8 -## v2.8.5 (FUTURE) +## v2.8.5 (2020-05-26) **Note:** The minimum required version of PostgreSQL is now 9.6. diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index b1978d749..3b4971ce1 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -16,7 +16,7 @@ from django.core.validators import URLValidator # Environment setup # -VERSION = '2.8.5-dev' +VERSION = '2.8.5' # Hostname HOSTNAME = platform.node()