From 131e433880fc369290cd21208b4befc029ccaa6c Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 2 Nov 2021 15:10:02 -0400 Subject: [PATCH] Rename FHRPGroupAssignment object to interface --- netbox/dcim/models/device_components.py | 6 +++--- netbox/ipam/api/serializers.py | 15 ++++++++------- netbox/ipam/api/views.py | 2 +- netbox/ipam/filtersets.py | 8 ++++++-- netbox/ipam/forms/models.py | 2 +- netbox/ipam/migrations/0052_fhrpgroup.py | 8 ++++---- netbox/ipam/models/fhrp.py | 14 +++++++------- netbox/ipam/tables/fhrp.py | 12 ++++++------ netbox/ipam/views.py | 10 +++++----- netbox/templates/dcim/interface.html | 2 +- .../templates/ipam/fhrpgroupassignment_edit.html | 2 +- netbox/templates/ipam/inc/panels/fhrp_groups.html | 10 +++++++--- netbox/templates/virtualization/vminterface.html | 2 +- netbox/virtualization/models.py | 6 +++--- 14 files changed, 54 insertions(+), 45 deletions(-) diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 0d01435a3..a957aba41 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -601,9 +601,9 @@ class Interface(ComponentModel, BaseInterface, LinkTermination, PathEndpoint): ) fhrp_group_assignments = GenericRelation( to='ipam.FHRPGroupAssignment', - content_type_field='content_type', - object_id_field='object_id', - related_query_name='interface' + content_type_field='interface_type', + object_id_field='interface_id', + related_query_name='+' ) clone_fields = ['device', 'parent', 'bridge', 'lag', 'type', 'mgmt_only'] diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index 525ea393e..25c2297ab 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -110,24 +110,25 @@ class FHRPGroupSerializer(PrimaryModelSerializer): class FHRPGroupAssignmentSerializer(PrimaryModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='tenancy-api:contactassignment-detail') - content_type = ContentTypeField( + interface_type = ContentTypeField( queryset=ContentType.objects.all() ) - object = serializers.SerializerMethodField(read_only=True) + interface = serializers.SerializerMethodField(read_only=True) class Meta: model = FHRPGroupAssignment fields = [ - 'id', 'url', 'display', 'content_type', 'object_id', 'object', 'priority', 'created', 'last_updated', + 'id', 'url', 'display', 'interface_type', 'interface_id', 'interface', 'priority', 'created', + 'last_updated', ] @swagger_serializer_method(serializer_or_field=serializers.DictField) - def get_object(self, obj): - if obj.object is None: + def get_interface(self, obj): + if obj.interface is None: return None - serializer = get_serializer_for_model(obj.object, prefix='Nested') + serializer = get_serializer_for_model(obj.interface, prefix='Nested') context = {'request': self.context['request']} - return serializer(obj.object, context=context).data + return serializer(obj.interface, context=context).data # diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index dffe555e9..a0ad4f375 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -130,7 +130,7 @@ class FHRPGroupViewSet(CustomFieldModelViewSet): class FHRPGroupAssignmentViewSet(CustomFieldModelViewSet): - queryset = FHRPGroupAssignment.objects.prefetch_related('group', 'object') + queryset = FHRPGroupAssignment.objects.prefetch_related('group', 'interface') serializer_class = serializers.FHRPGroupAssignmentSerializer filterset_class = filtersets.FHRPGroupAssignmentFilterSet diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 5d385c7ef..db2f5aaea 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -663,11 +663,15 @@ class FHRPGroupFilterSet(PrimaryModelFilterSet): class FHRPGroupAssignmentFilterSet(ChangeLoggedModelFilterSet): - content_type = ContentTypeFilter() + interface_type = ContentTypeFilter() + group_id = django_filters.ModelMultipleChoiceFilter( + queryset=FHRPGroup.objects.all(), + label='Group (ID)', + ) class Meta: model = FHRPGroupAssignment - fields = ['id', 'content_type_id', 'priority'] + fields = ['id', 'group_id', 'interface_type', 'interface_id', 'priority'] class VLANGroupFilterSet(OrganizationalModelFilterSet): diff --git a/netbox/ipam/forms/models.py b/netbox/ipam/forms/models.py index d421bdbcd..70094a07a 100644 --- a/netbox/ipam/forms/models.py +++ b/netbox/ipam/forms/models.py @@ -543,7 +543,7 @@ class FHRPGroupAssignmentForm(BootstrapMixin, forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - ipaddresses = self.instance.object.ip_addresses.all() + ipaddresses = self.instance.interface.ip_addresses.all() for ipaddress in ipaddresses: self.fields['group'].widget.add_query_param('related_ip', ipaddress.pk) diff --git a/netbox/ipam/migrations/0052_fhrpgroup.py b/netbox/ipam/migrations/0052_fhrpgroup.py index 9a3f41aab..976084b47 100644 --- a/netbox/ipam/migrations/0052_fhrpgroup.py +++ b/netbox/ipam/migrations/0052_fhrpgroup.py @@ -8,8 +8,8 @@ import taggit.managers class Migration(migrations.Migration): dependencies = [ - ('extras', '0064_configrevision'), ('contenttypes', '0002_remove_content_type_name'), + ('extras', '0064_configrevision'), ('ipam', '0051_extend_tag_support'), ] @@ -44,15 +44,15 @@ class Migration(migrations.Migration): ('created', models.DateField(auto_now_add=True, null=True)), ('last_updated', models.DateTimeField(auto_now=True, null=True)), ('id', models.BigAutoField(primary_key=True, serialize=False)), - ('object_id', models.PositiveIntegerField()), + ('interface_id', models.PositiveIntegerField()), ('priority', models.PositiveSmallIntegerField(validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(255)])), - ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')), ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ipam.fhrpgroup')), + ('interface_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')), ], options={ 'verbose_name': 'FHRP group assignment', 'ordering': ('priority', 'pk'), - 'unique_together': {('content_type', 'object_id', 'group')}, + 'unique_together': {('interface_type', 'interface_id', 'group')}, }, ), ] diff --git a/netbox/ipam/models/fhrp.py b/netbox/ipam/models/fhrp.py index ee5a9a2be..95c907cfd 100644 --- a/netbox/ipam/models/fhrp.py +++ b/netbox/ipam/models/fhrp.py @@ -69,14 +69,14 @@ class FHRPGroup(PrimaryModel): @extras_features('webhooks') class FHRPGroupAssignment(ChangeLoggedModel): - content_type = models.ForeignKey( + interface_type = models.ForeignKey( to=ContentType, on_delete=models.CASCADE ) - object_id = models.PositiveIntegerField() - object = GenericForeignKey( - ct_field='content_type', - fk_field='object_id' + interface_id = models.PositiveIntegerField() + interface = GenericForeignKey( + ct_field='interface_type', + fk_field='interface_id' ) group = models.ForeignKey( to='ipam.FHRPGroup', @@ -93,8 +93,8 @@ class FHRPGroupAssignment(ChangeLoggedModel): class Meta: ordering = ('priority', 'pk') - unique_together = ('content_type', 'object_id', 'group') + unique_together = ('interface_type', 'interface_id', 'group') verbose_name = 'FHRP group assignment' def __str__(self): - return f'{self.object}: {self.group} ({self.priority})' + return f'{self.interface}: {self.group} ({self.priority})' diff --git a/netbox/ipam/tables/fhrp.py b/netbox/ipam/tables/fhrp.py index 8aae4bba7..8a31694bf 100644 --- a/netbox/ipam/tables/fhrp.py +++ b/netbox/ipam/tables/fhrp.py @@ -27,8 +27,8 @@ class FHRPGroupTable(BaseTable): orderable=False, verbose_name='IP Addresses' ) - member_count = tables.Column( - verbose_name='Members' + interface_count = tables.Column( + verbose_name='Interfaces' ) tags = TagColumn( url_name='ipam:fhrpgroup_list' @@ -37,10 +37,10 @@ class FHRPGroupTable(BaseTable): class Meta(BaseTable.Meta): model = FHRPGroup fields = ( - 'pk', 'group_id', 'protocol', 'auth_type', 'auth_key', 'description', 'ip_addresses', 'member_count', + 'pk', 'group_id', 'protocol', 'auth_type', 'auth_key', 'description', 'ip_addresses', 'interface_count', 'tags', ) - default_columns = ('pk', 'group_id', 'protocol', 'auth_type', 'description', 'ip_addresses', 'member_count') + default_columns = ('pk', 'group_id', 'protocol', 'auth_type', 'description', 'ip_addresses', 'interface_count') class FHRPGroupAssignmentTable(BaseTable): @@ -51,7 +51,7 @@ class FHRPGroupAssignmentTable(BaseTable): orderable=False, verbose_name='Parent' ) - object = tables.Column( + interface = tables.Column( linkify=True, orderable=False ) @@ -65,4 +65,4 @@ class FHRPGroupAssignmentTable(BaseTable): class Meta(BaseTable.Meta): model = FHRPGroupAssignment - fields = ('pk', 'group', 'object_parent', 'object', 'priority') + fields = ('pk', 'group', 'object_parent', 'interface', 'priority') diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index d9bd1977a..8592fc931 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -914,24 +914,24 @@ class FHRPGroupAssignmentEditView(generic.ObjectEditView): def alter_obj(self, instance, request, args, kwargs): if not instance.pk: - # Assign the object based on URL kwargs + # Assign the interface based on URL kwargs try: - app_label, model = request.GET.get('content_type').split('.') + app_label, model = request.GET.get('interface_type').split('.') except (AttributeError, ValueError): raise Http404("Content type not specified") content_type = get_object_or_404(ContentType, app_label=app_label, model=model) - instance.object = get_object_or_404(content_type.model_class(), pk=request.GET.get('object_id')) + instance.interface = get_object_or_404(content_type.model_class(), pk=request.GET.get('interface_id')) return instance def get_return_url(self, request, obj=None): - return obj.object.get_absolute_url() if obj else super().get_return_url(request) + return obj.interface.get_absolute_url() if obj else super().get_return_url(request) class FHRPGroupAssignmentDeleteView(generic.ObjectDeleteView): queryset = FHRPGroupAssignment.objects.all() def get_return_url(self, request, obj=None): - return obj.object.get_absolute_url() if obj else super().get_return_url(request) + return obj.interface.get_absolute_url() if obj else super().get_return_url(request) # diff --git a/netbox/templates/dcim/interface.html b/netbox/templates/dcim/interface.html index f4ab30e4d..811bf6257 100644 --- a/netbox/templates/dcim/interface.html +++ b/netbox/templates/dcim/interface.html @@ -459,7 +459,7 @@ {% if perms.ipam.add_ipaddress %} diff --git a/netbox/templates/ipam/fhrpgroupassignment_edit.html b/netbox/templates/ipam/fhrpgroupassignment_edit.html index 730d2a15a..5801febca 100644 --- a/netbox/templates/ipam/fhrpgroupassignment_edit.html +++ b/netbox/templates/ipam/fhrpgroupassignment_edit.html @@ -9,7 +9,7 @@
- +
{% render_field form.group %} diff --git a/netbox/templates/ipam/inc/panels/fhrp_groups.html b/netbox/templates/ipam/inc/panels/fhrp_groups.html index 3ed4f1761..e5cb26104 100644 --- a/netbox/templates/ipam/inc/panels/fhrp_groups.html +++ b/netbox/templates/ipam/inc/panels/fhrp_groups.html @@ -7,6 +7,7 @@ Group + Protocol Virtual IPs Priority @@ -15,7 +16,10 @@ {% for assignment in object.fhrp_group_assignments.all %} - {{ assignment.group }} + {{ assignment.group.group_id }} + + + {{ assignment.group.get_protocol_display }} {% for ipaddress in assignment.group.ip_addresses.all %} @@ -37,12 +41,12 @@ {% if perms.ipam.add_ipaddress %} diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py index 3567b86c5..08df36d4d 100644 --- a/netbox/virtualization/models.py +++ b/netbox/virtualization/models.py @@ -400,9 +400,9 @@ class VMInterface(PrimaryModel, BaseInterface): ) fhrp_group_assignments = GenericRelation( to='ipam.FHRPGroupAssignment', - content_type_field='content_type', - object_id_field='object_id', - related_query_name='vminterface' + content_type_field='interface_type', + object_id_field='interface_id', + related_query_name='+' ) objects = RestrictedQuerySet.as_manager()