Browse Source

Add FileVar for file uploads

Jeremy Stretch 6 years ago
parent
commit
de770faf6a
3 changed files with 27 additions and 13 deletions
  1. 19 7
      netbox/extras/scripts.py
  2. 2 2
      netbox/extras/views.py
  3. 6 4
      netbox/templates/extras/script.html

+ 19 - 7
netbox/extras/scripts.py

@@ -21,13 +21,14 @@ from .forms import ScriptForm
 
 
 
 
 __all__ = [
 __all__ = [
+    'BooleanVar',
+    'FileVar',
+    'IntegerVar',
+    'IPNetworkVar',
+    'ObjectVar',
     'Script',
     'Script',
     'StringVar',
     'StringVar',
     'TextVar',
     'TextVar',
-    'IntegerVar',
-    'BooleanVar',
-    'ObjectVar',
-    'IPNetworkVar',
 ]
 ]
 
 
 
 
@@ -145,6 +146,13 @@ class ObjectVar(ScriptVariable):
             self.form_field = TreeNodeChoiceField
             self.form_field = TreeNodeChoiceField
 
 
 
 
+class FileVar(ScriptVariable):
+    """
+    An uploaded file.
+    """
+    form_field = forms.FileField
+
+
 class IPNetworkVar(ScriptVariable):
 class IPNetworkVar(ScriptVariable):
     """
     """
     An IPv4 or IPv6 prefix.
     An IPv4 or IPv6 prefix.
@@ -193,12 +201,12 @@ class Script:
     def run(self, data):
     def run(self, data):
         raise NotImplementedError("The script must define a run() method.")
         raise NotImplementedError("The script must define a run() method.")
 
 
-    def as_form(self, data=None):
+    def as_form(self, data=None, files=None):
         """
         """
         Return a Django form suitable for populating the context data required to run this Script.
         Return a Django form suitable for populating the context data required to run this Script.
         """
         """
         vars = self._get_vars()
         vars = self._get_vars()
-        form = ScriptForm(vars, data)
+        form = ScriptForm(vars, data, files)
 
 
         return form
         return form
 
 
@@ -260,7 +268,7 @@ def is_variable(obj):
     return isinstance(obj, ScriptVariable)
     return isinstance(obj, ScriptVariable)
 
 
 
 
-def run_script(script, data, commit=True):
+def run_script(script, data, files, commit=True):
     """
     """
     A wrapper for calling Script.run(). This performs error handling and provides a hook for committing changes. It
     A wrapper for calling Script.run(). This performs error handling and provides a hook for committing changes. It
     exists outside of the Script class to ensure it cannot be overridden by a script author.
     exists outside of the Script class to ensure it cannot be overridden by a script author.
@@ -269,6 +277,10 @@ def run_script(script, data, commit=True):
     start_time = None
     start_time = None
     end_time = None
     end_time = None
 
 
+    # Add files to form data
+    for field_name, fileobj in files.items():
+        data[field_name] = fileobj
+
     try:
     try:
         with transaction.atomic():
         with transaction.atomic():
             start_time = time.time()
             start_time = time.time()

+ 2 - 2
netbox/extras/views.py

@@ -400,13 +400,13 @@ class ScriptView(PermissionRequiredMixin, View):
             return HttpResponseForbidden()
             return HttpResponseForbidden()
 
 
         script = self._get_script(module, name)
         script = self._get_script(module, name)
-        form = script.as_form(request.POST)
+        form = script.as_form(request.POST, request.FILES)
         output = None
         output = None
         execution_time = None
         execution_time = None
 
 
         if form.is_valid():
         if form.is_valid():
             commit = form.cleaned_data.pop('_commit')
             commit = form.cleaned_data.pop('_commit')
-            output, execution_time = run_script(script, form.cleaned_data, commit)
+            output, execution_time = run_script(script, form.cleaned_data, request.FILES, commit)
 
 
         return render(request, 'extras/script.html', {
         return render(request, 'extras/script.html', {
             'module': module,
             'module': module,

+ 6 - 4
netbox/templates/extras/script.html

@@ -57,9 +57,11 @@
                                     </tr>
                                     </tr>
                                 {% endfor %}
                                 {% endfor %}
                             </table>
                             </table>
-                            <div class="panel-footer text-right text-muted">
-                                <small>Exec time: {{ execution_time|floatformat:3 }}s</small>
-                            </div>
+                            {% if execution_time %}
+                                <div class="panel-footer text-right text-muted">
+                                    <small>Exec time: {{ execution_time|floatformat:3 }}s</small>
+                                </div>
+                            {% endif %}
                         </div>
                         </div>
                     </div>
                     </div>
                 </div>
                 </div>
@@ -72,7 +74,7 @@
                             You do not have permission to run scripts.
                             You do not have permission to run scripts.
                         </div>
                         </div>
                     {% endif %}
                     {% endif %}
-                    <form action="" method="post" class="form form-horizontal">
+                    <form action="" method="post" enctype="multipart/form-data" class="form form-horizontal">
                     {% csrf_token %}
                     {% csrf_token %}
                         {% if not form.requires_input %}
                         {% if not form.requires_input %}
                             <div class="alert alert-info">
                             <div class="alert alert-info">