From e5454d6714a6f3b42166e774e7ed2dd244f63d5a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 19 Apr 2018 11:17:17 -0400 Subject: [PATCH 1/7] 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 7a8dd1a98..b74cbe7f4 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -22,7 +22,7 @@ if sys.version_info[0] < 3: DeprecationWarning ) -VERSION = '2.3.3' +VERSION = '2.3.4-dev' BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) From fc0e8e2aaebcc5aa5b776a92a623745dffb7f5c0 Mon Sep 17 00:00:00 2001 From: Grokzen Date: Tue, 8 May 2018 16:06:53 +0200 Subject: [PATCH 2/7] Add export button to rack roles list view. --- netbox/templates/dcim/rackrole_list.html | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/netbox/templates/dcim/rackrole_list.html b/netbox/templates/dcim/rackrole_list.html index e18bf7941..51cb19781 100644 --- a/netbox/templates/dcim/rackrole_list.html +++ b/netbox/templates/dcim/rackrole_list.html @@ -1,22 +1,17 @@ {% extends '_base.html' %} -{% load helpers %} +{% load buttons %} {% block content %}
{% if perms.dcim.add_rackrole %} - - - Add a rack role - - - - Import rack roles - + {% add_button 'dcim:rackrole_add' %} + {% import_button 'dcim:rackrole_import' %} {% endif %} + {% export_button content_type %}

{% block title %}Rack Roles{% endblock %}

-
+
{% include 'utilities/obj_table.html' with bulk_delete_url='dcim:rackrole_bulk_delete' %}
From 2cdb527df9febf4e48e6550d36f2178c706eb5ba Mon Sep 17 00:00:00 2001 From: Erik Hetland Date: Sat, 19 May 2018 11:50:03 +0200 Subject: [PATCH 3/7] Fixing typo in permission check for ClusterView. --- netbox/virtualization/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 6de6b86c7..a23bc2133 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -115,7 +115,7 @@ class ClusterView(View): 'site', 'rack', 'tenant', 'device_type__manufacturer' ) device_table = DeviceTable(list(devices), orderable=False) - if request.user.has_perm('virtualization:change_cluster'): + if request.user.has_perm('virtualization.change_cluster'): device_table.columns.show('pk') return render(request, 'virtualization/cluster.html', { From 399a633d9d3baa8f3a22998ea018bc5e82db31bc Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 19 Apr 2018 11:17:17 -0400 Subject: [PATCH 4/7] Post-release version bump --- netbox/dcim/views.py | 2 ++ netbox/utilities/views.py | 7 +++++-- netbox/virtualization/views.py | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 924fe67fb..6e7aa070c 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -157,6 +157,7 @@ class RegionBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): permission_required = 'dcim.delete_region' cls = Region queryset = Region.objects.annotate(site_count=Count('sites')) + filter = filters.RegionFilter table = tables.RegionTable default_return_url = 'dcim:region_list' @@ -491,6 +492,7 @@ class RackReservationBulkEditView(PermissionRequiredMixin, BulkEditView): class RackReservationBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): permission_required = 'dcim.delete_rackreservation' cls = RackReservation + filter = filters.RackReservationFilter table = tables.RackReservationTable default_return_url = 'dcim:rackreservation_list' diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index d060e53d7..94b44fc48 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -626,8 +626,11 @@ class BulkDeleteView(View): return_url = reverse(self.default_return_url) # Are we deleting *all* objects in the queryset or just a selected subset? - if request.POST.get('_all') and self.filter is not None: - pk_list = [obj.pk for obj in self.filter(request.GET, self.cls.objects.only('pk')).qs] + if request.POST.get('_all'): + if self.filter is not None: + pk_list = [obj.pk for obj in self.filter(request.GET, self.cls.objects.only('pk')).qs] + else: + pk_list = self.cls.objects.values_list('pk', flat=True) else: pk_list = [int(pk) for pk in request.POST.getlist('pk')] diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index a23bc2133..5aef710c1 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -160,6 +160,7 @@ class ClusterBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): permission_required = 'virtualization.delete_cluster' cls = Cluster queryset = Cluster.objects.all() + filter = filters.ClusterFilter table = tables.ClusterTable default_return_url = 'virtualization:cluster_list' From e5af4f6f1702b7744af52b51f70178f9447e934d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 21 May 2018 17:31:43 -0400 Subject: [PATCH 5/7] Fixes #2093: Fix link to circuit termination in device interfaces table --- netbox/templates/dcim/inc/interface.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/templates/dcim/inc/interface.html b/netbox/templates/dcim/inc/interface.html index aa0a9cbd5..33e30b126 100644 --- a/netbox/templates/dcim/inc/interface.html +++ b/netbox/templates/dcim/inc/interface.html @@ -105,7 +105,7 @@ - + {% else %} From b0cd372af9002015213b8676514c60adaeeccd7b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 22 May 2018 13:56:11 -0400 Subject: [PATCH 6/7] Fixes #2066: Catch AddrFormatError on invalid IP addresses --- netbox/ipam/fields.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/netbox/ipam/fields.py b/netbox/ipam/fields.py index e0842d10b..8c7dbb690 100644 --- a/netbox/ipam/fields.py +++ b/netbox/ipam/fields.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals from django.core.exceptions import ValidationError from django.db import models -from netaddr import IPNetwork +from netaddr import AddrFormatError, IPNetwork from .formfields import IPFormField from . import lookups @@ -26,7 +26,9 @@ class BaseIPField(models.Field): return value try: return IPNetwork(value) - except ValueError as e: + except AddrFormatError as e: + raise ValidationError("Invalid IP address format: {}".format(value)) + except (TypeError, ValueError) as e: raise ValidationError(e) def get_prep_value(self, value): From 0d267d97fee25dd9b592f03bf0e73c41f6c737ef Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 22 May 2018 14:09:06 -0400 Subject: [PATCH 7/7] Fixes #2075: Enable tenant assignment when creating a rack reservation via the API --- netbox/dcim/api/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index d458bc646..e37354d47 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -233,7 +233,7 @@ class WritableRackReservationSerializer(ValidatedModelSerializer): class Meta: model = RackReservation - fields = ['id', 'rack', 'units', 'user', 'description'] + fields = ['id', 'rack', 'units', 'user', 'tenant', 'description'] #