Leverage HTMX to semplify rendering of Circuit Termination Form

Associated with issue #11891
This commit is contained in:
Dillon Henschen 2023-05-22 01:07:57 -04:00
parent b64b19a3f4
commit dffb6fa329
7 changed files with 54 additions and 62 deletions

View File

@ -70,3 +70,13 @@ class CircuitTerminationPortSpeedChoices(ChoiceSet):
(1544, 'T1 (1.544 Mbps)'),
(2048, 'E1 (2.048 Mbps)'),
]
class CircuitTerminationTypeChoices(ChoiceSet):
SITE = 'site'
PROVIDER_NETWORK = 'provider_network'
CHOICES = [
(SITE, 'Site'),
(PROVIDER_NETWORK, 'Provider Network'),
]

View File

@ -1,13 +1,15 @@
from django import forms
from django.utils.translation import gettext as _
from circuits.choices import CircuitCommitRateChoices, CircuitTerminationPortSpeedChoices
from circuits.choices import CircuitCommitRateChoices, CircuitTerminationPortSpeedChoices, CircuitTerminationTypeChoices
from circuits.models import *
from dcim.models import Site
from ipam.models import ASN
from netbox.forms import NetBoxModelForm
from tenancy.forms import TenancyForm
from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField
from utilities.forms.widgets import DatePicker, NumberWithOptions
from utilities.forms.utils import get_field_value
from utilities.forms.widgets import DatePicker, HTMXSelect, NumberWithOptions
__all__ = (
'CircuitForm',
@ -139,11 +141,21 @@ class CircuitTerminationForm(NetBoxModelForm):
selector=True
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
termination_type = get_field_value(self, 'termination_type')
if termination_type != CircuitTerminationTypeChoices.SITE:
del self.fields['site']
if termination_type != CircuitTerminationTypeChoices.PROVIDER_NETWORK:
del self.fields['provider_network']
class Meta:
model = CircuitTermination
fields = [
'circuit', 'term_side', 'site', 'provider_network', 'mark_connected', 'port_speed', 'upstream_speed',
'xconnect_id', 'pp_info', 'description', 'tags',
'circuit', 'term_side', 'termination_type', 'site', 'provider_network', 'mark_connected', 'port_speed',
'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'tags',
]
widgets = {
'port_speed': NumberWithOptions(
@ -152,4 +164,8 @@ class CircuitTerminationForm(NetBoxModelForm):
'upstream_speed': NumberWithOptions(
options=CircuitTerminationPortSpeedChoices
),
'termination_type': HTMXSelect(),
}
labels = {
'termination_type': 'Termination Type',
}

View File

@ -0,0 +1,18 @@
# Generated by Django 4.1.9 on 2023-05-22 04:54
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('circuits', '0042_provideraccount'),
]
operations = [
migrations.AddField(
model_name='circuittermination',
name='termination_type',
field=models.CharField(default='site', max_length=50),
),
]

View File

@ -164,6 +164,11 @@ class CircuitTermination(
choices=CircuitTerminationSideChoices,
verbose_name='Termination'
)
termination_type = models.CharField(
max_length=50,
choices=CircuitTerminationTypeChoices,
default=CircuitTerminationTypeChoices.SITE
)
site = models.ForeignKey(
to='dcim.Site',
on_delete=models.PROTECT,

View File

@ -323,6 +323,7 @@ class CircuitTerminationTestCase(
cls.form_data = {
'circuit': circuits[2].pk,
'term_side': 'A',
'termination_type': CircuitTerminationTypeChoices.SITE,
'site': sites[2].pk,
'description': 'New description',
}

View File

@ -412,7 +412,6 @@ class CircuitContactsView(ObjectContactsView):
class CircuitTerminationEditView(generic.ObjectEditView):
queryset = CircuitTermination.objects.all()
form = forms.CircuitTerminationForm
template_name = 'circuits/circuittermination_edit.html'
@register_model_view(CircuitTermination, 'delete')

View File

@ -1,57 +0,0 @@
{% extends 'generic/object_edit.html' %}
{% load static %}
{% load form_helpers %}
{% block form %}
<div class="field-group my-5">
<div class="row mb-2">
<h5 class="offset-sm-3">Circuit Termination</h5>
</div>
{% render_field form.circuit %}
{% render_field form.term_side %}
{% render_field form.tags %}
{% render_field form.mark_connected %}
{% with providernetwork_tab_active=form.initial.provider_network %}
<div class="row mb-2">
<div class="offset-sm-3">
<ul class="nav nav-pills" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link{% if not providernetwork_tab_active %} active{% endif %}" role="tab" type="button" data-bs-target="#site" data-bs-toggle="tab">Site</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link{% if providernetwork_tab_active %} active{% endif %}" role="tab" type="button" data-bs-toggle="tab" data-bs-target="#providernetwork">Provider Network</button>
</li>
</ul>
</div>
</div>
<div class="tab-content p-0 border-0">
<div class="tab-pane{% if not providernetwork_tab_active %} active{% endif %}" id="site">
{% render_field form.site %}
</div>
<div class="tab-pane{% if providernetwork_tab_active %} active{% endif %}" id="providernetwork">
{% render_field form.provider_network %}
</div>
</div>
{% endwith %}
</div>
<div class="field-group my-5">
<div class="row mb-2">
<h5 class="offset-sm-3">Termination Details</h5>
</div>
{% render_field form.port_speed %}
{% render_field form.upstream_speed %}
{% render_field form.xconnect_id %}
{% render_field form.pp_info %}
{% render_field form.description %}
</div>
{% if form.custom_fields %}
<div class="field-group mb-5">
<div class="row mb-2">
<h5 class="offset-sm-3">Custom Fields</h5>
</div>
{% render_custom_fields form %}
</div>
{% endif %}
{% endblock %}