add "Location" to CircuitTermination

model and form
This commit is contained in:
George Cox 2022-06-25 21:48:10 +01:00
parent 4315c4697c
commit f193dd4281
4 changed files with 22 additions and 5 deletions

View File

@ -9,7 +9,7 @@
IF YOUR PULL REQUEST DOES NOT REFERENCE AN ACCEPTED BUG REPORT OR IF YOUR PULL REQUEST DOES NOT REFERENCE AN ACCEPTED BUG REPORT OR
FEATURE REQUEST, IT WILL BE MARKED AS INVALID AND CLOSED. FEATURE REQUEST, IT WILL BE MARKED AS INVALID AND CLOSED.
--> -->
### Fixes: <ISSUE NUMBER GOES HERE> ### Fixes: 9604
<!-- <!--
Please include a summary of the proposed changes below. Please include a summary of the proposed changes below.
--> -->

View File

@ -2,7 +2,7 @@ from django import forms
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from circuits.models import * from circuits.models import *
from dcim.models import Region, Site, SiteGroup from dcim.models import Location, Region, Site, SiteGroup
from ipam.models import ASN from ipam.models import ASN
from netbox.forms import NetBoxModelForm from netbox.forms import NetBoxModelForm
from tenancy.forms import TenancyForm from tenancy.forms import TenancyForm
@ -150,6 +150,14 @@ class CircuitTerminationForm(BootstrapMixin, forms.ModelForm):
}, },
required=False required=False
) )
location = DynamicModelChoiceField(
queryset=Location.objects.all(),
query_params={
'region_id': '$region',
'site_id': '$site',
},
required=False
)
provider_network = DynamicModelChoiceField( provider_network = DynamicModelChoiceField(
queryset=ProviderNetwork.objects.all(), queryset=ProviderNetwork.objects.all(),
required=False required=False
@ -158,7 +166,7 @@ class CircuitTerminationForm(BootstrapMixin, forms.ModelForm):
class Meta: class Meta:
model = CircuitTermination model = CircuitTermination
fields = [ fields = [
'provider', 'circuit', 'term_side', 'region', 'site_group', 'site', 'provider_network', 'mark_connected', 'provider', 'circuit', 'term_side', 'region', 'site_group', 'site', 'location', 'provider_network', 'mark_connected',
'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description',
] ]
help_texts = { help_texts = {

View File

@ -154,6 +154,13 @@ class CircuitTermination(WebhooksMixin, ChangeLoggedModel, LinkTermination):
blank=True, blank=True,
null=True null=True
) )
location = models.ForeignKey(
to='dcim.Location',
on_delete=models.PROTECT,
related_name='circuit_terminations',
blank=True,
null=True
)
provider_network = models.ForeignKey( provider_network = models.ForeignKey(
to='circuits.ProviderNetwork', to='circuits.ProviderNetwork',
on_delete=models.PROTECT, on_delete=models.PROTECT,
@ -204,9 +211,10 @@ class CircuitTermination(WebhooksMixin, ChangeLoggedModel, LinkTermination):
# Must define either site *or* provider network # Must define either site *or* provider network
if self.site is None and self.provider_network is None: if self.site is None and self.provider_network is None:
raise ValidationError("A circuit termination must attach to either a site or a provider network.") raise ValidationError("A circuit termination must attach to either a site [+optionally a location] or a provider network.")
if self.site and self.provider_network: if self.site and self.provider_network:
raise ValidationError("A circuit termination cannot attach to both a site and a provider network.") raise ValidationError("A circuit termination cannot attach to both a site [+optionally a location] and a provider network.")
def to_objectchange(self, action): def to_objectchange(self, action):
objectchange = super().to_objectchange(action) objectchange = super().to_objectchange(action)

View File

@ -29,6 +29,7 @@
{% render_field form.region %} {% render_field form.region %}
{% render_field form.site_group %} {% render_field form.site_group %}
{% render_field form.site %} {% render_field form.site %}
{% render_field form.location %}
</div> </div>
<div class="tab-pane{% if providernetwork_tab_active %} active{% endif %}" id="providernetwork"> <div class="tab-pane{% if providernetwork_tab_active %} active{% endif %}" id="providernetwork">
{% render_field form.provider_network %} {% render_field form.provider_network %}