From 4e766c7c3ba047ca2b12347a7c062e156f6426da Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 7 Mar 2017 22:27:46 -0500 Subject: [PATCH 1/6] Closes #945: Display the current user in the nav menu --- netbox/templates/_base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/templates/_base.html b/netbox/templates/_base.html index 90bb3ad62..d1090a5fb 100644 --- a/netbox/templates/_base.html +++ b/netbox/templates/_base.html @@ -245,7 +245,7 @@ {% if request.user.is_staff %}
  • Admin
  • {% endif %} -
  • Profile
  • +
  • {{ request.user }}
  • Log out
  • {% else %}
  • Log in
  • From ed83b1d9e90ad8bf58f1ed1926b044c50e081691 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 8 Mar 2017 11:59:24 -0500 Subject: [PATCH 2/6] Closes #946: Disregard mask length when filtering IP addresses by a parent prefix --- netbox/ipam/fields.py | 4 ++-- netbox/ipam/filters.py | 2 +- netbox/ipam/lookups.py | 14 ++++++++++++++ netbox/ipam/views.py | 4 ++-- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/netbox/ipam/fields.py b/netbox/ipam/fields.py index da07f68d9..c44385b6d 100644 --- a/netbox/ipam/fields.py +++ b/netbox/ipam/fields.py @@ -6,7 +6,7 @@ from django.db import models from .formfields import IPFormField from .lookups import ( EndsWith, IEndsWith, IRegex, IStartsWith, NetContained, NetContainedOrEqual, NetContains, NetContainsOrEquals, - NetHost, NetMaskLength, Regex, StartsWith, + NetHost, NetHostContained, NetMaskLength, Regex, StartsWith, ) @@ -66,7 +66,6 @@ IPNetworkField.register_lookup(NetContained) IPNetworkField.register_lookup(NetContainedOrEqual) IPNetworkField.register_lookup(NetContains) IPNetworkField.register_lookup(NetContainsOrEquals) -IPNetworkField.register_lookup(NetHost) IPNetworkField.register_lookup(NetMaskLength) @@ -91,4 +90,5 @@ IPAddressField.register_lookup(NetContainedOrEqual) IPAddressField.register_lookup(NetContains) IPAddressField.register_lookup(NetContainsOrEquals) IPAddressField.register_lookup(NetHost) +IPAddressField.register_lookup(NetHostContained) IPAddressField.register_lookup(NetMaskLength) diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py index 42809b954..10a18d1b7 100644 --- a/netbox/ipam/filters.py +++ b/netbox/ipam/filters.py @@ -254,7 +254,7 @@ class IPAddressFilter(CustomFieldFilterSet, django_filters.FilterSet): return queryset try: query = str(IPNetwork(value.strip()).cidr) - return queryset.filter(address__net_contained_or_equal=query) + return queryset.filter(address__net_host_contained=query) except AddrFormatError: return queryset.none() diff --git a/netbox/ipam/lookups.py b/netbox/ipam/lookups.py index 8346169ce..05c69dfb2 100644 --- a/netbox/ipam/lookups.py +++ b/netbox/ipam/lookups.py @@ -89,6 +89,20 @@ class NetHost(Lookup): return 'HOST(%s) = %s' % (lhs, rhs), params +class NetHostContained(Lookup): + """ + Check for the host portion of an IP address without regard to its mask. This allows us to find e.g. 192.0.2.1/24 + when specifying a parent prefix of 192.0.2.0/26. + """ + lookup_name = 'net_host_contained' + + def as_sql(self, qn, connection): + lhs, lhs_params = self.process_lhs(qn, connection) + rhs, rhs_params = self.process_rhs(qn, connection) + params = lhs_params + rhs_params + return 'CAST(HOST(%s) AS INET) << %s' % (lhs, rhs), params + + class NetMaskLength(Transform): lookup_name = 'net_mask_length' function = 'MASKLEN' diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 71e261dce..6d2025944 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -403,7 +403,7 @@ def prefix(request, pk): aggregate = None # Count child IP addresses - ipaddress_count = IPAddress.objects.filter(vrf=prefix.vrf, address__net_contained_or_equal=str(prefix.prefix))\ + ipaddress_count = IPAddress.objects.filter(vrf=prefix.vrf, address__net_host_contained=str(prefix.prefix))\ .count() # Parent prefixes table @@ -499,7 +499,7 @@ def prefix_ipaddresses(request, pk): prefix = get_object_or_404(Prefix.objects.all(), pk=pk) # Find all IPAddresses belonging to this Prefix - ipaddresses = IPAddress.objects.filter(vrf=prefix.vrf, address__net_contained_or_equal=str(prefix.prefix))\ + ipaddresses = IPAddress.objects.filter(vrf=prefix.vrf, address__net_host_contained=str(prefix.prefix))\ .select_related('vrf', 'interface__device', 'primary_ip4_for', 'primary_ip6_for') ipaddresses = add_available_ipaddresses(prefix.prefix, ipaddresses, prefix.is_pool) From 086340540af2545e4537e96b260d88c1d7ee4ccc Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 8 Mar 2017 12:04:50 -0500 Subject: [PATCH 3/6] Fixes #948: Region name should be hyperlinked to site list --- netbox/dcim/tables.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index 9773be9dc..42c6a39bf 100644 --- a/netbox/dcim/tables.py +++ b/netbox/dcim/tables.py @@ -12,11 +12,11 @@ from .models import ( REGION_LINK = """ {% if record.get_children %} - + {% else %} {% endif %} - {{ record.name }} + {{ record.name }} """ From d89314a559a887484e2fd8e5985bb1b2cdf8777f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 8 Mar 2017 14:10:27 -0500 Subject: [PATCH 4/6] Fixes #943: Child prefixes missing on Python 3 --- netbox/ipam/models.py | 2 +- netbox/ipam/views.py | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/netbox/ipam/models.py b/netbox/ipam/models.py index a04e4b9ce..51807d0fa 100644 --- a/netbox/ipam/models.py +++ b/netbox/ipam/models.py @@ -267,7 +267,7 @@ class PrefixQuerySet(NullsFirstQuerySet): p.depth = len(stack) - 1 if limit is None: return queryset - return filter(lambda p: p.depth <= limit, queryset) + return list(filter(lambda p: p.depth <= limit, queryset)) @python_2_unicode_compatible diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 6d2025944..bcbb80e8b 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -420,13 +420,7 @@ def prefix(request, pk): duplicate_prefix_table.exclude = ('vrf',) # Child prefixes table - if prefix.vrf: - # If the prefix is in a VRF, show child prefixes only within that VRF. - child_prefixes = Prefix.objects.filter(vrf=prefix.vrf) - else: - # If the prefix is in the global table, show child prefixes from all VRFs. - child_prefixes = Prefix.objects.all() - child_prefixes = child_prefixes.filter(prefix__net_contained=str(prefix.prefix))\ + child_prefixes = Prefix.objects.filter(vrf=prefix.vrf, prefix__net_contained=str(prefix.prefix))\ .select_related('site', 'role').annotate_depth(limit=0) if child_prefixes: child_prefixes = add_available_prefixes(prefix.prefix, child_prefixes) From 094974d417060604442507fda036e28986a31e89 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 8 Mar 2017 14:38:24 -0500 Subject: [PATCH 5/6] Release v1.9.1 --- 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 2b02cf0e8..51a5fed7f 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -12,7 +12,7 @@ except ImportError: "the documentation.") -VERSION = '1.9.1-dev' +VERSION = '1.9.1' # Import local configuration for setting in ['ALLOWED_HOSTS', 'DATABASE', 'SECRET_KEY']: From 70a05b42806e06687b4bed3f14c70d77aeaaf3f1 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 8 Mar 2017 14:45:23 -0500 Subject: [PATCH 6/6] 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 51a5fed7f..856fee9ff 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -12,7 +12,7 @@ except ImportError: "the documentation.") -VERSION = '1.9.1' +VERSION = '1.9.2-dev' # Import local configuration for setting in ['ALLOWED_HOSTS', 'DATABASE', 'SECRET_KEY']: