main.py 7.41 KB
Newer Older
1
2
#!/usr/bin/env python3

3
4
import time
import datetime
5
from flask import Flask, render_template, request, redirect, flash, url_for, jsonify
6
from werkzeug.utils import secure_filename
7
from lib.paf import Paf
8
from config_reader import AppConfigReader
9
from lib.job_manager import JobManager
Floreal Cabanettes's avatar
Floreal Cabanettes committed
10
from lib.functions import *
11
from lib.upload_file import uploadfile
12
13
14
15
16
17
18
19

import sys
app_folder = os.path.dirname(os.path.realpath(__file__))
sys.path.insert(0, app_folder)
os.environ["PATH"] = os.path.join(app_folder, "bin") + ":" + os.environ["PATH"]

sqlite_file = os.path.join(app_folder, "database.sqlite")

20
21
22
23

# Init config reader:
config_reader = AppConfigReader()

24
25
UPLOAD_FOLDER = config_reader.get_upload_folder()

Floreal Cabanettes's avatar
Floreal Cabanettes committed
26
app_title = "D-GENIES - Dotplot for Genomes Interactive, E-connected and Speedy"
Floreal Cabanettes's avatar
Floreal Cabanettes committed
27

28
# Init Flask:
29
app = Flask(__name__, static_url_path='/static')
30
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
31
app.config['SECRET_KEY'] = 'dsqdsq-255sdA-fHfg52-25Asd5'
32
33

# Folder containing data:
34
35
36
app_data = config_reader.get_app_data()


Floreal Cabanettes's avatar
Floreal Cabanettes committed
37
38
39
40
41
42
@app.context_processor
def get_launched_results():
    cookie = request.cookies.get("results")
    return {"results": cookie.split("|") if cookie is not None else set()}


43
44
45
# Main
@app.route("/", methods=['GET'])
def main():
Floreal Cabanettes's avatar
Floreal Cabanettes committed
46
47
48
49
50
    return render_template("index.html", title=app_title, menu="index")


@app.route("/run", methods=['GET'])
def run():
51
52
53
54
55
56
    id_job = random_string(5) + "_" + datetime.datetime.fromtimestamp(time.time()).strftime('%Y%m%d%H%M%S')
    if "id_job" in request.args:
        id_job = request.args["id_job"]
    email = ""
    if "email" in request.args:
        email = request.args["email"]
Floreal Cabanettes's avatar
Floreal Cabanettes committed
57
58
    return render_template("run.html", title=app_title, id_job=id_job, email=email,
                           menu="run")
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85


# Launch analysis
@app.route("/launch_analysis", methods=['POST'])
def launch_analysis():
    id_job = request.form["id_job"]
    email = request.form["email"]
    file_query = request.files["file_query"]
    file_target = request.files["file_target"]

    # Check form:
    form_pass = True
    if id_job == "":
        flash("Id of job not given")
        form_pass = False

    if email == "":
        flash("Email not given")
        form_pass = False
    if file_query.filename == "":
        flash("No query fasta selected")
        form_pass = False

    # Form pass
    if form_pass:
        # Check files are correct:
        if not allowed_file(file_query.filename):
86
            flash("Format of query fasta must be in fasta format (*.%s)" % ", *.".join(ALLOWED_EXTENSIONS))
87
            form_pass = False
88
        if file_target.filename != "" and not allowed_file(file_target.filename):
89
            flash("Format of target fasta must be in fasta format (*.%s)" % ", *.".join(ALLOWED_EXTENSIONS))
90
91
            form_pass = False
        if form_pass:
92
93
94
95
96
97
98
99
            # Get final job id:
            id_job_orig = id_job
            while os.path.exists(os.path.join(app_data, id_job)):
                id_job = id_job_orig + "_2"

            folder_files = os.path.join(app_data, id_job)
            os.makedirs(folder_files)

100
            # Save files:
101
            query_name = os.path.splitext(os.path.basename(file_query.filename))[0]
102
            filename_query = get_valid_uploaded_filename(secure_filename(file_query.filename), folder_files)
103
            target_name = os.path.splitext(os.path.basename(file_target.filename))[0]
104
            query_path = os.path.join(folder_files, filename_query)
105
            file_query.save(query_path)
106
107
            target_path = None
            if file_target.filename != "":
108
109
                filename_target = get_valid_uploaded_filename(secure_filename(file_target.filename), folder_files)
                target_path = os.path.join(folder_files, filename_target)
110
                file_target.save(target_path)
111

112
            # Launch job:
