mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Rename FHRPGroupAssignment object to interface
This commit is contained in:
@ -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']
|
||||
|
@ -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
|
||||
|
||||
|
||||
#
|
||||
|
@ -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
|
||||
|
||||
|
@ -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):
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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')},
|
||||
},
|
||||
),
|
||||
]
|
||||
|
@ -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})'
|
||||
|
@ -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')
|
||||
|
@ -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)
|
||||
|
||||
|
||||
#
|
||||
|
@ -459,7 +459,7 @@
|
||||
</div>
|
||||
{% if perms.ipam.add_ipaddress %}
|
||||
<div class="card-footer text-end noprint">
|
||||
<a href="{% url 'ipam:ipaddress_add' %}?device={{ object.device.pk }}&interface={{ object.pk }}" class="btn btn-sm btn-primary">
|
||||
<a href="{% url 'ipam:ipaddress_add' %}?device={{ object.device.pk }}&interface={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-sm btn-primary">
|
||||
<span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add IP Address
|
||||
</a>
|
||||
</div>
|
||||
|
@ -9,7 +9,7 @@
|
||||
<div class="row mb-3">
|
||||
<label class="col-sm-3 col-form-label text-lg-end">Interface</label>
|
||||
<div class="col">
|
||||
<input class="form-control" value="{{ form.instance.object }}" disabled />
|
||||
<input class="form-control" value="{{ form.instance.interface }}" disabled />
|
||||
</div>
|
||||
</div>
|
||||
{% render_field form.group %}
|
||||
|
@ -7,6 +7,7 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Group</th>
|
||||
<th>Protocol</th>
|
||||
<th>Virtual IPs</th>
|
||||
<th>Priority</th>
|
||||
</tr>
|
||||
@ -15,7 +16,10 @@
|
||||
{% for assignment in object.fhrp_group_assignments.all %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ assignment.group.get_absolute_url }}">{{ assignment.group }}</a>
|
||||
<a href="{{ assignment.group.get_absolute_url }}">{{ assignment.group.group_id }}</a>
|
||||
</td>
|
||||
<td>
|
||||
{{ assignment.group.get_protocol_display }}
|
||||
</td>
|
||||
<td>
|
||||
{% for ipaddress in assignment.group.ip_addresses.all %}
|
||||
@ -37,12 +41,12 @@
|
||||
</div>
|
||||
<div class="card-footer text-end noprint">
|
||||
{% if perms.ipam.add_fhrpgroup %}
|
||||
<a href="{% url 'ipam:fhrpgroup_add' %}?return_url={% url 'ipam:fhrpgroupassignment_add' %}%3Fcontent_type={{ object|meta:"app_label" }}.{{ object|meta:"model_name" }}%26object_id={{ object.pk }}" class="btn btn-sm btn-primary">
|
||||
<a href="{% url 'ipam:fhrpgroup_add' %}?return_url={% url 'ipam:fhrpgroupassignment_add' %}%3Finterface_type={{ object|meta:"app_label" }}.{{ object|meta:"model_name" }}%26interface_id={{ object.pk }}" class="btn btn-sm btn-primary">
|
||||
<span class="mdi mdi-plus-thick" aria-hidden="true"></span> Create Group
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if perms.ipam.add_fhrpgroupassignment %}
|
||||
<a href="{% url 'ipam:fhrpgroupassignment_add' %}?content_type={{ object|meta:"app_label" }}.{{ object|meta:"model_name" }}&object_id={{ object.pk }}" class="btn btn-sm btn-primary">
|
||||
<a href="{% url 'ipam:fhrpgroupassignment_add' %}?interface_type={{ object|meta:"app_label" }}.{{ object|meta:"model_name" }}&interface_id={{ object.pk }}" class="btn btn-sm btn-primary">
|
||||
<span class="mdi mdi-plus-thick" aria-hidden="true"></span> Assign Group
|
||||
</a>
|
||||
{% endif %}
|
||||
|
@ -100,7 +100,7 @@
|
||||
</div>
|
||||
{% if perms.ipam.add_ipaddress %}
|
||||
<div class="card-footer text-end noprint">
|
||||
<a href="{% url 'ipam:ipaddress_add' %}?virtual_machine={{ object.virtual_machine.pk }}&vminterface={{ object.pk }}" class="btn btn-sm btn-primary">
|
||||
<a href="{% url 'ipam:ipaddress_add' %}?virtual_machine={{ object.virtual_machine.pk }}&vminterface={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-sm btn-primary">
|
||||
<span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add IP Address
|
||||
</a>
|
||||
</div>
|
||||
|
@ -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()
|
||||
|
Reference in New Issue
Block a user