From 4080c16dd34f2e8d48a4115700fde092ca367e24 Mon Sep 17 00:00:00 2001 From: rdujardin Date: Thu, 28 Jul 2016 12:38:49 +0200 Subject: [PATCH] Move bind exports to specific views with download links --- netbox/dns/urls.py | 5 +- netbox/dns/views.py | 82 +++++++++++++------ netbox/ipam/views.py | 6 -- netbox/templates/_base.html | 3 +- .../{full_reverse.html => bind_export.html} | 22 ++++- netbox/templates/dns/zone.html | 36 -------- netbox/templates/ipam/prefix.html | 44 +--------- 7 files changed, 84 insertions(+), 114 deletions(-) rename netbox/templates/dns/{full_reverse.html => bind_export.html} (65%) diff --git a/netbox/dns/urls.py b/netbox/dns/urls.py index f836bc831..98e38fcc8 100644 --- a/netbox/dns/urls.py +++ b/netbox/dns/urls.py @@ -24,7 +24,8 @@ urlpatterns = [ url(r'^records/(?P\d+)/edit/$', views.RecordEditView.as_view(), name='record_edit'), url(r'^records/(?P\d+)/delete/$', views.RecordDeleteView.as_view(), name='record_delete'), - # Full Reverse - url(r'^reverse/$', views.full_reverse, name='full_reverse'), + # BIND Exports + url(r'^bind/forward/$', views.full_forward, name='full_forward'), + url(r'^bind/reverse/$', views.full_reverse, name='full_reverse'), ] diff --git a/netbox/dns/views.py b/netbox/dns/views.py index ca4442ee1..f1e79b092 100644 --- a/netbox/dns/views.py +++ b/netbox/dns/views.py @@ -15,6 +15,8 @@ from . import filters, forms, tables from .models import Zone, Record from .tables import RecordZoneTable +import StringIO, zipfile, time + # # Zones # @@ -32,29 +34,17 @@ def zone(request, pk): zone = get_object_or_404(Zone.objects.all(), pk=pk) records = Record.objects.filter(zone=zone) record_count = len(records) - bind_export = zone.to_bind(records) # DNS records dns_records = Record.objects.filter(zone=zone) dns_records_table = RecordZoneTable(dns_records) - if request.GET.get('bind_export'): - response = HttpResponse( - bind_export, - content_type='text/plain' - ) - response['Content-Disposition'] = 'attachment; filename="netbox_{}.txt"'\ - .format(zone.name) - return response - - else: - return render(request, 'dns/zone.html', { - 'zone': zone, - 'records': records, - 'record_count': record_count, - 'dns_records_table': dns_records_table, - 'bind_export': bind_export, - }) + return render(request, 'dns/zone.html', { + 'zone': zone, + 'records': records, + 'record_count': record_count, + 'dns_records_table': dns_records_table, + }) class ZoneEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'dns.change_zone' @@ -167,9 +157,57 @@ class RecordBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): default_redirect_url = 'dns:record_list' # -# Full Reverse +# BIND Exports # +def bind_export(request, zones_list, context): + download = request.GET.get('download') + if download: + if download == 'all': + zbuf = StringIO.StringIO() + zfile = zipfile.ZipFile(zbuf, mode='w') + temp = [] + for z in zones_list: + temp.append(StringIO.StringIO()) + temp[len(temp)-1].write(z['content']) + zfile.writestr(z['id'],str(temp[len(temp)-1].getvalue())) + zfile.close() + response = HttpResponse( + zbuf.getvalue(), + content_type = 'application/zip' + ) + response['Content-Disposition'] = 'attachment; filename="netbox_dns_{}_{}.zip"'.format(context, str(int(time.time()))) + return response + else: + response = HttpResponse( + zones_list[int(download)]['content'], + content_type='text/plain' + ) + response['Content-Disposition'] = 'attachment; filename="{}"'.format(zones_list[int(download)]['id']) + return response + + else: + return render(request, 'dns/bind_export.html', { + 'context': context[0].upper() + context[1:], + 'zones': zones_list, + 'bind_export_count': len(zones_list), + }) + +def full_forward(request): + + zones = Zone.objects.all() + + zones_list = [] + for z in zones: + records = Record.objects.filter(zone=z) + zones_list.append({ + 'num': len(zones_list), + 'id': z.name, + 'content': z.to_bind(records) + }) + + return bind_export(request, zones_list, 'forward') + def full_reverse(request): zones = {} @@ -191,7 +229,5 @@ def full_reverse(request): 'content': zc, }) - return render(request, 'dns/full_reverse.html', { - 'zones': zones_list, - 'bind_export_count': len(zones_list), - }) + return bind_export(request, zones_list, 'reverse') + diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index e7ecf0ba6..9a23ac16e 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -281,10 +281,6 @@ def prefix(request, pk): # Count child IP addresses ipaddress_count = child_ip.count() - # BIND reverse export - bind_export = prefix.to_bind(child_ip) - bind_export_count = len(bind_export) - # Parent prefixes table parent_prefixes = Prefix.objects.filter(vrf=prefix.vrf, prefix__net_contains=str(prefix.prefix))\ .select_related('site', 'role').annotate_depth() @@ -313,8 +309,6 @@ def prefix(request, pk): 'parent_prefix_table': parent_prefix_table, 'child_prefix_table': child_prefix_table, 'duplicate_prefix_table': duplicate_prefix_table, - 'bind_export': bind_export, - 'bind_export_count': bind_export_count, }) diff --git a/netbox/templates/_base.html b/netbox/templates/_base.html index e4c976e1f..581cdf031 100644 --- a/netbox/templates/_base.html +++ b/netbox/templates/_base.html @@ -171,7 +171,8 @@
  • Import zones
  • {% endif %}
  • -
  • Full Reverse Export
  • +
  • BIND Export Forward
  • +
  • BIND Export Reverse