Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
P
pyDccDisplayer
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
DigitalDynamicMeasurement
pyDccDisplayer
Commits
a80c2519
Commit
a80c2519
authored
1 year ago
by
Vanessa Stehr
Browse files
Options
Downloads
Patches
Plain Diff
File Download: Set file name, use format selector dropdown
parent
7a6b513d
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/main.py
+70
-29
70 additions, 29 deletions
src/main.py
with
70 additions
and
29 deletions
src/main.py
+
70
−
29
View file @
a80c2519
...
@@ -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_callback
s
(
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_callback
s
()
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
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment