From dbcbd0ed4f453e0a770966f34ac29f71f1989c11 Mon Sep 17 00:00:00 2001 From: sepro Date: Wed, 8 Nov 2017 16:54:52 +0100 Subject: [PATCH] export now uses temp file to overcome file size limit when cramming it into base64 encoded string --- conekt/controllers/expression_profile.py | 28 ++++++++++++++++++++---- conekt/templates/export_condition.html | 6 +++-- config.template.py | 3 +++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/conekt/controllers/expression_profile.py b/conekt/controllers/expression_profile.py index 43eea57..bb939ce 100644 --- a/conekt/controllers/expression_profile.py +++ b/conekt/controllers/expression_profile.py @@ -1,10 +1,12 @@ import json -from flask import Blueprint, redirect, url_for, render_template, Response, request +from flask import Blueprint, redirect, url_for, render_template, Response, request, current_app, send_from_directory from sqlalchemy.orm import undefer from statistics import mean import sys +import tempfile +import os from conekt import cache from conekt.helpers.chartjs import prepare_expression_profile, prepare_profile_comparison @@ -266,7 +268,7 @@ def __generate(species_id, method_id, condition): :param condition: Condition to be exported :return: output """ - yield "Sequence\tAvg.Expression\tMin.Expression\tMax.Expression\n" + yield "Sequence\tAliases\tDescription\tAvg.Expression\tMin.Expression\tMax.Expression\n" profiles = ExpressionProfile.query.filter(ExpressionProfile.species_id == species_id). \ filter(ExpressionProfile.sequence_id is not None). \ @@ -289,7 +291,10 @@ def __generate(species_id, method_id, condition): data, use_means=True) values = converted_profile["data"][condition] - yield "%s\t%f\t%f\t%f\n" % (p.sequence.name, mean(values), min(values), max(values)) + aliases = p.sequence.aliases if p.sequence.aliases is not None else "" + description = p.sequence.description if p.sequence.description is not None else "" + + yield "%s\t%s\t%s\t%f\t%f\t%f\n" % (p.sequence.name, aliases, description, mean(values), min(values), max(values)) except Exception as e: print("An error occured exporting a profile with conditions %s for species %d." % (condition, species_id), @@ -312,6 +317,21 @@ def export_expression_levels(): method_id = int(request.form.get('methods')) condition = request.form.get('conditions') - return Response(__generate(species_id, method_id, condition), mimetype="text/plain") + _, filepath = tempfile.mkstemp(prefix='expr_', dir=current_app.config['TMP_DIR']) + + filename = os.path.basename(filepath) + print(filepath, filename) + + with open(filepath, "w") as fout: + for l in __generate(species_id, method_id, condition): + print(l, end='', file=fout) + + return Response(json.dumps({"url": url_for('expression_profile.export_expression_levels_file', name=filename)}), mimetype='application/json') else: return render_template("export_condition.html", form=form) + + +@expression_profile.route('/export/get_file/') +def export_expression_levels_file(name): + return send_from_directory(current_app.config['TMP_DIR'], name, as_attachment=True, attachment_filename='expression.tab') + diff --git a/conekt/templates/export_condition.html b/conekt/templates/export_condition.html index c7e794b..6657cb2 100644 --- a/conekt/templates/export_condition.html +++ b/conekt/templates/export_condition.html @@ -71,15 +71,17 @@

Export expression levels

success: function(data) { $("#leafy_loader_text").html("Your Download is ready ! "); + pdata = JSON.parse(data); + var element = document.createElement('a'); - element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(data)); + element.setAttribute('href', pdata.url); element.setAttribute('download', 'expression.tab'); document.body.appendChild(element); element.click(); document.body.removeChild(element); - $("#leafy_loader_text").append($("").attr('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(data)).attr('download', 'expression.tab').attr('id', 'download_ready_link').text("Click here")) + $("#leafy_loader_text").append($("").attr('href', pdata.url).attr('download', 'expression.tab').attr('id', 'download_ready_link').text("Click here")) .append($(" if the download doesn't start automatically.")); $("#leafy_loader_close_btn").show(); } diff --git a/config.template.py b/config.template.py index 3526178..a8379b9 100644 --- a/config.template.py +++ b/config.template.py @@ -46,6 +46,9 @@ WHOOSHEE_MEMORY_STORAGE = False WHOOSHEE_ENABLE_INDEXING = True +# temp dir +TMP_DIR = tempfile.mkdtemp() + # BLAST settings BLAST_ENABLED = False BLAST_TMP_DIR = tempfile.mkdtemp()