new file: netbox_dns_bridge/filtersets.py
new file: netbox_dns_bridge/forms.py new file: netbox_dns_bridge/tables.py modified: netbox_dns_bridge/templates/netbox_dns_bridge/catz_overview.html modified: netbox_dns_bridge/views.py Change catz table to ObjectListView
This commit is contained in:
1 parent
9f71ff7332
commit
ddef4965d6
5 files changed
+101
-86
No files matched your search
@@ -0,0 +1,29 @@
|
|||||||
|
import django_filters
|
||||||
|
from django.db.models import Q
|
||||||
|
|
||||||
|
import netbox_dns.models
|
||||||
|
from netbox.filtersets import NetBoxModelFilterSet
|
||||||
|
from netbox_dns.choices import ZoneStatusChoices
|
||||||
|
|
||||||
|
|
||||||
|
class ZoneFilterSet(NetBoxModelFilterSet):
|
||||||
|
view = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
field_name="view",
|
||||||
|
queryset=netbox_dns.models.View.objects.all(),
|
||||||
|
)
|
||||||
|
status = django_filters.MultipleChoiceFilter(
|
||||||
|
choices=ZoneStatusChoices,
|
||||||
|
null_value=None,
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = netbox_dns.models.Zone
|
||||||
|
fields = ("id", "name", "view", "status", "catz_identifier")
|
||||||
|
|
||||||
|
def search(self, queryset, name, value):
|
||||||
|
if not value.strip():
|
||||||
|
return queryset
|
||||||
|
return queryset.filter(
|
||||||
|
Q(name__icontains=value)
|
||||||
|
| Q(catz_identifier__name__icontains=value)
|
||||||
|
)
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
from django import forms
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
import netbox_dns.models
|
||||||
|
from netbox.forms import NetBoxModelFilterSetForm
|
||||||
|
from netbox_dns.choices import ZoneStatusChoices
|
||||||
|
from utilities.forms.fields import DynamicModelMultipleChoiceField
|
||||||
|
|
||||||
|
|
||||||
|
class CatalogZoneFilterForm(NetBoxModelFilterSetForm):
|
||||||
|
model = netbox_dns.models.Zone
|
||||||
|
|
||||||
|
q = forms.CharField(required=False, label=_("Search"))
|
||||||
|
view = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=netbox_dns.models.View.objects.all(),
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
|
status = forms.MultipleChoiceField(
|
||||||
|
choices=ZoneStatusChoices,
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
import django_tables2 as tables
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
import netbox_dns.models
|
||||||
|
from netbox.tables import NetBoxTable
|
||||||
|
|
||||||
|
|
||||||
|
class CatalogZoneTable(NetBoxTable):
|
||||||
|
name = tables.Column(linkify=True)
|
||||||
|
view = tables.Column(
|
||||||
|
accessor="view__name",
|
||||||
|
verbose_name=_("View"),
|
||||||
|
)
|
||||||
|
status = tables.Column(verbose_name=_("Status"))
|
||||||
|
catz_identifier = tables.Column(
|
||||||
|
accessor="catz_identifier__name",
|
||||||
|
verbose_name=_("Catalog Zone Identifier"),
|
||||||
|
default="—",
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta(NetBoxTable.Meta):
|
||||||
|
model = netbox_dns.models.Zone
|
||||||
|
fields = ("name", "view", "status", "catz_identifier")
|
||||||
|
default_columns = ("name", "view", "status", "catz_identifier")
|
||||||
@@ -1,68 +1,22 @@
|
|||||||
{% extends 'base/layout.html' %}
|
{% extends 'generic/object_list.html' %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
{% block title %}Catalog Zone Info{% endblock %}
|
{% block title %}{% trans "Catalog Zone Info" %}{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row">
|
<div class="row mb-3">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
|
<div class="card">
|
||||||
<div class="card mb-3">
|
<h5 class="card-header">{% trans "Catalog Zone SOA Serial Number" %}</h5>
|
||||||
<h5 class="card-header">Catalog Zone SOA Serial Number</h5>
|
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<table class="table table-striped">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Value</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% if soa_serial is not None %}
|
{% if soa_serial is not None %}
|
||||||
<tr>
|
<span>{{ soa_serial }}</span>
|
||||||
<td>{{ soa_serial }}</td>
|
|
||||||
</tr>
|
|
||||||
{% else %}
|
{% else %}
|
||||||
<tr><td class="text-muted">Not yet initialized.</td></tr>
|
<span class="text-muted">{% trans "Not yet initialized." %}</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% for view_name, rows in zones_grouped.items %}
|
|
||||||
<div class="card mb-3">
|
|
||||||
<h5 class="card-header">Zone Identifiers | {{ view_name }}</h5>
|
|
||||||
<div class="card-body">
|
|
||||||
<table class="table table-striped">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Zone</th>
|
|
||||||
<th>Active</th>
|
|
||||||
<th>Catalog Zone Identifier</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for z in rows %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ z.name }}</td>
|
|
||||||
<td>{{ z.active|yesno:"Yes,No" }}</td>
|
|
||||||
<td>{{ z.catz_identifier|default:"—" }}</td>
|
|
||||||
</tr>
|
|
||||||
{% empty %}
|
|
||||||
<tr><td colspan="3" class="text-muted">No zones in this view.</td></tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% empty %}
|
|
||||||
<div class="card mb-3">
|
|
||||||
<h5 class="card-header">Zone Identifiers</h5>
|
|
||||||
<div class="card-body">
|
|
||||||
<p class="text-muted">No zones found.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{{ block.super }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
+18
-31
@@ -1,50 +1,37 @@
|
|||||||
from collections import OrderedDict
|
|
||||||
|
|
||||||
from django.contrib.auth.decorators import user_passes_test
|
from django.contrib.auth.decorators import user_passes_test
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.utils.decorators import method_decorator
|
from django.utils.decorators import method_decorator
|
||||||
from django.views import View
|
from django.views import View
|
||||||
|
|
||||||
|
import netbox_dns.models
|
||||||
|
from netbox.views.generic import ObjectListView
|
||||||
|
|
||||||
|
from .filtersets import ZoneFilterSet
|
||||||
|
from .forms import CatalogZoneFilterForm
|
||||||
from .models import IntegerKeyValueSetting, SeenTransferClients
|
from .models import IntegerKeyValueSetting, SeenTransferClients
|
||||||
|
from .tables import CatalogZoneTable
|
||||||
|
|
||||||
|
|
||||||
@method_decorator(
|
@method_decorator(
|
||||||
user_passes_test(lambda u: u.is_superuser), name="dispatch"
|
user_passes_test(lambda u: u.is_superuser), name="dispatch"
|
||||||
)
|
)
|
||||||
class CatzOverviewView(View):
|
class CatzOverviewView(ObjectListView):
|
||||||
|
queryset = netbox_dns.models.Zone.objects.select_related(
|
||||||
|
"view", "catz_identifier"
|
||||||
|
).order_by("view__name", "name")
|
||||||
|
table = CatalogZoneTable
|
||||||
|
filterset = ZoneFilterSet
|
||||||
|
filterset_form = CatalogZoneFilterForm
|
||||||
template_name = "netbox_dns_bridge/catz_overview.html"
|
template_name = "netbox_dns_bridge/catz_overview.html"
|
||||||
|
actions = ()
|
||||||
|
|
||||||
def get(self, request):
|
def get_extra_context(self, request):
|
||||||
import netbox_dns.models
|
context = super().get_extra_context(request)
|
||||||
|
|
||||||
soa_serial_obj = IntegerKeyValueSetting.objects.filter(
|
soa_serial_obj = IntegerKeyValueSetting.objects.filter(
|
||||||
key="catalog-zone-soa-serial"
|
key="catalog-zone-soa-serial"
|
||||||
).first()
|
).first()
|
||||||
soa_serial = soa_serial_obj.value if soa_serial_obj else None
|
context["soa_serial"] = soa_serial_obj.value if soa_serial_obj else None
|
||||||
|
return context
|
||||||
zones_grouped = OrderedDict()
|
|
||||||
for z in netbox_dns.models.Zone.objects.select_related(
|
|
||||||
"view", "catz_identifier"
|
|
||||||
).order_by("view__name", "name"):
|
|
||||||
view_name = z.view.name if z.view else ""
|
|
||||||
view_display = view_name[0].upper() + view_name[1:] if view_name else ""
|
|
||||||
try:
|
|
||||||
catz_identifier = z.catz_identifier.name
|
|
||||||
except netbox_dns.models.Zone.catz_identifier.RelatedObjectDoesNotExist:
|
|
||||||
catz_identifier = None
|
|
||||||
zones_grouped.setdefault(view_display, []).append(
|
|
||||||
{
|
|
||||||
"name": z.name,
|
|
||||||
"active": z.active,
|
|
||||||
"catz_identifier": catz_identifier,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
context = {
|
|
||||||
"soa_serial": soa_serial,
|
|
||||||
"zones_grouped": zones_grouped,
|
|
||||||
}
|
|
||||||
return render(request, self.template_name, context)
|
|
||||||
|
|
||||||
|
|
||||||
@method_decorator(
|
@method_decorator(
|
||||||
|
|||||||
Reference in new issue
Block a user