You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
4.5 KiB
Python
141 lines
4.5 KiB
Python
# Copyright(c) Jupyter Development Team.
|
|
# Distributed under the terms of the Modified BSD License.
|
|
|
|
"""FileUpload class.
|
|
|
|
Represents a file upload button.
|
|
"""
|
|
import datetime as dt
|
|
|
|
from traitlets import (
|
|
observe, default, Unicode, Dict, Int, Bool, Bytes, CaselessStrEnum
|
|
)
|
|
|
|
from .widget_description import DescriptionWidget
|
|
from .valuewidget import ValueWidget
|
|
from .widget_core import CoreWidget
|
|
from .widget_button import ButtonStyle
|
|
from .widget import register, widget_serialization
|
|
from .trait_types import InstanceDict, TypedTuple
|
|
from traitlets import Bunch
|
|
|
|
|
|
def _deserialize_single_file(js):
|
|
uploaded_file = Bunch()
|
|
for attribute in ['name', 'type', 'size', 'content']:
|
|
uploaded_file[attribute] = js[attribute]
|
|
uploaded_file['last_modified'] = dt.datetime.fromtimestamp(
|
|
js['last_modified'] / 1000,
|
|
tz=dt.timezone.utc
|
|
)
|
|
return uploaded_file
|
|
|
|
|
|
def _deserialize_value(js, _):
|
|
return [_deserialize_single_file(entry) for entry in js]
|
|
|
|
|
|
def _serialize_single_file(uploaded_file):
|
|
js = {}
|
|
for attribute in ['name', 'type', 'size', 'content']:
|
|
js[attribute] = uploaded_file[attribute]
|
|
js['last_modified'] = int(uploaded_file['last_modified'].timestamp() * 1000)
|
|
return js
|
|
|
|
|
|
def _serialize_value(value, _):
|
|
return [_serialize_single_file(entry) for entry in value]
|
|
|
|
|
|
_value_serialization = {
|
|
'from_json': _deserialize_value,
|
|
'to_json': _serialize_value
|
|
}
|
|
|
|
|
|
@register
|
|
class FileUpload(DescriptionWidget, ValueWidget, CoreWidget):
|
|
"""File upload widget
|
|
|
|
This creates a file upload input that allows the user to select
|
|
one or more files to upload. The file metadata and content
|
|
can be retrieved in the kernel.
|
|
|
|
Examples
|
|
--------
|
|
|
|
>>> import ipywidgets as widgets
|
|
>>> uploader = widgets.FileUpload()
|
|
|
|
# After displaying `uploader` and uploading a file:
|
|
|
|
>>> uploader.value
|
|
[
|
|
{
|
|
'name': 'example.txt',
|
|
'type': 'text/plain',
|
|
'size': 36,
|
|
'last_modified': datetime.datetime(2020, 1, 9, 15, 58, 43, 321000, tzinfo=datetime.timezone.utc),
|
|
'content': <memory at 0x10c1b37c8>
|
|
}
|
|
]
|
|
>>> uploader.value[0].content.tobytes()
|
|
b'This is the content of example.txt.\n'
|
|
|
|
Parameters
|
|
----------
|
|
|
|
accept: str, optional
|
|
Which file types to accept, e.g. '.doc,.docx'. For a full
|
|
description of how to specify this, see
|
|
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#attr-accept
|
|
Defaults to accepting all file types.
|
|
|
|
multiple: bool, optional
|
|
Whether to accept multiple files at the same time. Defaults to False.
|
|
|
|
disabled: bool, optional
|
|
Whether user interaction is enabled.
|
|
|
|
icon: str, optional
|
|
The icon to use for the button displayed on the screen.
|
|
Can be any Font-awesome icon without the fa- prefix.
|
|
Defaults to 'upload'. If missing, no icon is shown.
|
|
|
|
description: str, optional
|
|
The text to show on the label. Defaults to 'Upload'.
|
|
|
|
button_style: str, optional
|
|
One of 'primary', 'success', 'info', 'warning', 'danger' or ''.
|
|
|
|
style: widgets.widget_button.ButtonStyle, optional
|
|
Style configuration for the button.
|
|
|
|
value: Tuple[Dict], optional
|
|
The value of the last uploaded file or set of files. See the
|
|
documentation for details of how to use this to retrieve file
|
|
content and metadata:
|
|
https://ipywidgets.readthedocs.io/en/stable/examples/Widget%20List.html#File-Upload
|
|
|
|
error: str, optional
|
|
Whether the last upload triggered an error.
|
|
"""
|
|
_model_name = Unicode('FileUploadModel').tag(sync=True)
|
|
_view_name = Unicode('FileUploadView').tag(sync=True)
|
|
|
|
accept = Unicode(help='File types to accept, empty string for all').tag(sync=True)
|
|
multiple = Bool(help='If True, allow for multiple files upload').tag(sync=True)
|
|
disabled = Bool(help='Enable or disable button').tag(sync=True)
|
|
icon = Unicode('upload', help="Font-awesome icon name, without the 'fa-' prefix.").tag(sync=True)
|
|
button_style = CaselessStrEnum(
|
|
values=['primary', 'success', 'info', 'warning', 'danger', ''], default_value='',
|
|
help='Use a predefined styling for the button.').tag(sync=True)
|
|
style = InstanceDict(ButtonStyle).tag(sync=True, **widget_serialization)
|
|
error = Unicode(help='Error message').tag(sync=True)
|
|
value = TypedTuple(Dict(), help='The file upload value').tag(
|
|
sync=True, echo_update=False, **_value_serialization)
|
|
|
|
@default('description')
|
|
def _default_description(self):
|
|
return 'Upload'
|