mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-26 17:26:10 -06:00
Move child ASNs to a tabbed view
This commit is contained in:
parent
450f22755f
commit
67569fe264
@ -61,6 +61,12 @@ class ASNRange(OrganizationalModel):
|
|||||||
if self.end <= self.start:
|
if self.end <= self.start:
|
||||||
raise ValidationError(f"Starting ASN ({self.start}) must be lower than ending ASN ({self.end}).")
|
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):
|
def get_available_asns(self):
|
||||||
"""
|
"""
|
||||||
Return all available ASNs within this range.
|
Return all available ASNs within this range.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import netaddr
|
import netaddr
|
||||||
|
|
||||||
from .constants import *
|
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):
|
def add_requested_prefixes(parent, prefix_list, show_available=True, show_assigned=True):
|
||||||
|
@ -211,14 +211,26 @@ class ASNRangeListView(generic.ObjectListView):
|
|||||||
class ASNRangeView(generic.ObjectView):
|
class ASNRangeView(generic.ObjectView):
|
||||||
queryset = ASNRange.objects.all()
|
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 {
|
@register_model_view(ASNRange, 'asns')
|
||||||
'related_models': related_models,
|
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')
|
@register_model_view(ASNRange, 'edit')
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{% extends 'generic/object.html' %}
|
{% extends 'ipam/asnrange/base.html' %}
|
||||||
{% load buttons %}
|
{% load buttons %}
|
||||||
{% load helpers %}
|
{% load helpers %}
|
||||||
{% load plugins %}
|
{% load plugins %}
|
||||||
@ -45,20 +45,12 @@
|
|||||||
{% include 'inc/panels/tags.html' %}
|
{% include 'inc/panels/tags.html' %}
|
||||||
</div>
|
</div>
|
||||||
<div class="col col-md-6">
|
<div class="col col-md-6">
|
||||||
{% include 'inc/panels/related_objects.html' %}
|
|
||||||
{% include 'inc/panels/custom_fields.html' %}
|
{% include 'inc/panels/custom_fields.html' %}
|
||||||
{% plugin_right_page object %}
|
{% plugin_right_page object %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col col-md-12">
|
<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 %}
|
{% plugin_full_width_page object %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
36
netbox/templates/ipam/asnrange/asns.html
Normal file
36
netbox/templates/ipam/asnrange/asns.html
Normal 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 %}
|
6
netbox/templates/ipam/asnrange/base.html
Normal file
6
netbox/templates/ipam/asnrange/base.html
Normal 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 %}
|
Loading…
Reference in New Issue
Block a user