From 014a5d10d190026cd4030669706af7f089e55dfc Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 17 Apr 2023 16:37:02 -0400 Subject: [PATCH] Closes #12187: Add button to download rendered config from UI --- netbox/dcim/views.py | 19 +++++++++++++++++++ .../templates/dcim/device/render_config.html | 8 ++++++++ 2 files changed, 27 insertions(+) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index a6920f46e..5b762be68 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -6,6 +6,7 @@ from django.core.paginator import EmptyPage, PageNotAnInteger from django.db import transaction from django.db.models import Prefetch from django.forms import ModelMultipleChoiceField, MultipleHiddenInput, modelformset_factory +from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.html import escape @@ -2012,6 +2013,24 @@ class DeviceRenderConfigView(generic.ObjectView): weight=2100 ) + def get(self, request, **kwargs): + instance = self.get_object(**kwargs) + context = self.get_extra_context(request, instance) + + # If a direct export has been requested, return the rendered template content as a + # downloadable file. + if request.GET.get('export'): + response = HttpResponse(context['rendered_config'], content_type='text') + filename = f"{instance.name or 'config'}.txt" + response['Content-Disposition'] = f'attachment; filename="{filename}"' + return response + + return render(request, self.get_template_name(), { + 'object': instance, + 'tab': self.tab, + **context, + }) + def get_extra_context(self, request, instance): # Compile context data context_data = instance.get_config_context() diff --git a/netbox/templates/dcim/device/render_config.html b/netbox/templates/dcim/device/render_config.html index bc5642e2e..b6e16701f 100644 --- a/netbox/templates/dcim/device/render_config.html +++ b/netbox/templates/dcim/device/render_config.html @@ -36,6 +36,14 @@
+
+ +
Rendered Config
+
{% if config_template %}
{{ rendered_config }}
{% else %}