#!/bin/python3 import os import shutil import tempfile from zipfile import ZipFile from flask import Flask, flash, request, redirect, send_file, render_template, g from werkzeug.utils import secure_filename import docx import config import tosca2doc import doc2tosca app = Flask(__name__) UPLOAD_FOLDER = '/tmp/upload' ALLOWED_EXTENSIONS = set(['txt', 'yaml', 'docx']) app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER app.secret_key = 'super secret key' app.config['SESSION_TYPE'] = 'filesystem' TOSCA_DEFS = ['VNFD', 'NSD', 'PNFD'] def allowed_file(filename): ''' Check filename is in the list of allowed extensions ''' return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS @app.route("/") def hello(): ''' Render home page ''' return render_template("./home.html", VERSION=config.VERSION) @app.route("/tosca2doc", methods=['POST']) def mk_tosca2doc(): if 'file' not in request.files: flash('No file part') return redirect(request.url) ufiles=request.files.getlist("file") for tosca_def in TOSCA_DEFS: found=False for uploaded_file in ufiles: if tosca_def in uploaded_file.filename or \ tosca_def.lower() in uploaded_file.filename: found=True #if uploaded_file: # print "-------------------" # print uploaded_file.read() # print "-------------------" if not found: flash('No file part') print('No file part') return redirect("/") for file in ufiles: if file.filename == '': print('No selected file') flash('No selected file') return redirect("/") tmp_dir = tempfile.mkdtemp() g.tmp_dir = tmp_dir doc = docx.Document() for tosca_def in TOSCA_DEFS: for file in ufiles: if tosca_def in uploaded_file.filename or \ tosca_def.lower() in uploaded_file.filename: filename = secure_filename(file.filename) filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename) file.save(filepath) file.close() tosca2doc.generate_from_file(tosca_def, doc, filepath) outfilename = os.path.join(tmp_dir, 'myfile.docx') doc.save(outfilename) return send_file(outfilename) #return ("No content found") def get_all_yaml_file_paths(directory): # initializing empty file paths list file_paths = [] # crawling through directory and subdirectories for root, directories, files in os.walk(directory): for filename in files: if ".yaml" in filename: # join the two strings in order to form the full filepath. filepath = os.path.join(root, filename) file_paths.append(filepath) print(filepath) # returning all file paths return file_paths @app.after_request def after_request(response): if request.path != '/doc2tosca': return response shutil.rmtree(g.tmp_dir, ignore_errors=True) print("Deleted {}\n\n".format(g.tmp_dir)) return response @app.route("/doc2tosca", methods=['POST']) def mk_doc2tosca(): zip_fn = "tosca_defs.zip" if 'file' not in request.files: flash('No file part') return redirect(request.url) ufiles = request.files.getlist("file") sol001_file = ufiles[0] doc2tosca.generate_templates(sol001_file) tmp_dir = tempfile.mkdtemp() print("TMP DIR: " + tmp_dir) doc2tosca.print_to_files(tmp_dir) file_paths = get_all_yaml_file_paths(tmp_dir) zip_path = os.path.join(tmp_dir, zip_fn) with ZipFile( zip_path, 'w') as archive: for myfile in file_paths: archive.write(myfile, arcname=os.path.basename(myfile)) g.tmp_dir = tmp_dir return send_file(zip_path, as_attachment=True) if __name__ == '__main__': app.run(debug=True,host='0.0.0.0')