File Upload Widget.ipynb
248 lines
| 8.6 KiB
| text/plain
|
TextLexer
Jonathan Frederic
|
r14337 | { | ||
"metadata": { | ||||
"cell_tags": [ | ||||
[ | ||||
"<None>", | ||||
null | ||||
] | ||||
], | ||||
"name": "" | ||||
}, | ||||
"nbformat": 3, | ||||
"nbformat_minor": 0, | ||||
"worksheets": [ | ||||
{ | ||||
"cells": [ | ||||
{ | ||||
"cell_type": "code", | ||||
"collapsed": false, | ||||
"input": [ | ||||
Jonathan Frederic
|
r14446 | "import base64\n", | ||
Jonathan Frederic
|
r14742 | "from __future__ import print_function # py 2.7 compat.\n", | ||
"from IPython.html import widgets # Widget definitions.\n", | ||||
"from IPython.utils.traitlets import Unicode # Traitlet needed to add synced attributes to the widget." | ||||
Jonathan Frederic
|
r14337 | ], | ||
"language": "python", | ||||
"metadata": {}, | ||||
Jonathan Frederic
|
r14342 | "outputs": [], | ||
Jonathan Frederic
|
r14338 | "prompt_number": 1 | ||
Jonathan Frederic
|
r14337 | }, | ||
{ | ||||
Jonathan Frederic
|
r14742 | "cell_type": "markdown", | ||
Jonathan Frederic
|
r14339 | "metadata": {}, | ||
"source": [ | ||||
Jonathan Frederic
|
r14742 | "This is a custom widget that allows the user to upload file data to the notebook server. The file data is sent via a statefull `value` attribute of the widget. The widget has an upload failed event that fires in the front-end and is echoed to the back-end using a custom msg." | ||
Jonathan Frederic
|
r14339 | ] | ||
}, | ||||
{ | ||||
Jonathan Frederic
|
r14337 | "cell_type": "code", | ||
"collapsed": false, | ||||
"input": [ | ||||
Jonathan Frederic
|
r14742 | "class FileWidget(widgets.DOMWidget):\n", | ||
" _view_name = Unicode('FilePickerView', sync=True)\n", | ||||
" value = Unicode(sync=True)\n", | ||||
" filename = Unicode(sync=True)\n", | ||||
Jonathan Frederic
|
r14337 | " \n", | ||
Jonathan Frederic
|
r14742 | " def __init__(self, **kwargs):\n", | ||
" \"\"\"Constructor\"\"\"\n", | ||||
" widgets.DOMWidget.__init__(self, **kwargs) # Call the base.\n", | ||||
" \n", | ||||
" # Allow the user to register error callbacks with the following signatures:\n", | ||||
" # callback()\n", | ||||
" # callback(sender)\n", | ||||
" self.errors = widgets.CallbackDispatcher(accepted_nargs=[0, 1])\n", | ||||
" \n", | ||||
" # Listen for custom msgs\n", | ||||
" self.on_msg(self._handle_custom_msg)\n", | ||||
"\n", | ||||
" def _handle_custom_msg(self, content):\n", | ||||
" \"\"\"Handle a msg from the front-end.\n", | ||||
"\n", | ||||
" Parameters\n", | ||||
" ----------\n", | ||||
" content: dict\n", | ||||
" Content of the msg.\"\"\"\n", | ||||
" if 'event' in content and content['event'] == 'error':\n", | ||||
" self.errors()\n", | ||||
" self.errors(self)\n", | ||||
" " | ||||
Jonathan Frederic
|
r14337 | ], | ||
"language": "python", | ||||
"metadata": {}, | ||||
"outputs": [], | ||||
Jonathan Frederic
|
r14338 | "prompt_number": 2 | ||
Jonathan Frederic
|
r14337 | }, | ||
{ | ||||
"cell_type": "code", | ||||
"collapsed": false, | ||||
"input": [ | ||||
"%%javascript\n", | ||||
"\n", | ||||
epifanio
|
r15743 | "require([\"widgets/js/widget\"], function(WidgetManager){\n", | ||
Jonathan Frederic
|
r14742 | "\n", | ||
Jonathan Frederic
|
r14337 | " var FilePickerView = IPython.WidgetView.extend({\n", | ||
" render: function(){\n", | ||||
Jonathan Frederic
|
r14742 | " // Render the view.\n", | ||
" this.setElement($('<input />')\n", | ||||
" .attr('type', 'file'));\n", | ||||
Jonathan Frederic
|
r14337 | " },\n", | ||
" \n", | ||||
Jonathan Frederic
|
r14742 | " events: {\n", | ||
" // List of events and their handlers.\n", | ||||
" 'change': 'handle_file_change',\n", | ||||
" },\n", | ||||
" \n", | ||||
" handle_file_change: function(evt) { \n", | ||||
" // Handle when the user has changed the file.\n", | ||||
Jonathan Frederic
|
r14337 | " \n", | ||
Jonathan Frederic
|
r14742 | " // Retrieve the first (and only!) File from the FileList object\n", | ||
" var file = evt.target.files[0];\n", | ||||
" if (file) {\n", | ||||
"\n", | ||||
" // Read the file's textual content and set value to those contents.\n", | ||||
" var that = this;\n", | ||||
" var file_reader = new FileReader();\n", | ||||
" file_reader.onload = function(e) {\n", | ||||
Jonathan Frederic
|
r14337 | " that.model.set('value', e.target.result);\n", | ||
Jonathan Frederic
|
r14742 | " that.touch();\n", | ||
Jonathan Frederic
|
r14337 | " }\n", | ||
Jonathan Frederic
|
r14742 | " file_reader.readAsText(file);\n", | ||
Jonathan Frederic
|
r14338 | " } else {\n", | ||
Jonathan Frederic
|
r14742 | "\n", | ||
" // The file couldn't be opened. Send an error msg to the\n", | ||||
" // back-end.\n", | ||||
" this.send({ 'event': 'error' });\n", | ||||
Jonathan Frederic
|
r14337 | " }\n", | ||
Jonathan Frederic
|
r14742 | "\n", | ||
" // Set the filename of the file.\n", | ||||
" this.model.set('filename', file.name);\n", | ||||
" this.touch();\n", | ||||
Jonathan Frederic
|
r14337 | " },\n", | ||
" });\n", | ||||
" \n", | ||||
" // Register the DatePickerView with the widget manager.\n", | ||||
Jonathan Frederic
|
r14742 | " WidgetManager.register_widget_view('FilePickerView', FilePickerView);\n", | ||
Jonathan Frederic
|
r14337 | "});" | ||
], | ||||
"language": "python", | ||||
"metadata": {}, | ||||
"outputs": [ | ||||
{ | ||||
"javascript": [ | ||||
"\n", | ||||
epifanio
|
r15744 | "require([\"widgets/js/widget\"], function(WidgetManager){\n", | ||
Jonathan Frederic
|
r14742 | "\n", | ||
Jonathan Frederic
|
r14337 | " var FilePickerView = IPython.WidgetView.extend({\n", | ||
" render: function(){\n", | ||||
Jonathan Frederic
|
r14742 | " // Render the view.\n", | ||
" this.setElement($('<input />')\n", | ||||
" .attr('type', 'file'));\n", | ||||
Jonathan Frederic
|
r14337 | " },\n", | ||
" \n", | ||||
Jonathan Frederic
|
r14742 | " events: {\n", | ||
" // List of events and their handlers.\n", | ||||
" 'change': 'handle_file_change',\n", | ||||
" },\n", | ||||
" \n", | ||||
" handle_file_change: function(evt) { \n", | ||||
" // Handle when the user has changed the file.\n", | ||||
Jonathan Frederic
|
r14337 | " \n", | ||
Jonathan Frederic
|
r14742 | " // Retrieve the first (and only!) File from the FileList object\n", | ||
" var file = evt.target.files[0];\n", | ||||
" if (file) {\n", | ||||
"\n", | ||||
" // Read the file's textual content and set value to those contents.\n", | ||||
" var that = this;\n", | ||||
" var file_reader = new FileReader();\n", | ||||
" file_reader.onload = function(e) {\n", | ||||
Jonathan Frederic
|
r14337 | " that.model.set('value', e.target.result);\n", | ||
Jonathan Frederic
|
r14742 | " that.touch();\n", | ||
Jonathan Frederic
|
r14337 | " }\n", | ||
Jonathan Frederic
|
r14742 | " file_reader.readAsText(file);\n", | ||
Jonathan Frederic
|
r14338 | " } else {\n", | ||
Jonathan Frederic
|
r14742 | "\n", | ||
" // The file couldn't be opened. Send an error msg to the\n", | ||||
" // back-end.\n", | ||||
" this.send({ 'event': 'error' });\n", | ||||
Jonathan Frederic
|
r14337 | " }\n", | ||
Jonathan Frederic
|
r14742 | "\n", | ||
" // Set the filename of the file.\n", | ||||
" this.model.set('filename', file.name);\n", | ||||
" this.touch();\n", | ||||
Jonathan Frederic
|
r14337 | " },\n", | ||
" });\n", | ||||
" \n", | ||||
" // Register the DatePickerView with the widget manager.\n", | ||||
Jonathan Frederic
|
r14742 | " WidgetManager.register_widget_view('FilePickerView', FilePickerView);\n", | ||
Jonathan Frederic
|
r14337 | "});" | ||
], | ||||
"metadata": {}, | ||||
"output_type": "display_data", | ||||
"text": [ | ||||
Jonathan Frederic
|
r14834 | "<IPython.core.display.Javascript at 0x36df2d0>" | ||
Jonathan Frederic
|
r14337 | ] | ||
} | ||||
], | ||||
Jonathan Frederic
|
r14338 | "prompt_number": 3 | ||
Jonathan Frederic
|
r14337 | }, | ||
{ | ||||
Jonathan Frederic
|
r14742 | "cell_type": "markdown", | ||
Jonathan Frederic
|
r14339 | "metadata": {}, | ||
"source": [ | ||||
Jonathan Frederic
|
r14742 | "The following shows how the file widget can be used." | ||
Jonathan Frederic
|
r14339 | ] | ||
}, | ||||
{ | ||||
Jonathan Frederic
|
r14337 | "cell_type": "code", | ||
"collapsed": false, | ||||
"input": [ | ||||
"file_widget = FileWidget()\n", | ||||
"\n", | ||||
Jonathan Frederic
|
r14742 | "# Register an event to echo the filename when it has been changed.\n", | ||
Jonathan Frederic
|
r14337 | "def file_loading():\n", | ||
Jonathan Frederic
|
r14413 | " print(\"Loading %s\" % file_widget.filename)\n", | ||
Jonathan Frederic
|
r14742 | "file_widget.on_trait_change(file_loading, 'filename')\n", | ||
Jonathan Frederic
|
r14337 | "\n", | ||
Jonathan Frederic
|
r14742 | "# Register an event to echo the filename and contents when a file\n", | ||
"# has been uploaded.\n", | ||||
Jonathan Frederic
|
r14337 | "def file_loaded():\n", | ||
Jonathan Frederic
|
r14413 | " print(\"Loaded, file contents: %s\" % file_widget.value)\n", | ||
Jonathan Frederic
|
r14742 | "file_widget.on_trait_change(file_loaded, 'value')\n", | ||
Jonathan Frederic
|
r14337 | "\n", | ||
Jonathan Frederic
|
r14742 | "# Register an event to print an error message when a file could not\n", | ||
"# be opened. Since the error messages are not handled through\n", | ||||
"# traitlets but instead handled through custom msgs, the registration\n", | ||||
"# of the handler is different than the two examples above. Instead\n", | ||||
"# the API provided by the CallbackDispatcher must be used.\n", | ||||
"def file_failed():\n", | ||||
" print(\"Could not load file contents of %s\" % file_widget.filename)\n", | ||||
"file_widget.errors.register_callback(file_failed)\n", | ||||
Jonathan Frederic
|
r14337 | "\n", | ||
Jonathan Frederic
|
r14742 | "file_widget" | ||
Jonathan Frederic
|
r14337 | ], | ||
"language": "python", | ||||
"metadata": {}, | ||||
"outputs": [ | ||||
{ | ||||
"output_type": "stream", | ||||
"stream": "stdout", | ||||
"text": [ | ||||
"Loading test.txt\n" | ||||
] | ||||
}, | ||||
{ | ||||
"output_type": "stream", | ||||
"stream": "stdout", | ||||
"text": [ | ||||
Jonathan Frederic
|
r14413 | "Loaded, file contents: Hello World!\n", | ||
"\n" | ||||
Jonathan Frederic
|
r14337 | ] | ||
} | ||||
], | ||||
Jonathan Frederic
|
r14338 | "prompt_number": 4 | ||
Jonathan Frederic
|
r14337 | } | ||
], | ||||
"metadata": {} | ||||
} | ||||
] | ||||
epifanio
|
r15743 | } | ||