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

File Download: Set file name, use format selector dropdown

parent 7a6b513d
No related branches found
No related tags found
No related merge requests found
...@@ -4,7 +4,12 @@ import warnings ...@@ -4,7 +4,12 @@ import warnings
from bokeh.plotting import curdoc from bokeh.plotting import curdoc
from bokeh.layouts import column from bokeh.layouts import column
from bokeh.models import FileInput, Div, CustomJS, Button, TabPanel, Tabs, Dropdown from bokeh.models import FileInput, Div, CustomJS, Button, TabPanel, Tabs, Dropdown
from pyDsiVectorsAndTables.pyDsiVectorsAndTables import dsiVector, dsiMultiVector, getNDTablesFromDCC, getFromDict from pyDsiVectorsAndTables.pyDsiVectorsAndTables import (
dsiVector,
dsiMultiVector,
getNDTablesFromDCC,
getFromDict,
)
from pyDsiVectorsAndTables.dsiMultiVectorPlot import dsiMultiVectorPlot from pyDsiVectorsAndTables.dsiMultiVectorPlot import dsiMultiVectorPlot
import numpy as np import numpy as np
from dcc_XMLJSONConv.dcc_Conv import dcc as converterDcc from dcc_XMLJSONConv.dcc_Conv import dcc as converterDcc
...@@ -15,9 +20,7 @@ VERSION = "0.1.0" ...@@ -15,9 +20,7 @@ VERSION = "0.1.0"
class page: class page:
def __init__(self): def __init__(self):
self.fileUploader = fileUploader(self.readFile) self.fileUploader = fileUploader(self.readFile)
self.fileDownloader = fileDownloader( self.fileDownloader = fileDownloader()
b"Initial binary content here", filename="example.txt"
)
self.tabs = [] self.tabs = []
self.dataView = dataView(self.tabs) self.dataView = dataView(self.tabs)
...@@ -27,15 +30,18 @@ class page: ...@@ -27,15 +30,18 @@ class page:
curdoc().add_root(self.dataView.layout) curdoc().add_root(self.dataView.layout)
def readFile(self, attr, old, new): def readFile(self, attr, old, new):
self.fileData = str(base64.b64decode(self.fileUploader.fileInput.value),encoding="utf-8") self.fileData = str(
base64.b64decode(self.fileUploader.fileInput.value), encoding="utf-8"
)
# Start all the fun things here # Start all the fun things here
# Make this the new download file
self.fileDownloader.update(self.fileData, new)
# Parse the XML # Parse the XML
self.dcc = dcc(self.fileData) self.dcc = dcc(self.fileData)
# Make this the new download file
filenameWithoutExtension = ".".join(new.split(".")[:-1])
self.fileDownloader.update(self.dcc, filenameWithoutExtension)
# Generate some tabs from the dcc data # Generate some tabs from the dcc data
self.tabs = self.dcc.dataToTabs() self.tabs = self.dcc.dataToTabs()
...@@ -66,19 +72,22 @@ class dcc: ...@@ -66,19 +72,22 @@ class dcc:
dict: representation of the file contents dict: representation of the file contents
""" """
try: try:
dccInst=converterDcc() dccInst = converterDcc()
dccInst.read_dcc_string(self.xmlFileData) dccInst.read_dcc_string(self.xmlFileData)
dccInst.xml2dict() dccInst.xml2dict()
xmlDict=json.loads(dccInst.get_json()) xmlDict = json.loads(dccInst.get_json())
except Exception as e: except Exception as e:
self.parsingUserMsg = ("An unexpected error occurred! See server logs for details.", ["msg-negative"]) self.parsingUserMsg = (
"An unexpected error occurred! See server logs for details.",
["msg-negative"],
)
raise e raise e
self.parsingUserMsg = ("File processed successfully!", ["msg-positive"]) self.parsingUserMsg = ("File processed successfully!", ["msg-positive"])
return xmlDict return xmlDict
def dataToTabs(self): def dataToTabs(self):
tabs = [] tabs = []
self.createdMultiVectors = {} self.createdMultiVectors = {}
self.NDTablePathsFromXML = getNDTablesFromDCC(self.data) self.NDTablePathsFromXML = getNDTablesFromDCC(self.data)
for path in self.NDTablePathsFromXML: for path in self.NDTablePathsFromXML:
...@@ -88,10 +97,13 @@ class dcc: ...@@ -88,10 +97,13 @@ class dcc:
self.multiVectorPlots[mv.name] = dsiMultiVectorPlot(mv) self.multiVectorPlots[mv.name] = dsiMultiVectorPlot(mv)
for plotName, plot in self.multiVectorPlots.items(): for plotName, plot in self.multiVectorPlots.items():
tabs.append(TabPanel(child = plot.widget, title = plotName)) tabs.append(TabPanel(child=plot.widget, title=plotName))
if len(tabs) == 0: if len(tabs) == 0:
self.parsingUserMsg = (self.parsingUserMsg[0] + " No data found in XML!", ["msg-negative"]) self.parsingUserMsg = (
self.parsingUserMsg[0] + " No data found in XML!",
["msg-negative"],
)
return tabs return tabs
...@@ -139,37 +151,66 @@ class fileUploader: ...@@ -139,37 +151,66 @@ class fileUploader:
class fileDownloader: class fileDownloader:
def __init__( def __init__(
self, self,
byte_object=None, dcc = None,
filename: str = "downloaded_file", filename: str = "",
name: str = "fileDownloader", name: str = "fileDownloader",
): ):
self.name = name self.name = name
self.byte_object = byte_object self.dcc = dcc
self.filename = filename self.filename = filename
self.formatSelector = Dropdown(label="Choose file format…", menu=[("Excel (.xlsx)", "xlsx"), ("Comma separated value (.csv)", "csv")]) self.formatSelector = Dropdown(
jsCallback = CustomJS( label="Choose file format…",
menu=[("Excel (.xlsx)", "xlsx"), ("LibreOffice (.ods)", "ods"), ("Comma separated value (.csv)", "csv")],
)
formatSelectorJsCallback = CustomJS(
args=dict(format_selector=self.formatSelector), args=dict(format_selector=self.formatSelector),
code=""" code="""
format_selector.label = this.item format_selector.label = this.item
""", """,
) )
self.formatSelector.js_on_event("menu_item_click", jsCallback) self.formatSelector.js_on_event("menu_item_click", formatSelectorJsCallback)
self.selectedDownloadFormat = ""
self.download_button = Button(label="Download", width=150) self.download_button = Button(label="Download", width=150)
self.fileDownloadMessage = Div( self.fileDownloadMessage = Div(
name="fileInputMessage", name="fileInputMessage",
text="No file download requested.", text="No file download requested.",
css_classes=["msg-neutral"], css_classes=["msg-neutral"],
) )
self.set_callback() self.set_callbacks()
self.layout = column(children=[self.formatSelector, self.download_button, self.fileDownloadMessage], name=self.name) self.layout = column(
children=[
self.formatSelector,
self.download_button,
self.fileDownloadMessage,
],
name=self.name,
)
def set_callback(self): def set_callbacks(self):
self.download_button.on_click(self.prepare_download) self.download_button.on_click(self.prepare_download)
self.formatSelector.on_click(self.set_fileFormat)
def set_fileFormat(self, event):
self.selectedDownloadFormat = event.item
def prepare_download(self): def prepare_download(self):
base64_string = base64.b64encode(self.byte_object).decode("utf-8") if self.filename == "":
self.setMessage("No file uploaded yet!", ["msg-negative"])
return
elif self.selectedDownloadFormat == "":
self.setMessage("Please select a file format!", ["msg-negative"])
return
self.setMessage("Preparing download file…")
# base64_string = base64.b64encode(self.byte_object).decode("utf-8")
# match self.selectedDownloadFormat:
# case "csv":
# self.fileContent = next(iter(self.dcc.createdMultiVectors.values())).dump_csv()
# case _:
# self.fileContent = "Test"
# self.fileContent = "Test"
filename = self.filename + "." + self.selectedDownloadFormat
download_js = CustomJS( download_js = CustomJS(
args=dict(filename=self.filename, file_contents=base64_string), args=dict(filename=filename, file_contents=self.fileContent),
code=""" code="""
var filename = filename; var filename = filename;
var file_contents = "data:application/octet-stream;base64," + file_contents; var file_contents = "data:application/octet-stream;base64," + file_contents;
...@@ -181,10 +222,10 @@ class fileDownloader: ...@@ -181,10 +222,10 @@ class fileDownloader:
) )
self.download_button.js_on_click(download_js) self.download_button.js_on_click(download_js)
def update(self, new_byte_object, new_filename: str): def update(self, new_dcc, new_filename: str):
self.byte_object = new_byte_object self.dcc = new_dcc
self.filename = new_filename self.filename = new_filename
self.set_callback() self.set_callbacks()
def setMessage(self, text: str, css_classes: list = ["msg-neutral"]): def setMessage(self, text: str, css_classes: list = ["msg-neutral"]):
self.fileDownloadMessage.text = text self.fileDownloadMessage.text = text
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment