web_app.py 3.58 KB
Newer Older
carignani's avatar
carignani committed
#!/bin/python3
carignani's avatar
carignani committed

import os

from flask import Flask, flash, request, redirect, url_for, send_file, render_template
carignani's avatar
carignani committed
from werkzeug.utils import secure_filename
import docx
carignani's avatar
carignani committed
import tempfile
from zipfile import ZipFile 
carignani's avatar
carignani committed

carignani's avatar
carignani committed
import os

import config
carignani's avatar
carignani committed
import tosca2doc
carignani's avatar
carignani committed
import doc2tosca
carignani's avatar
carignani committed

app = Flask(__name__)

carignani's avatar
carignani committed
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():
carignani's avatar
carignani committed
    return render_template("./home.html", VERSION=config.VERSION) 
carignani's avatar
carignani committed

@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("/")

    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)

    doc.save('/tmp/myfile.docx')
    return send_file('/tmp/myfile.docx')

carignani's avatar
carignani committed
    #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.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")

    # uploaded_file.filename
    # uploaded_file.read()
    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))

    return send_file(zip_path, as_attachment=True)