Move child ASNs to a tabbed view

This commit is contained in:
jeremystretch 2023-02-26 14:26:03 -05:00
parent 450f22755f
commit 67569fe264
6 changed files with 69 additions and 17 deletions

View File

@ -61,6 +61,12 @@ class ASNRange(OrganizationalModel):
if self.end <= self.start:
raise ValidationError(f"Starting ASN ({self.start}) must be lower than ending ASN ({self.end}).")
def get_child_asns(self):
return ASN.objects.filter(
asn__gte=self.start,
asn__lte=self.end
)
def get_available_asns(self):
"""
Return all available ASNs within this range.

View File

@ -1,7 +1,7 @@
import netaddr
from .constants import *
from .models import Prefix, VLAN
from .models import ASN, Prefix, VLAN
def add_requested_prefixes(parent, prefix_list, show_available=True, show_assigned=True):

View File

@ -211,14 +211,26 @@ class ASNRangeListView(generic.ObjectListView):
class ASNRangeView(generic.ObjectView):
queryset = ASNRange.objects.all()
def get_extra_context(self, request, instance):
related_models = (
(ASN.objects.restrict(request.user, 'view').filter(range=instance), 'range_id'),
)
return {
'related_models': related_models,
}
@register_model_view(ASNRange, 'asns')
class ASNRangeASNsView(generic.ObjectChildrenView):
queryset = ASNRange.objects.all()
child_model = ASN
table = tables.ASNTable
filterset = filtersets.ASNFilterSet
template_name = 'ipam/asnrange/asns.html'
tab = ViewTab(
label=_('ASNs'),
badge=lambda x: x.get_child_asns().count(),
permission='ipam.view_asns',
weight=500
)
def get_children(self, request, parent):
return parent.get_child_asns().restrict(request.user, 'view').annotate(
site_count=count_related(Site, 'asns'),
provider_count=count_related(Provider, 'asns')
)
@register_model_view(ASNRange, 'edit')

View File

@ -1,4 +1,4 @@
{% extends 'generic/object.html' %}
{% extends 'ipam/asnrange/base.html' %}
{% load buttons %}
{% load helpers %}
{% load plugins %}
@ -45,20 +45,12 @@
{% include 'inc/panels/tags.html' %}
</div>
<div class="col col-md-6">
{% include 'inc/panels/related_objects.html' %}
{% include 'inc/panels/custom_fields.html' %}
{% plugin_right_page object %}
</div>
</div>
<div class="row">
<div class="col col-md-12">
<div class="card">
<h5 class="card-header">ASNs</h5>
<div class="card-body htmx-container table-responsive"
hx-get="{% url 'ipam:asn_list' %}?range_id={{ object.pk }}"
hx-trigger="load"
></div>
</div>
{% plugin_full_width_page object %}
</div>
</div>

View File

@ -0,0 +1,36 @@
{% extends 'ipam/asnrange/base.html' %}
{% load helpers %}
{% block content %}
{% include 'inc/table_controls_htmx.html' with table_modal="ASNTable_config" %}
<form method="post">
{% csrf_token %}
<div class="card">
<div class="card-body htmx-container table-responsive" id="object_list">
{% include 'htmx/table.html' %}
</div>
</div>
<div class="noprint bulk-buttons">
<div class="bulk-button-group">
{% if 'bulk_edit' in actions %}
<button type="submit" name="_edit" formaction="{% url 'ipam:asn_bulk_edit' %}?return_url={% url 'ipam:asnrange_asns' pk=object.pk %}" class="btn btn-warning btn-sm">
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
</button>
{% endif %}
{% if 'bulk_delete' in actions %}
<button type="submit" name="_delete" formaction="{% url 'ipam:asn_bulk_delete' %}?return_url={% url 'ipam:asnrange_asns' pk=object.pk %}" class="btn btn-danger btn-sm">
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
</button>
{% endif %}
</div>
</div>
</form>
{% endblock %}
{% block modals %}
{{ block.super }}
{% table_config_form table %}
{% endblock modals %}

View File

@ -0,0 +1,6 @@
{% extends 'generic/object.html' %}
{% block breadcrumbs %}
{{ block.super }}
<li class="breadcrumb-item"><a href="{% url 'ipam:asnrange_list' %}?rir_id={{ object.rir.pk }}">{{ object.rir }}</a></li>
{% endblock breadcrumbs %}