فهرست منبع

Closes #12187: Add button to download rendered config from UI

jeremystretch 2 سال پیش
والد
کامیت
014a5d10d1
2فایلهای تغییر یافته به همراه27 افزوده شده و 0 حذف شده
  1. 19 0
      netbox/dcim/views.py
  2. 8 0
      netbox/templates/dcim/device/render_config.html

+ 19 - 0
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()

+ 8 - 0
netbox/templates/dcim/device/render_config.html

@@ -36,6 +36,14 @@
   <div class="row">
     <div class="col">
       <div class="card">
+        <div class="card-header">
+          <div class="float-end">
+            <a href="?export=True" class="btn btn-sm btn-primary" role="button">
+              <i class="mdi mdi-download" aria-hidden="true"></i> Download
+            </a>
+          </div>
+          <h5>Rendered Config</h5>
+        </div>
         {% if config_template %}
           <pre class="card-body">{{ rendered_config }}</pre>
         {% else %}