diff --git a/netbox/ipam/tables.py b/netbox/ipam/tables.py index b5a5afe58..bd81b005d 100644 --- a/netbox/ipam/tables.py +++ b/netbox/ipam/tables.py @@ -71,7 +71,7 @@ IPADDRESS_LINK = """ {% if record.pk %} {{ record.address }} {% elif perms.ipam.add_ipaddress %} - {% if record.0 <= 65536 %}{{ record.0 }}{% else %}Many{% endif %} IP{{ record.0|pluralize }} available + {% if record.0 <= 65536 %}{{ record.0 }}{% else %}Many{% endif %} IP{{ record.0|pluralize }} available {% else %} {% if record.0 <= 65536 %}{{ record.0 }}{% else %}Many{% endif %} IP{{ record.0|pluralize }} available {% endif %} diff --git a/netbox/netbox/api.py b/netbox/netbox/api.py index 702334ddd..0bac06977 100644 --- a/netbox/netbox/api.py +++ b/netbox/netbox/api.py @@ -4,7 +4,7 @@ from rest_framework import authentication, exceptions from rest_framework.pagination import LimitOffsetPagination from rest_framework.permissions import DjangoModelPermissions, SAFE_METHODS from rest_framework.renderers import BrowsableAPIRenderer -from rest_framework.views import get_view_name as drf_get_view_name +from rest_framework.utils import formatting from users.models import Token @@ -130,10 +130,18 @@ def get_view_name(view_cls, suffix=None): Derive the view name from its associated model, if it has one. Fall back to DRF's built-in `get_view_name`. """ if hasattr(view_cls, 'queryset'): + # Determine the model name from the queryset. name = view_cls.queryset.model._meta.verbose_name name = ' '.join([w[0].upper() + w[1:] for w in name.split()]) # Capitalize each word - if suffix: - name = "{} {}".format(name, suffix) - return name - return drf_get_view_name(view_cls, suffix) + else: + # Replicate DRF's built-in behavior. + name = view_cls.__name__ + name = formatting.remove_trailing_string(name, 'View') + name = formatting.remove_trailing_string(name, 'ViewSet') + name = formatting.camelcase_to_spaces(name) + + if suffix: + name += ' ' + suffix + + return name diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index f5f181ffd..653ec1a7b 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -214,7 +214,7 @@ REST_FRAMEWORK = { 'netbox.api.TokenAuthentication', ), 'DEFAULT_FILTER_BACKENDS': ( - 'rest_framework.filters.DjangoFilterBackend', + 'django_filters.rest_framework.DjangoFilterBackend', ), 'DEFAULT_PAGINATION_CLASS': 'netbox.api.OptionalLimitOffsetPagination', 'DEFAULT_PERMISSION_CLASSES': ( diff --git a/netbox/netbox/views.py b/netbox/netbox/views.py index faf3f2ee7..5ec81cb25 100644 --- a/netbox/netbox/views.py +++ b/netbox/netbox/views.py @@ -14,7 +14,7 @@ from circuits.models import Circuit, Provider from circuits.tables import CircuitTable, ProviderTable from dcim.filters import DeviceFilter, DeviceTypeFilter, RackFilter, SiteFilter from dcim.models import ConsolePort, Device, DeviceType, InterfaceConnection, PowerPort, Rack, Site -from dcim.tables import DeviceTable, DeviceTypeTable, RackTable, SiteTable +from dcim.tables import DeviceDetailTable, DeviceTypeTable, RackTable, SiteTable from extras.models import TopologyMap, UserAction from ipam.filters import AggregateFilter, IPAddressFilter, PrefixFilter, VLANFilter, VRFFilter from ipam.models import Aggregate, IPAddress, Prefix, VLAN, VRF @@ -67,10 +67,10 @@ SEARCH_TYPES = OrderedDict(( }), ('device', { 'queryset': Device.objects.select_related( - 'device_type__manufacturer', 'device_role', 'tenant', 'site', 'rack' + 'device_type__manufacturer', 'device_role', 'tenant', 'site', 'rack', 'primary_ip4', 'primary_ip6', ), 'filter': DeviceFilter, - 'table': DeviceTable, + 'table': DeviceDetailTable, 'url': 'dcim:device_list', }), # IPAM diff --git a/netbox/templates/ipam/inc/prefix_header.html b/netbox/templates/ipam/inc/prefix_header.html index 6deb10e57..d9e017860 100644 --- a/netbox/templates/ipam/inc/prefix_header.html +++ b/netbox/templates/ipam/inc/prefix_header.html @@ -23,7 +23,7 @@