Просмотр исходного кода

Closes #815: Enable specifying terminations when bulk importing circuits

jeremystretch 3 лет назад
Родитель
Сommit
46e3883f19

+ 4 - 0
docs/release-notes/version-3.4.md

@@ -2,6 +2,10 @@
 
 ## v3.4.0 (FUTURE)
 
+### Enhancements
+
+* [#815](https://github.com/netbox-community/netbox/issues/815) - Enable specifying terminations when bulk importing circuits
+
 ### Bug Fixes
 
 * [#10946](https://github.com/netbox-community/netbox/issues/10946) - Fix AttributeError exception when viewing a device with a primary IP and no platform assigned

+ 25 - 1
netbox/circuits/forms/bulk_import.py

@@ -1,12 +1,16 @@
+from django import forms
+
 from circuits.choices import CircuitStatusChoices
 from circuits.models import *
+from dcim.models import Site
 from django.utils.translation import gettext as _
 from netbox.forms import NetBoxModelImportForm
 from tenancy.models import Tenant
-from utilities.forms import CSVChoiceField, CSVModelChoiceField, SlugField
+from utilities.forms import BootstrapMixin, CSVChoiceField, CSVModelChoiceField, SlugField
 
 __all__ = (
     'CircuitImportForm',
+    'CircuitTerminationImportForm',
     'CircuitTypeImportForm',
     'ProviderImportForm',
     'ProviderNetworkImportForm',
@@ -76,3 +80,23 @@ class CircuitImportForm(NetBoxModelImportForm):
             'cid', 'provider', 'type', 'status', 'tenant', 'install_date', 'termination_date', 'commit_rate',
             'description', 'comments', 'tags'
         ]
+
+
+class CircuitTerminationImportForm(BootstrapMixin, forms.ModelForm):
+    site = CSVModelChoiceField(
+        queryset=Site.objects.all(),
+        to_field_name='name',
+        required=False
+    )
+    provider_network = CSVModelChoiceField(
+        queryset=ProviderNetwork.objects.all(),
+        to_field_name='name',
+        required=False
+    )
+
+    class Meta:
+        model = CircuitTermination
+        fields = [
+            'circuit', 'term_side', 'site', 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id',
+            'pp_info', 'description',
+        ]

+ 7 - 0
netbox/circuits/tests/test_views.py

@@ -108,6 +108,13 @@ class CircuitTypeTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
 class CircuitTestCase(ViewTestCases.PrimaryObjectViewTestCase):
     model = Circuit
 
+    def setUp(self):
+        super().setUp()
+
+        self.add_permissions(
+            'circuits.add_circuittermination',
+        )
+
     @classmethod
     def setUpTestData(cls):
 

+ 10 - 0
netbox/circuits/views.py

@@ -233,6 +233,16 @@ class CircuitBulkImportView(generic.BulkImportView):
     queryset = Circuit.objects.all()
     model_form = forms.CircuitImportForm
     table = tables.CircuitTable
+    additional_permissions = [
+        'circuits.add_circuittermination',
+    ]
+    related_object_forms = {
+        'terminations': forms.CircuitTerminationImportForm,
+    }
+
+    def prep_related_object_data(self, parent, data):
+        data.update({'circuit': parent})
+        return data
 
 
 class CircuitBulkEditView(generic.BulkEditView):

+ 1 - 1
netbox/netbox/views/generic/bulk_views.py

@@ -458,7 +458,7 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView):
                         'return_url': self.get_return_url(request),
                     })
 
-            except ValidationError:
+            except (AbortTransaction, ValidationError):
                 clear_webhooks.send(sender=self)
 
             except (AbortRequest, PermissionsViolation) as e: