diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index dba962b9f..61618b0f1 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -24,6 +24,7 @@ * [#7768](https://github.com/netbox-community/netbox/issues/7768) - Validate IP address status when creating a new FHRP group * [#7771](https://github.com/netbox-community/netbox/issues/7771) - Group assignment should be optional when creating contacts via REST API * [#7849](https://github.com/netbox-community/netbox/issues/7849) - Fix exception when creating an FHRPGroup with an invalid IP address +* [#7880](https://github.com/netbox-community/netbox/issues/7880) - Include assigned IP addresses in FHRP group object representation ### REST API Changes diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index 12b0fe4a2..ccca32be8 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -53,7 +53,7 @@ INTERFACE_IPADDRESSES = """ INTERFACE_FHRPGROUPS = """
{% for assignment in value.all %} - {{ assignment.group.group_id }} ({{ assignment.group.get_protocol_display }}) + {{ assignment.group.get_protocol_display }}: {{ assignment.group.group_id }} {% endfor %}
""" diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index 5e40a2081..cdb40333d 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -138,6 +138,7 @@ class FHRPGroupViewSet(CustomFieldModelViewSet): queryset = FHRPGroup.objects.prefetch_related('ip_addresses', 'tags') serializer_class = serializers.FHRPGroupSerializer filterset_class = filtersets.FHRPGroupFilterSet + brief_prefetch_fields = ('ip_addresses',) class FHRPGroupAssignmentViewSet(CustomFieldModelViewSet): diff --git a/netbox/ipam/models/fhrp.py b/netbox/ipam/models/fhrp.py index fe8c80b6b..0a099499f 100644 --- a/netbox/ipam/models/fhrp.py +++ b/netbox/ipam/models/fhrp.py @@ -56,7 +56,17 @@ class FHRPGroup(PrimaryModel): verbose_name = 'FHRP group' def __str__(self): - return f'{self.get_protocol_display()} group {self.group_id}' + name = f'{self.get_protocol_display()}: {self.group_id}' + + # Append the list of assigned IP addresses to serve as an additional identifier + if self.pk: + ip_addresses = [ + str(ip.address) for ip in self.ip_addresses.all() + ] + if ip_addresses: + return f"{name} ({', '.join(ip_addresses)})" + + return name def get_absolute_url(self): return reverse('ipam:fhrpgroup', args=[self.pk]) diff --git a/netbox/templates/ipam/fhrpgroup.html b/netbox/templates/ipam/fhrpgroup.html index 0ee94ab90..32ed1fc1c 100644 --- a/netbox/templates/ipam/fhrpgroup.html +++ b/netbox/templates/ipam/fhrpgroup.html @@ -3,6 +3,9 @@ {% load plugins %} {% load render_table from django_tables2 %} +{# Omit assigned IP addresses from object representation #} +{% block title %}{{ object.get_protocol_display }}: {{ object.group_id }}{% endblock %} + {% block breadcrumbs %} {{ block.super }}