113
            job = JobManager(id_job, email, query_path, target_path, query_name, target_name)
114
            job.launch()
115
            return redirect(url_for(".status", id_job=id_job))
116
        else:
Floreal Cabanettes's avatar
Floreal Cabanettes committed
117
            return redirect(url_for(".run", id_job=id_job, email=email))
118
119
    else:
        return redirect(url_for(".main", id_job=id_job, email=email))
120
121
122
123
124
125
126


# Status of a job
@app.route('/status/<id_job>', methods=['GET'])
def status(id_job):
    job = JobManager(id_job)
    status = job.status()
Floreal Cabanettes's avatar
Floreal Cabanettes committed
127
128
    return render_template("status.html", title=app_title, status=status, id_job=id_job,
                           menu="results")
129
130


Floreal Cabanettes's avatar
Floreal Cabanettes committed
131
# Results path
132
@app.route("/result/<id_res>", methods=['GET'])
133
def result(id_res):
Floreal Cabanettes's avatar
Floreal Cabanettes committed
134
135
136
137
138
139
140
141
    my_render = render_template("results.html", title=app_title, id=id_res, menu="results", current_result=id_res)
    response = app.make_response(my_render)
    cookie = request.cookies.get("results")
    cookie = cookie.split("|") if cookie is not None else []
    if id_res not in cookie:
        cookie.insert(0, id_res)
    response.set_cookie(key="results", value="|".join(cookie), path="/")
    return response
142
143


Floreal Cabanettes's avatar
Floreal Cabanettes committed
144
# Get graph (ajax request)
145
146
147
@app.route('/get_graph', methods=['POST'])
def get_graph():
    id_f = request.form["id"]
148
    paf = os.path.join(app_data, id_f, "map.paf")
149
150
    idx1 = os.path.join(app_data, id_f, "query.idx")
    idx2 = os.path.join(app_data, id_f, "target.idx")
151

152
    paf = Paf(paf, idx1, idx2)
153

154
155
    if paf.parsed:
        res = paf.get_d3js_data()
156
        res["success"] = True
157
158
159
160
161
162
        return jsonify(res)
    return jsonify({"success": False, "message": paf.error})


@app.route('/sort/<id_res>', methods=['POST'])
def sort_graph(id_res):
Floreal Cabanettes's avatar
Floreal Cabanettes committed
163
164
165
166
167
168
169
170
171
172
173
    paf = os.path.join(app_data, id_res, "map.paf")
    idx1 = os.path.join(app_data, id_res, "query.idx")
    idx2 = os.path.join(app_data, id_res, "target.idx")
    paf = Paf(paf, idx1, idx2)
    paf.sort()
    if paf.parsed:
        res = paf.get_d3js_data()
        res["success"] = True
        return jsonify(res)
    return jsonify({"success": False, "message": paf.error})

Floréal Cabanettes's avatar
Floréal Cabanettes committed
174

175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
@app.route("/upload", methods=['POST'])
def upload():
    folder = request.form["folder"]
    print(folder)
    files = request.files[list(request.files.keys())[0]]

    if files:
        filename = files.filename
        folder_files = os.path.join(app.config["UPLOAD_FOLDER"], folder)
        if folder == "null" or not os.path.exists(folder_files):
            folder_files = os.path.join(app.config["UPLOAD_FOLDER"], random_string(5) + "_" +
                                        datetime.datetime.fromtimestamp(time.time()).strftime('%Y%m%d%H%M%S'))
            while os.path.exists(folder_files):
                folder_files = os.path.join(app.config["UPLOAD_FOLDER"], random_string(5) + "_" +
                                            datetime.datetime.fromtimestamp(time.time()).strftime('%Y%m%d%H%M%S'))
            os.makedirs(folder_files)
        filename = get_valid_uploaded_filename(filename, folder_files)
        mime_type = files.content_type

        if not allowed_file(files.filename):
            result = uploadfile(name=filename, type=mime_type, size=0, not_allowed_msg="File type not allowed")

        else:
            # save file to disk
            uploaded_file_path = os.path.join(folder_files, filename)
            files.save(uploaded_file_path)

            # get file size after saving
            size = os.path.getsize(uploaded_file_path)

            # return json for js call back
            result = uploadfile(name=filename, type=mime_type, size=size)

        return jsonify({"files": [result.get_file()], "folder": os.path.basename(folder_files)})

    return jsonify({"files": [], "folder": None})


Floréal Cabanettes's avatar
Floréal Cabanettes committed
213
214
if __name__ == '__main__':
    app.run()