Closes #815: Enable specifying terminations when bulk importing circuits

This commit is contained in:
jeremystretch 2022-11-18 15:22:24 -05:00
parent ae11419045
commit 46e3883f19
5 changed files with 47 additions and 2 deletions

View File

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

View File

@ -1,12 +1,16 @@
from django import forms
from circuits.choices import CircuitStatusChoices from circuits.choices import CircuitStatusChoices
from circuits.models import * from circuits.models import *
from dcim.models import Site
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from netbox.forms import NetBoxModelImportForm from netbox.forms import NetBoxModelImportForm
from tenancy.models import Tenant from tenancy.models import Tenant
from utilities.forms import CSVChoiceField, CSVModelChoiceField, SlugField from utilities.forms import BootstrapMixin, CSVChoiceField, CSVModelChoiceField, SlugField
__all__ = ( __all__ = (
'CircuitImportForm', 'CircuitImportForm',
'CircuitTerminationImportForm',
'CircuitTypeImportForm', 'CircuitTypeImportForm',
'ProviderImportForm', 'ProviderImportForm',
'ProviderNetworkImportForm', 'ProviderNetworkImportForm',
@ -76,3 +80,23 @@ class CircuitImportForm(NetBoxModelImportForm):
'cid', 'provider', 'type', 'status', 'tenant', 'install_date', 'termination_date', 'commit_rate', 'cid', 'provider', 'type', 'status', 'tenant', 'install_date', 'termination_date', 'commit_rate',
'description', 'comments', 'tags' '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',
]

View File

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

View File

@ -233,6 +233,16 @@ class CircuitBulkImportView(generic.BulkImportView):
queryset = Circuit.objects.all() queryset = Circuit.objects.all()
model_form = forms.CircuitImportForm model_form = forms.CircuitImportForm
table = tables.CircuitTable 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): class CircuitBulkEditView(generic.BulkEditView):

View File

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