diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index dcd6c6d2e..54a7af4e2 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -448,20 +448,13 @@ class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet): def search(self, queryset, name, value): if not value.strip(): return queryset - qs_filter = ( + return queryset.filter( Q(name__icontains=value) | Q(serial__icontains=value.strip()) | Q(inventory_items__serial__icontains=value.strip()) | Q(asset_tag=value.strip()) | Q(comments__icontains=value) - ) - # If the query value looks like a MAC address, search interfaces as well. - try: - mac = EUI(value.strip()) - qs_filter |= Q(interfaces__mac_address=mac) - except AddrFormatError: - pass - return queryset.filter(qs_filter).distinct() + ).distinct() def _mac_address(self, queryset, name, value): value = value.strip() diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index 87511d5c5..9cf93cb4b 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -115,7 +115,11 @@ class PrefixViewSet(WritableSerializerMixin, CustomFieldModelViewSet): limit = min(limit, settings.MAX_PAGE_SIZE) # Calculate available IPs within the prefix - ip_list = list(prefix.get_available_ips())[:limit] + ip_list = [] + for index, ip in enumerate(prefix.get_available_ips(), start=1): + ip_list.append(ip) + if index == limit: + break serializer = serializers.AvailableIPSerializer(ip_list, many=True, context={ 'request': request, 'prefix': prefix.prefix, diff --git a/netbox/ipam/migrations/0018_remove_service_uniqueness_constraint.py b/netbox/ipam/migrations/0018_remove_service_uniqueness_constraint.py new file mode 100644 index 000000000..77e083ef3 --- /dev/null +++ b/netbox/ipam/migrations/0018_remove_service_uniqueness_constraint.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.3 on 2017-08-03 19:37 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0017_ipaddress_roles'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='service', + unique_together=set([]), + ), + ] diff --git a/netbox/ipam/models.py b/netbox/ipam/models.py index 04853c5da..bbd5e1827 100644 --- a/netbox/ipam/models.py +++ b/netbox/ipam/models.py @@ -600,7 +600,6 @@ class Service(CreatedUpdatedModel): class Meta: ordering = ['device', 'protocol', 'port'] - unique_together = ['device', 'protocol', 'port'] def __str__(self): return '{} ({}/{})'.format(self.name, self.port, self.get_protocol_display()) diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index c97c9bbc5..52154fbb4 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -13,7 +13,7 @@ except ImportError: ) -VERSION = '2.1.1' +VERSION = '2.1.2' # Import required configuration parameters ALLOWED_HOSTS = DATABASE = SECRET_KEY = None diff --git a/netbox/project-static/css/base.css b/netbox/project-static/css/base.css index 573c1c967..0f6b24077 100644 --- a/netbox/project-static/css/base.css +++ b/netbox/project-static/css/base.css @@ -81,6 +81,11 @@ footer p { } } +/* Navigation menu */ +li.subnav > a { + padding-left: 30px; +} + /* Forms */ label { font-weight: normal; diff --git a/netbox/templates/_base.html b/netbox/templates/_base.html index 10b4970a8..c56a95abe 100644 --- a/netbox/templates/_base.html +++ b/netbox/templates/_base.html @@ -31,197 +31,197 @@ @@ -229,14 +229,14 @@ @@ -250,16 +250,16 @@ {{ request.user|truncatechars:"30" }} {% else %} -
  • Log in
  • +
  • Log in
  • {% endif %}