Skip to content

Commit 0348a5b

Browse files
authored
Fixed Address Object Group ObjectsTablePanel (#349)
1 parent 1b2ea36 commit 0348a5b

File tree

5 files changed

+112
-3
lines changed

5 files changed

+112
-3
lines changed

changes/349.fixed

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fixed the filter used in the Address Object panel badge link on the Address Object Group detail page.
2+
Fixed the filter used in the Application Object panel badge link on the Application Object Group detail page.

nautobot_firewall_models/details.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ class ZoneFieldsPanel(BaseFieldsPanelMixin, ui.ObjectFieldsPanel):
125125
section=ui.SectionChoices.FULL_WIDTH,
126126
table_class=tables.AddressObjectTable,
127127
table_filter="address_object_groups",
128-
related_field_name="address_objects",
128+
related_field_name="address_object_groups",
129129
add_button_route=None,
130130
),
131131
),
@@ -165,7 +165,7 @@ class ZoneFieldsPanel(BaseFieldsPanelMixin, ui.ObjectFieldsPanel):
165165
section=ui.SectionChoices.FULL_WIDTH,
166166
table_class=tables.ApplicationObjectTable,
167167
table_filter="application_object_groups",
168-
related_field_name="application_objects",
168+
related_field_name="application_object_groups",
169169
add_button_route=None,
170170
),
171171
),

nautobot_firewall_models/filters.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ class Meta:
5656
class AddressObjectFilterSet(BaseFilterSet, NautobotFilterSet):
5757
"""Filter for AddressObject."""
5858

59+
address_object_groups = NaturalKeyOrPKMultipleChoiceFilter(
60+
field_name="address_object_groups",
61+
queryset=models.AddressObjectGroup.objects.all(),
62+
label="Address Object Groups (name or ID)",
63+
)
64+
5965
class Meta:
6066
"""Meta attributes for filter."""
6167

@@ -76,6 +82,12 @@ class Meta:
7682
class ApplicationObjectFilterSet(BaseFilterSet, NautobotFilterSet):
7783
"""Filter for ApplicationObject."""
7884

85+
application_object_groups = NaturalKeyOrPKMultipleChoiceFilter(
86+
field_name="application_object_groups",
87+
queryset=models.ApplicationObjectGroup.objects.all(),
88+
label="Application Object Groups (name or ID)",
89+
)
90+
7991
class Meta:
8092
"""Meta attributes for filter."""
8193

nautobot_firewall_models/tests/test_filters.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
"""Unit tests for nautobot_firewall_models."""
2+
23
# pylint: disable=invalid-name
34

45
from django.test import TestCase
6+
from nautobot.apps.testing import FilterTestCases
57
from nautobot.dcim.models import Device
8+
from nautobot.extras.models import Status
9+
from nautobot.ipam.models import IPAddress, Namespace, Prefix
610

711
from nautobot_firewall_models import filters, models
812

@@ -38,3 +42,89 @@ def test_device(self):
3842
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
3943
params = {"device": [self.dev01.id]}
4044
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
45+
46+
47+
class AddressObjectTestCase(FilterTestCases.FilterTestCase):
48+
"""Test filtering operations for AddressObject Model."""
49+
50+
queryset = models.AddressObject.objects.all()
51+
filterset = filters.AddressObjectFilterSet
52+
generic_filter_tests = (
53+
("address_object_groups", "address_object_groups__id"),
54+
("address_object_groups", "address_object_groups__name"),
55+
)
56+
57+
@classmethod
58+
def setUpTestData(cls):
59+
"""Set up test data."""
60+
status_active = Status.objects.get(name="Active")
61+
global_namespace = Namespace.objects.get(name="Global")
62+
Prefix.objects.create(prefix="0.0.0.0/0", namespace=global_namespace, status=status_active)
63+
ip_addresses = (
64+
IPAddress.objects.create(address="10.0.0.1", status=status_active, namespace=global_namespace),
65+
IPAddress.objects.create(address="10.0.0.2", status=status_active, namespace=global_namespace),
66+
IPAddress.objects.create(address="10.0.0.3", status=status_active, namespace=global_namespace),
67+
)
68+
address_objects = (
69+
models.AddressObject.objects.create(
70+
name="test-address-object",
71+
status=status_active,
72+
ip_address=ip_addresses[0],
73+
),
74+
models.AddressObject.objects.create(
75+
name="test-address-object-2",
76+
status=status_active,
77+
ip_address=ip_addresses[1],
78+
),
79+
models.AddressObject.objects.create(
80+
name="test-address-object-3",
81+
status=status_active,
82+
ip_address=ip_addresses[2],
83+
),
84+
)
85+
address_object_groups = (
86+
models.AddressObjectGroup.objects.create(name="test-address-object-group", status=status_active),
87+
models.AddressObjectGroup.objects.create(name="test-address-object-group-2", status=status_active),
88+
models.AddressObjectGroup.objects.create(name="test-address-object-group-3", status=status_active),
89+
)
90+
address_object_groups[0].address_objects.set([address_objects[0]])
91+
address_object_groups[1].address_objects.set([address_objects[1]])
92+
address_object_groups[2].address_objects.set([address_objects[2]])
93+
94+
95+
class ApplicationObjectTestCase(FilterTestCases.FilterTestCase):
96+
"""Test filtering operations for ApplicationObject Model."""
97+
98+
queryset = models.ApplicationObject.objects.all()
99+
filterset = filters.ApplicationObjectFilterSet
100+
generic_filter_tests = (
101+
("application_object_groups", "application_object_groups__id"),
102+
("application_object_groups", "application_object_groups__name"),
103+
)
104+
105+
@classmethod
106+
def setUpTestData(cls):
107+
"""Set up test data."""
108+
status_active = Status.objects.get(name="Active")
109+
application_objects = (
110+
models.ApplicationObject.objects.create(
111+
name="test-application-object",
112+
status=status_active,
113+
),
114+
models.ApplicationObject.objects.create(
115+
name="test-application-object-2",
116+
status=status_active,
117+
),
118+
models.ApplicationObject.objects.create(
119+
name="test-application-object-3",
120+
status=status_active,
121+
),
122+
)
123+
application_object_groups = (
124+
models.ApplicationObjectGroup.objects.create(name="test-application-object-group", status=status_active),
125+
models.ApplicationObjectGroup.objects.create(name="test-application-object-group-2", status=status_active),
126+
models.ApplicationObjectGroup.objects.create(name="test-application-object-group-3", status=status_active),
127+
)
128+
application_object_groups[0].application_objects.set([application_objects[0]])
129+
application_object_groups[1].application_objects.set([application_objects[1]])
130+
application_object_groups[2].application_objects.set([application_objects[2]])

nautobot_firewall_models/views/capirca_policy.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@ class CapircaPolicyUIViewSet(
3535

3636
lookup_field = "pk"
3737

38-
@action(detail=True, methods=["get"])
38+
@action(
39+
detail=True,
40+
methods=["get"],
41+
custom_view_base_action="view",
42+
custom_view_additional_permissions=["dcim.view_device"],
43+
)
3944
def devicedetail(self, request, pk, *args, **kwargs):
4045
# pylint: disable=invalid-name, arguments-differ, unused-argument
4146
"""Action method to see the full configuration."""

0 commit comments

Comments
 (0)