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'
 |