- {% if nonracked_devices %}
-
-
- {% trans "Name" %} |
- {% trans "Role" %} |
- {% trans "Type" %} |
- {% trans "Parent Device" %} |
-
- {% for device in nonracked_devices %}
-
-
- {{ device }}
- |
- {{ device.role }} |
- {{ device.device_type }} |
- {% if device.parent_bay %}
- {{ device.parent_bay.device|linkify }} |
- {{ device.parent_bay }} |
- {% else %}
- — |
- {% endif %}
-
- {% endfor %}
-
-
- {% if total_nonracked_devices_count > nonracked_devices.count %}
- {% if object|meta:'verbose_name' == 'site' %}
-
- {% blocktrans with count=nonracked_devices.count total=total_nonracked_devices_count %}
- Displaying {{ count }} of {{ total }} devices
- {% endblocktrans %}
- (
{% trans "View full list" %})
-
- {% elif object|meta:'verbose_name' == 'location' %}
-
- {% blocktrans with count=nonracked_devices.count total=total_nonracked_devices_count %}
- Displaying {{ count }} of {{ total }} devices
- {% endblocktrans %}
- (
{% trans "View full list" %})
-
- {% endif %}
- {% endif %}
-
- {% else %}
-
- {% trans "None" %}
-
- {% endif %}
-
-
- {% if perms.dcim.add_device %}
- {% if object|meta:'verbose_name' == 'rack' %}
-
- {% elif object|meta:'verbose_name' == 'site' %}
-
- {% elif object|meta:'verbose_name' == 'location' %}
-
- {% endif %}
- {% endif %}
-
diff --git a/netbox/templates/dcim/location.html b/netbox/templates/dcim/location.html
index c9a8231b9..854b93f9e 100644
--- a/netbox/templates/dcim/location.html
+++ b/netbox/templates/dcim/location.html
@@ -66,7 +66,6 @@
{% include 'inc/panels/related_objects.html' %}
- {% include 'dcim/inc/nonracked_devices.html' %}
{% include 'inc/panels/image_attachments.html' %}
{% plugin_right_page object %}
@@ -79,6 +78,27 @@
hx-get="{% url 'dcim:location_list' %}?parent_id={{ object.pk }}"
hx-trigger="load"
>
+ {% if perms.dcim.add_location %}
+
+ {% endif %}
+
+
{% if utilization >= 35 %}{{ utilization|floatformat:1 }}%{% endif %}
diff --git a/netbox/utilities/tests/test_filters.py b/netbox/utilities/tests/test_filters.py
index 80d611375..6caeb9d14 100644
--- a/netbox/utilities/tests/test_filters.py
+++ b/netbox/utilities/tests/test_filters.py
@@ -86,6 +86,10 @@ class DummyModel(models.Model):
charfield = models.CharField(
max_length=10
)
+ numberfield = models.IntegerField(
+ blank=True,
+ null=True
+ )
choicefield = models.IntegerField(
choices=(('A', 1), ('B', 2), ('C', 3))
)
@@ -108,6 +112,7 @@ class BaseFilterSetTest(TestCase):
"""
class DummyFilterSet(BaseFilterSet):
charfield = django_filters.CharFilter()
+ numberfield = django_filters.NumberFilter()
macaddressfield = MACAddressFilter()
modelchoicefield = django_filters.ModelChoiceFilter(
field_name='integerfield', # We're pretending this is a ForeignKey field
@@ -132,6 +137,7 @@ class BaseFilterSetTest(TestCase):
model = DummyModel
fields = (
'charfield',
+ 'numberfield',
'choicefield',
'datefield',
'datetimefield',
@@ -171,6 +177,25 @@ class BaseFilterSetTest(TestCase):
self.assertEqual(self.filters['charfield__iew'].exclude, False)
self.assertEqual(self.filters['charfield__niew'].lookup_expr, 'iendswith')
self.assertEqual(self.filters['charfield__niew'].exclude, True)
+ self.assertEqual(self.filters['charfield__empty'].lookup_expr, 'empty')
+ self.assertEqual(self.filters['charfield__empty'].exclude, False)
+
+ def test_number_filter(self):
+ self.assertIsInstance(self.filters['numberfield'], django_filters.NumberFilter)
+ self.assertEqual(self.filters['numberfield'].lookup_expr, 'exact')
+ self.assertEqual(self.filters['numberfield'].exclude, False)
+ self.assertEqual(self.filters['numberfield__n'].lookup_expr, 'exact')
+ self.assertEqual(self.filters['numberfield__n'].exclude, True)
+ self.assertEqual(self.filters['numberfield__lt'].lookup_expr, 'lt')
+ self.assertEqual(self.filters['numberfield__lt'].exclude, False)
+ self.assertEqual(self.filters['numberfield__lte'].lookup_expr, 'lte')
+ self.assertEqual(self.filters['numberfield__lte'].exclude, False)
+ self.assertEqual(self.filters['numberfield__gt'].lookup_expr, 'gt')
+ self.assertEqual(self.filters['numberfield__gt'].exclude, False)
+ self.assertEqual(self.filters['numberfield__gte'].lookup_expr, 'gte')
+ self.assertEqual(self.filters['numberfield__gte'].exclude, False)
+ self.assertEqual(self.filters['numberfield__empty'].lookup_expr, 'isnull')
+ self.assertEqual(self.filters['numberfield__empty'].exclude, False)
def test_mac_address_filter(self):
self.assertIsInstance(self.filters['macaddressfield'], MACAddressFilter)
diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py
index 9c7748cbd..cbe953040 100644
--- a/netbox/virtualization/views.py
+++ b/netbox/virtualization/views.py
@@ -387,7 +387,6 @@ class VirtualMachineConfigContextView(ObjectConfigContextView):
base_template = 'virtualization/virtualmachine.html'
tab = ViewTab(
label=_('Config Context'),
- permission='extras.view_configcontext',
weight=2000
)