# HG changeset patch # User souliane # Date 1393311365 -3600 # Node ID 933bce4cb816b1bc9f23b0b79d84e26dbdc3d42f # Parent 87e1194e55d6c4bebf5a475f9b49bb3215a39164 browser_side: factorize the code from AvatarUpload to a new class FileUploadPanel diff -r 87e1194e55d6 -r 933bce4cb816 browser_side/file_tools.py --- a/browser_side/file_tools.py Wed Feb 26 14:13:15 2014 +0100 +++ b/browser_side/file_tools.py Tue Feb 25 07:56:05 2014 +0100 @@ -18,15 +18,21 @@ # along with this program. If not, see . from pyjamas.ui.FileUpload import FileUpload +from pyjamas.ui.FormPanel import FormPanel from pyjamas import Window from pyjamas import DOM +from pyjamas.ui.VerticalPanel import VerticalPanel +from pyjamas.ui.HTML import HTML +from pyjamas.ui.HorizontalPanel import HorizontalPanel +from pyjamas.ui.Button import Button +from pyjamas.ui.Label import Label class FilterFileUpload(FileUpload): def __init__(self, name, max_size, types=None): """ - @param name: the input element name + @param name: the input element name and id @param max_size: maximum file size in MB @param types: allowed types as a list of couples (x, y, z): - x: MIME content type e.g. "audio/ogg" @@ -59,3 +65,78 @@ Window.alert('This file is too big!\nMaximum file size: %d MB.' % self.max_size) return False return True + + +class FileUploadPanel(FormPanel): + + def __init__(self, action_url, input_id, max_size, texts=None, close_cb=None): + """Build a form panel to upload a file. + @param action_url: the form action URL + @param input_id: the input element name and id + @param max_size: maximum file size in MB + @param texts: a dict to ovewrite the default textual values + @param close_cb: the close button callback method + """ + FormPanel.__init__(self) + self.texts = {'ok_button': 'Upload file', + 'cancel_button': 'Cancel', + 'body': 'Please select a file.', + 'submitting': 'Submitting, please wait...', + 'errback': "Your file has been rejected...", + 'body_errback': 'Please select another file.', + 'callback': "Your file has been accepted!"} + if isinstance(texts, dict): + self.texts.update(texts) + self.close_cb = close_cb + self.setEncoding(FormPanel.ENCODING_MULTIPART) + self.setMethod(FormPanel.METHOD_POST) + self.setAction(action_url) + self.vPanel = VerticalPanel() + self.message = HTML(self.texts['body']) + self.vPanel.add(self.message) + + hPanel = HorizontalPanel() + hPanel.setSpacing(5) + self.file_upload = FilterFileUpload(input_id, max_size) + self.vPanel.add(self.file_upload) + + hPanel.add(Button(self.texts['cancel_button'], getattr(self, "onCloseBtnClick"))) + self.upload_btn = Button(self.texts['ok_button'], getattr(self, "onSubmitBtnClick")) + hPanel.add(self.upload_btn) + + self.status = Label() + hPanel.add(self.status) + + self.vPanel.add(hPanel) + + self.add(self.vPanel) + self.addFormHandler(self) + + def setCloseCb(self, close_cb): + self.close_cb = close_cb + + def onCloseBtnClick(self): + if self.close_cb: + self.close_cb() + else: + print ("WARNING: no close method defined") + + def onSubmitBtnClick(self): + if not self.file_upload.check(): + return + self.message.setHTML(self.texts['submitting']) + self.upload_btn.setEnabled(False) + self.submit() + + def onSubmit(self, event): + pass + + def onSubmitComplete(self, event): + result = event.getResults() + if result != "OK": + Window.alert(self.texts['errback']) + self.message.setHTML(self.texts['body_errback']) + self.upload_btn.setEnabled(True) + else: + Window.alert(self.texts['callback']) + self.close_cb() diff -r 87e1194e55d6 -r 933bce4cb816 browser_side/menu.py --- a/browser_side/menu.py Wed Feb 26 14:13:15 2014 +0100 +++ b/browser_side/menu.py Tue Feb 25 07:56:05 2014 +0100 @@ -17,25 +17,19 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import pyjd # this is dummy in pyjs +import pyjd # this is dummy in pyjs from pyjamas.ui.SimplePanel import SimplePanel -from pyjamas.ui.VerticalPanel import VerticalPanel -from pyjamas.ui.HorizontalPanel import HorizontalPanel -from pyjamas.ui.DialogBox import DialogBox -from pyjamas.ui.FormPanel import FormPanel -from pyjamas.ui.FileUpload import FileUpload from pyjamas.ui.MenuBar import MenuBar from pyjamas.ui.MenuItem import MenuItem from pyjamas.ui.ListBox import ListBox from pyjamas.ui.Label import Label from pyjamas.ui.TextBox import TextBox -from pyjamas.ui.Button import Button from pyjamas.ui.HTML import HTML from pyjamas.ui.Frame import Frame from pyjamas import Window from jid import JID from html_tools import html_sanitize -from file_tools import FilterFileUpload +from file_tools import FileUploadPanel from xmlui import XMLUI import panels import dialog @@ -82,63 +76,14 @@ self.popup.addStyleName('menuLastPopup') -class AvatarUpload(FormPanel): - - def __init__(self, close_cb=None): - FormPanel.__init__(self) - self.close_cb = close_cb - self.setEncoding(FormPanel.ENCODING_MULTIPART) - self.setMethod(FormPanel.METHOD_POST) - self.setAction("upload_avatar") - self.vPanel = VerticalPanel() - self.message = HTML('Please select an image to show as your avatar...
Your picture must be a square and will be resized to 64x64 pixels if necessary') - self.vPanel.add(self.message) - - hPanel = HorizontalPanel() - hPanel.setSpacing(5) - self.file_upload = FilterFileUpload("avatar_path", 2) - self.vPanel.add(self.file_upload) - - hPanel.add(Button("Cancel", getattr(self, "onCloseBtnClick"))) - self.upload_btn = Button("Upload avatar", getattr(self, "onSubmitBtnClick")) - hPanel.add(self.upload_btn) - - self.status = Label() - hPanel.add(self.status) - - self.vPanel.add(hPanel) - - self.add(self.vPanel) - self.addFormHandler(self) - - def setCloseCb(self, close_cb): - self.close_cb = close_cb - - def onCloseBtnClick(self): - if self.close_cb: - self.close_cb() - else: - print ("WARNING: no close method defined") - - def onSubmitBtnClick(self): - if not self.file_upload.check(): - return - self.message.setHTML('Submitting, please wait...') - self.upload_btn.setEnabled(False) - self.submit() - - def onSubmit(self, event): - pass - - def onSubmitComplete(self, event): - result = event.getResults() - if result != "OK": - Window.alert("Can't open image... did you actually submit an image?") - self.message.setHTML('Please select another image file') - self.upload_btn.setEnabled(True) - else: - Window.alert("Your new profile picture has been set!") - self.close_cb() +class AvatarUpload(FileUploadPanel): + def __init__(self): + texts = {'ok_button': 'Upload avatar', + 'body': 'Please select an image to show as your avatar...
Your picture must be a square and will be resized to 64x64 pixels if necessary.', + 'errback': "Can't open image... did you actually submit an image?", + 'body_errback': 'Please select another image file.', + 'callback': "Your new profile picture has been set!"} + FileUploadPanel.__init__(self, 'upload_avatar', 'avatar_path', 2, texts) class Menu(SimplePanel): @@ -155,7 +100,7 @@ def addMenu(menu_name, menu_name_i18n, item_name_i18n, icon, menu_cmd): """ add a menu to menu_dict """ - print "addMenu:",menu_name, menu_name_i18n, item_name_i18n, icon, menu_cmd + print "addMenu:", menu_name, menu_name_i18n, item_name_i18n, icon, menu_cmd try: menu_bar = menus_dict[menu_name] except KeyError: @@ -191,7 +136,7 @@ item_name_i18n = ' | '.join(path_i18n[1:]) addMenu(menu_name, menu_name_i18n, item_name_i18n, 'plugins', PluginMenuCmd(self.host, action_id)) - menus_order.append(None) # we add separator + menus_order.append(None) # we add separator addMenu("Help", _("Help"), _("Social contract"), 'help', MenuCmd(self, "onSocialContract")) addMenu("Help", _("Help"), _("About"), 'help', MenuCmd(self, "onAbout")) @@ -258,7 +203,7 @@ Window.alert('You must enter a valid contact JID (like "contact@%s")' % self.host._defaultDomain) _dialog.show() else: - self.host.bridge.call('addContact', None, edit.getText(), '', _dialog.getSelectedGroups() ) + self.host.bridge.call('addContact', None, edit.getText(), '', _dialog.getSelectedGroups()) label = Label("New contact identifier (JID):") edit.setText('@%s' % self.host._defaultDomain)