Forráskód Böngészése

Merge pull request #23261 from mollona/23230-powerfeed-location-filter

Closes #23230: Add location filter to power feeds
bctiemann 1 napja
szülő
commit
d7c56dcf2e

+ 13 - 0
netbox/dcim/filtersets.py

@@ -3216,6 +3216,19 @@ class PowerFeedFilterSet(PrimaryModelFilterSet, CabledObjectFilterSet, PathEndpo
         to_field_name='slug',
         label=_('Site name (slug)'),
     )
+    location_id = TreeNodeMultipleChoiceFilter(
+        queryset=Location.objects.all(),
+        field_name='power_panel__location',
+        lookup_expr='in',
+        label=_('Location (ID)'),
+    )
+    location = TreeNodeMultipleChoiceFilter(
+        queryset=Location.objects.all(),
+        field_name='power_panel__location',
+        lookup_expr='in',
+        to_field_name='slug',
+        label=_('Location (slug)'),
+    )
     power_panel_id = django_filters.ModelMultipleChoiceFilter(
         queryset=PowerPanel.objects.all(),
         distinct=False,

+ 10 - 1
netbox/dcim/forms/filtersets.py

@@ -1441,7 +1441,8 @@ class PowerFeedFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm):
     model = PowerFeed
     fieldsets = (
         FieldSet('q', 'filter_id', 'tag'),
-        FieldSet('region_id', 'site_group_id', 'site_id', 'power_panel_id', 'rack_id', name=_('Location')),
+        FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'power_panel_id', 'rack_id',
+         name=_('Location')),
         FieldSet('status', 'type', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization', name=_('Attributes')),
         FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')),
         FieldSet('owner_group_id', 'owner_id', name=_('Ownership')),
@@ -1464,6 +1465,14 @@ class PowerFeedFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm):
         },
         label=_('Site')
     )
+    location_id = DynamicModelMultipleChoiceField(
+        queryset=Location.objects.all(),
+        required=False,
+        query_params={
+            'site_id': '$site_id'
+        },
+        label=_('Location')
+    )
     power_panel_id = DynamicModelMultipleChoiceField(
         queryset=PowerPanel.objects.all(),
         required=False,

+ 18 - 3
netbox/dcim/tests/test_filtersets.py

@@ -8120,6 +8120,14 @@ class PowerFeedTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
         )
         Site.objects.bulk_create(sites)
 
+        locations = (
+            Location(name='Location 1', slug='location-1', site=sites[0]),
+            Location(name='Location 2', slug='location-2', site=sites[1]),
+            Location(name='Location 3', slug='location-3', site=sites[2]),
+        )
+        for location in locations:
+            location.save()
+
         racks = (
             Rack(name='Rack 1', site=sites[0]),
             Rack(name='Rack 2', site=sites[1]),
@@ -8143,9 +8151,9 @@ class PowerFeedTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
         Tenant.objects.bulk_create(tenants)
 
         power_panels = (
-            PowerPanel(name='Power Panel 1', site=sites[0]),
-            PowerPanel(name='Power Panel 2', site=sites[1]),
-            PowerPanel(name='Power Panel 3', site=sites[2]),
+            PowerPanel(name='Power Panel 1', site=sites[0], location=locations[0]),
+            PowerPanel(name='Power Panel 2', site=sites[1], location=locations[1]),
+            PowerPanel(name='Power Panel 3', site=sites[2], location=locations[2]),
         )
         PowerPanel.objects.bulk_create(power_panels)
 
@@ -8268,6 +8276,13 @@ class PowerFeedTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
         params = {'site': [sites[0].slug, sites[1].slug]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
+    def test_location(self):
+        locations = Location.objects.all()[:2]
+        params = {'location_id': [locations[0].pk, locations[1].pk]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'location': [locations[0].slug, locations[1].slug]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+
     def test_power_panel_id(self):
         power_panels = PowerPanel.objects.all()[:2]
         params = {'power_panel_id': [power_panels[0].pk, power_panels[1].pk]}