From 246d441fed823ebe7e5c4c39d532ee441e423b37 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Wed, 17 Jul 2024 21:09:03 +0700 Subject: [PATCH] 7025 add tenancy --- netbox/circuits/filtersets.py | 2 +- netbox/circuits/forms/bulk_edit.py | 18 ++++++++ netbox/circuits/forms/bulk_import.py | 9 +++- netbox/circuits/forms/filtersets.py | 3 +- ...tgroup_circuitgroupassignment_and_more.py} | 41 ++++++++++++------- netbox/circuits/models/circuits.py | 11 ++++- netbox/circuits/urls.py | 2 +- netbox/circuits/views.py | 7 ++++ 8 files changed, 72 insertions(+), 21 deletions(-) rename netbox/circuits/migrations/{0044_circuitgroupassignment_circuitredundancygroup_and_more.py => 0044_circuitgroup_circuitgroupassignment_and_more.py} (66%) diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index ccccb43fc..993959c51 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -306,7 +306,7 @@ class CircuitTerminationFilterSet(NetBoxModelFilterSet, CabledObjectFilterSet): ).distinct() -class CircuitGroupFilterSet(NetBoxModelFilterSet): +class CircuitGroupFilterSet(NetBoxModelFilterSet, TenancyFilterSet): class Meta: model = CircuitGroup diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index ea15c3010..798faf961 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -14,6 +14,7 @@ from utilities.forms.widgets import BulkEditNullBooleanSelect, DatePicker, Numbe __all__ = ( 'CircuitBulkEditForm', + 'CircuitGroupBulkEditForm', 'CircuitTerminationBulkEditForm', 'CircuitTypeBulkEditForm', 'ProviderBulkEditForm', @@ -219,3 +220,20 @@ class CircuitTerminationBulkEditForm(NetBoxModelBulkEditForm): FieldSet('port_speed', 'upstream_speed', name=_('Termination Details')), ) nullable_fields = ('description') + + +class CircuitGroupBulkEditForm(NetBoxModelBulkEditForm): + tenant = DynamicModelChoiceField( + label=_('Tenant'), + queryset=Tenant.objects.all(), + required=False + ) + comments = CommentField() + + model = CircuitGroup + fieldsets = ( + FieldSet('tenant', name=_('Tenancy')), + ) + nullable_fields = ( + 'tenant', 'comments', + ) diff --git a/netbox/circuits/forms/bulk_import.py b/netbox/circuits/forms/bulk_import.py index 94a2ff1e3..a0c99eff3 100644 --- a/netbox/circuits/forms/bulk_import.py +++ b/netbox/circuits/forms/bulk_import.py @@ -154,7 +154,14 @@ class CircuitTerminationImportForm(NetBoxModelImportForm, BaseCircuitTermination class CircuitGroupImportForm(NetBoxModelImportForm): + tenant = CSVModelChoiceField( + label=_('Tenant'), + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + help_text=_('Assigned tenant') + ) class Meta: model = CircuitGroup - fields = ('name', 'tags') + fields = ('name', 'tenant', 'tags') diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index 448a68901..dd11743c6 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -233,10 +233,11 @@ class CircuitTerminationFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) -class CircuitGroupFilterForm(NetBoxModelFilterSetForm): +class CircuitGroupFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = CircuitGroup fieldsets = ( FieldSet('q', 'filter_id', 'tag'), + FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), ) selector_fields = ('filter_id', 'q', ) tag = TagFilterField(model) diff --git a/netbox/circuits/migrations/0044_circuitgroupassignment_circuitredundancygroup_and_more.py b/netbox/circuits/migrations/0044_circuitgroup_circuitgroupassignment_and_more.py similarity index 66% rename from netbox/circuits/migrations/0044_circuitgroupassignment_circuitredundancygroup_and_more.py rename to netbox/circuits/migrations/0044_circuitgroup_circuitgroupassignment_and_more.py index 5b437e6b6..e393ffcbd 100644 --- a/netbox/circuits/migrations/0044_circuitgroupassignment_circuitredundancygroup_and_more.py +++ b/netbox/circuits/migrations/0044_circuitgroup_circuitgroupassignment_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.7 on 2024-07-16 09:18 +# Generated by Django 5.0.7 on 2024-07-17 14:08 import django.db.models.deletion import taggit.managers @@ -11,17 +11,10 @@ class Migration(migrations.Migration): dependencies = [ ('circuits', '0043_circuittype_color'), ('extras', '0118_notifications'), + ('tenancy', '0015_contactassignment_rename_content_type'), ] operations = [ - migrations.CreateModel( - name='CircuitGroupAssignment', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), - ('priority', models.CharField(blank=True, max_length=50)), - ('circuit', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='circuits.circuit')), - ], - ), migrations.CreateModel( name='CircuitGroup', fields=[ @@ -36,18 +29,36 @@ class Migration(migrations.Migration): ('comments', models.TextField(blank=True)), ('name', models.CharField(max_length=100)), ('slug', models.SlugField(max_length=100)), - ('circuits', models.ManyToManyField(through='circuits.CircuitGroupAssignment', to='circuits.circuit')), ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ( + 'tenant', + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name='circuitgroups', + to='tenancy.tenant', + ), + ), ], options={ - 'verbose_name': 'Circuit redundancy group', - 'verbose_name_plural': 'Circuit redundancy group', + 'verbose_name': 'Circuit group', + 'verbose_name_plural': 'Circuit group', 'ordering': ('name', 'pk'), }, ), + migrations.CreateModel( + name='CircuitGroupAssignment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('priority', models.CharField(blank=True, max_length=50)), + ('circuit', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='circuits.circuit')), + ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='circuits.circuitgroup')), + ], + ), migrations.AddField( - model_name='circuitgroupassignment', - name='group', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='circuits.circuitgroup'), + model_name='circuitgroup', + name='circuits', + field=models.ManyToManyField(through='circuits.CircuitGroupAssignment', to='circuits.circuit'), ), ] diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index 6ab4c768f..bbb3cf1dc 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -164,12 +164,19 @@ class CircuitGroup(PrimaryModel): verbose_name=_('slug'), max_length=100 ) + tenant = models.ForeignKey( + to='tenancy.Tenant', + on_delete=models.PROTECT, + related_name='circuitgroups', + blank=True, + null=True + ) circuits = models.ManyToManyField(Circuit, through='CircuitGroupAssignment') class Meta: ordering = ('name', 'pk') # Name may be non-unique - verbose_name = _('Circuit redundancy group') - verbose_name_plural = _('Circuit redundancy group') + verbose_name = _('Circuit group') + verbose_name_plural = _('Circuit group') def get_absolute_url(self): return reverse('circuits:circuitgroup', args=[self.pk]) diff --git a/netbox/circuits/urls.py b/netbox/circuits/urls.py index 81bb6f725..b9387aa9b 100644 --- a/netbox/circuits/urls.py +++ b/netbox/circuits/urls.py @@ -59,7 +59,7 @@ urlpatterns = [ path('circuit-redundancy-groups/', views.CircuitGroupListView.as_view(), name='circuitgroup_list'), path('circuit-redundancy-groups/add/', views.CircuitGroupEditView.as_view(), name='circuitgroup_add'), path('circuit-redundancy-groups/import/', views.CircuitGroupBulkImportView.as_view(), name='circuitgroup_import'), - # path('circuit-redundancy-groups/edit/', views.CircuitGroupBulkEditView.as_view(), name='circuitgroup_bulk_edit'), + path('circuit-redundancy-groups/edit/', views.CircuitGroupBulkEditView.as_view(), name='circuitgroup_bulk_edit'), path('circuit-redundancy-groups/delete/', views.CircuitGroupBulkDeleteView.as_view(), name='circuitgroup_bulk_delete'), path('circuit-redundancy-groups//', include(get_model_urls('circuits', 'circuitgroup'))), ] diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index c9f89f926..f9a5db4a9 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -474,6 +474,13 @@ class CircuitGroupBulkImportView(generic.BulkImportView): model_form = forms.CircuitGroupImportForm +class CircuitGroupBulkEditView(generic.BulkEditView): + queryset = CircuitGroup.objects.all() + filterset = filtersets.CircuitGroupFilterSet + table = tables.CircuitGroupTable + form = forms.CircuitGroupBulkEditForm + + class CircuitGroupBulkDeleteView(generic.BulkDeleteView): queryset = CircuitGroup.objects.all() filterset = filtersets.CircuitGroupFilterSet