Skip to content
Snippets Groups Projects
Commit 9af8b146 authored by Vanessa Stehr's avatar Vanessa Stehr
Browse files

Multi-table download for csv

parent 07479954
No related branches found
No related tags found
No related merge requests found
import base64
import io
import json
import tarfile
import warnings
from bokeh.plotting import curdoc
from bokeh.layouts import column
......@@ -160,7 +162,7 @@ class fileDownloader:
self.filename = filename
self.formatSelector = Dropdown(
label="Choose file format…",
menu=[("Excel (.xlsx)", "xlsx"), ("LibreOffice (.ods)", "ods"), ("Comma separated value (.csv)", "csv")],
menu=[("Excel (.xlsx)", "xlsx"), ("Comma separated value (.csv)", "csv")],
)
formatSelectorJsCallback = CustomJS(
args=dict(format_selector=self.formatSelector),
......@@ -204,24 +206,53 @@ class fileDownloader:
# base64_string = base64.b64encode(self.byte_object).decode("utf-8")
match self.selectedDownloadFormat:
case "csv":
self.fileContent = base64.b64encode(next(iter(self.dcc.createdMultiVectors.values())).dump_csv().encode("utf-8")).decode("ascii")
case "ods":
self.fileContent = base64.b64encode(next(iter(self.dcc.createdMultiVectors.values())).dump_ods().getvalue()).decode("ascii")
buffer = io.BytesIO()
filename = self.filename + "_csv.tar.gz"
with tarfile.open(fileobj=buffer, mode='w:gz') as tar:
for tablename, table in self.dcc.createdMultiVectors.items():
# Create a BytesIO object for each string
string_buffer = io.BytesIO(table.dump_csv().encode('utf-8'))
# Add to the tar file
tarinfo = tarfile.TarInfo(name=f'{tablename}.csv')
tarinfo.size = len(string_buffer.getvalue())
tar.addfile(tarinfo, string_buffer)
buffer.seek(0)
# self.fileContent = base64.b64encode(buffer.getvalue()).decode("ascii")
download_js = CustomJS(
args=dict(buffer_contents=buffer.getvalue(), filename=filename),
code="""
var buffer_contents = buffer_contents;
var filename = filename;
var blob = new Blob([buffer_contents], { type: 'application/octet-stream' });
var url = URL.createObjectURL(blob);
var link = document.createElement('a');
link.href = url;
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
"""
)
# case "ods":
# self.fileContent = base64.b64encode(next(iter(self.dcc.createdMultiVectors.values())).dump_ods().getvalue()).decode("ascii")
case "xlsx":
self.fileContent = base64.b64encode(next(iter(self.dcc.createdMultiVectors.values())).dump_xlsx().getvalue()).decode("ascii")
filename = self.filename + "." + self.selectedDownloadFormat
download_js = CustomJS(
args=dict(filename=filename, file_contents=self.fileContent),
code="""
var filename = filename;
var file_contents = "data:application/octet-stream;base64," + file_contents;
var link = document.createElement('a');
link.href = file_contents;
link.download = filename;
link.click();
""",
)
# self.fileContent = "Test"
filename = self.filename + "." + self.selectedDownloadFormat
download_js = CustomJS(
args=dict(filename=filename, file_contents=self.fileContent),
code="""
var filename = filename;
var file_contents = "data:application/octet-stream;base64," + file_contents;
var link = document.createElement('a');
link.href = file_contents;
link.download = filename;
link.click();
""",
)
self.download_button.js_on_click(download_js)
self.setMessage("File ready for download!", ["msg-positive"])
......
......@@ -37,7 +37,6 @@
</header>
{% block inner_body %}
{% block contents %}
<p>Here is some text.</p>
<div>
{{ embed(roots.fileUploader) }}
</div>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment