diff src/browser/sat_browser/register.py @ 467:97c72fe4a5f2

browser_side: import fixes: - moved browser modules in a sat_browser packages, to avoid import conflicts with std lib (e.g. logging), and let pyjsbuild work normaly - refactored bad import practices: classes are most of time not imported directly, module is imported instead.
author Goffi <goffi@goffi.org>
date Mon, 09 Jun 2014 22:15:26 +0200
parents src/browser/register.py@bea9788f3170
children bbdc5357dc00
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/browser/sat_browser/register.py	Mon Jun 09 22:15:26 2014 +0200
@@ -0,0 +1,255 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Libervia: a Salut à Toi frontend
+# Copyright (C) 2011, 2012, 2013, 2014 Jérôme Poisson <goffi@goffi.org>
+# Copyright (C) 2011, 2012  Adrien Vigneron <adrienvigneron@mailoo.org>
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#This page manage subscription and new account creation
+
+import pyjd  # this is dummy in pyjs
+from sat.core.i18n import _
+
+from pyjamas.ui.SimplePanel import SimplePanel
+from pyjamas.ui.VerticalPanel import VerticalPanel
+from pyjamas.ui.HorizontalPanel import HorizontalPanel
+from pyjamas.ui.TabPanel import TabPanel
+from pyjamas.ui.TabBar import TabBar
+from pyjamas.ui.PasswordTextBox import PasswordTextBox
+from pyjamas.ui.TextBox import TextBox
+from pyjamas.ui.FormPanel import FormPanel
+from pyjamas.ui.Button import Button
+from pyjamas.ui.Label import Label
+from pyjamas.ui.HTML import HTML
+from pyjamas.ui.PopupPanel import PopupPanel
+from pyjamas.ui.Image import Image
+from pyjamas.ui.Hidden import Hidden
+from pyjamas import Window
+from pyjamas.ui.KeyboardListener import KEY_ENTER
+from pyjamas.Timer import Timer
+
+import re
+
+from constants import Const as C
+
+
+class RegisterPanel(FormPanel):
+
+    def __init__(self, callback):
+        """
+        @param callback: method to call if login successful
+        """
+        FormPanel.__init__(self)
+        self.setSize('600px', '350px')
+        self.callback = callback
+        self.setMethod(FormPanel.METHOD_POST)
+        main_panel = HorizontalPanel()
+        main_panel.setStyleName('registerPanel_main')
+        left_side = Image("media/libervia/register_left.png")
+        main_panel.add(left_side)
+
+        ##TabPanel##
+        tab_bar = TabBar()
+        tab_bar.setStyleName('registerPanel_tabs')
+        self.right_side = TabPanel(tab_bar)
+        self.right_side.setStyleName('registerPanel_right_side')
+        main_panel.add(self.right_side)
+        main_panel.setCellWidth(self.right_side, '100%')
+
+        ##Login tab##
+        login_tab = SimplePanel()
+        login_tab.setStyleName('registerPanel_content')
+        login_vpanel = VerticalPanel()
+        login_tab.setWidget(login_vpanel)
+
+        self.login_warning_msg = Label('')
+        self.login_warning_msg.setVisible(False)
+        self.login_warning_msg.setStyleName('formWarning')
+        login_vpanel.add(self.login_warning_msg)
+
+        login_label = Label('Login:')
+        self.login_box = TextBox()
+        self.login_box.setName("login")
+        self.login_box.addKeyboardListener(self)
+        login_pass_label = Label('Password:')
+        self.login_pass_box = PasswordTextBox()
+        self.login_pass_box.setName("login_password")
+        self.login_pass_box.addKeyboardListener(self)
+
+        login_vpanel.add(login_label)
+        login_vpanel.add(self.login_box)
+        login_vpanel.add(login_pass_label)
+        login_vpanel.add(self.login_pass_box)
+        login_but = Button("Log in", getattr(self, "onLogin"))
+        login_but.setStyleName('button')
+        login_but.addStyleName('red')
+        login_vpanel.add(login_but)
+
+        #The hidden submit_type field
+        self.submit_type = Hidden('submit_type')
+        login_vpanel.add(self.submit_type)
+
+        ##Register tab##
+        register_tab = SimplePanel()
+        register_tab.setStyleName('registerPanel_content')
+        register_vpanel = VerticalPanel()
+        register_tab.setWidget(register_vpanel)
+
+        self.register_warning_msg = HTML('')
+        self.register_warning_msg.setVisible(False)
+        self.register_warning_msg.setStyleName('formWarning')
+        register_vpanel.add(self.register_warning_msg)
+
+        register_login_label = Label('Login:')
+        self.register_login_box = TextBox()
+        self.register_login_box.setName("register_login")
+        self.register_login_box.addKeyboardListener(self)
+        email_label = Label('E-mail:')
+        self.email_box = TextBox()
+        self.email_box.setName("email")
+        self.email_box.addKeyboardListener(self)
+        register_pass_label = Label('Password:')
+        self.register_pass_box = PasswordTextBox()
+        self.register_pass_box.setName("register_password")
+        self.register_pass_box.addKeyboardListener(self)
+        register_vpanel.add(register_login_label)
+        register_vpanel.add(self.register_login_box)
+        register_vpanel.add(email_label)
+        register_vpanel.add(self.email_box)
+        register_vpanel.add(register_pass_label)
+        register_vpanel.add(self.register_pass_box)
+
+        register_but = Button("Register", getattr(self, "onRegister"))
+        register_but.setStyleName('button')
+        register_but.addStyleName('red')
+        register_vpanel.add(register_but)
+
+        self.right_side.add(login_tab, 'Login')
+        self.right_side.add(register_tab, 'Register')
+        self.right_side.addTabListener(self)
+        self.right_side.selectTab(1)
+        login_tab.setWidth(None)
+        register_tab.setWidth(None)
+
+        self.add(main_panel)
+        self.addFormHandler(self)
+        self.setAction('register_api/login')
+
+    def onBeforeTabSelected(self, sender, tabIndex):
+        return True
+
+    def onTabSelected(self, sender, tabIndex):
+        if tabIndex == 0:
+            self.login_box.setFocus(True)
+        elif tabIndex == 1:
+            self.register_login_box.setFocus(True)
+
+    def onKeyPress(self, sender, keycode, modifiers):
+        if keycode == KEY_ENTER:
+            # Browsers offer an auto-completion feature to any
+            # text box, but the selected value is not set when
+            # the widget looses the focus. Using a timer with
+            # any delay value > 0 would do the trick.
+            if sender == self.login_box:
+                Timer(5, lambda timer: self.login_pass_box.setFocus(True))
+            elif sender == self.login_pass_box:
+                self.onLogin(None)
+            elif sender == self.register_login_box:
+                Timer(5, lambda timer: self.email_box.setFocus(True))
+            elif sender == self.email_box:
+                Timer(5, lambda timer: self.register_pass_box.setFocus(True))
+            elif sender == self.register_pass_box:
+                self.onRegister(None)
+
+    def onKeyUp(self, sender, keycode, modifiers):
+        pass
+
+    def onKeyDown(self, sender, keycode, modifiers):
+        pass
+
+    def onLogin(self, button):
+        if not re.match(r'^[a-z0-9_-]+$', self.login_box.getText(), re.IGNORECASE):
+            self.login_warning_msg.setText('Invalid login, valid characters are a-z A-Z 0-9 _ -')
+            self.login_warning_msg.setVisible(True)
+        else:
+            self.submit_type.setValue('login')
+            self.submit()
+
+    def onRegister(self, button):
+        if not re.match(r'^[a-z0-9_-]+$', self.register_login_box.getText(), re.IGNORECASE):
+            self.register_warning_msg.setHTML(_('Invalid login, valid characters<br>are a-z A-Z 0-9 _ -'))
+            self.register_warning_msg.setVisible(True)
+        elif not re.match(r'^.+@.+\..+', self.email_box.getText(), re.IGNORECASE):
+            self.register_warning_msg.setHTML(_('Invalid email address'))
+            self.register_warning_msg.setVisible(True)
+        elif len(self.register_pass_box.getText()) < C.PASSWORD_MIN_LENGTH:
+            self.register_warning_msg.setHTML(_('Your password must contain<br>at least %d characters') % C.PASSWORD_MIN_LENGTH)
+            self.register_warning_msg.setVisible(True)
+        else:
+            self.register_warning_msg.setVisible(False)
+            self.submit_type.setValue('register')
+            self.submit()
+
+    def onSubmit(self, event):
+        pass
+
+    def onSubmitComplete(self, event):
+        result = event.getResults()
+        if result == "PROFILE AUTH ERROR":
+            Window.alert(_('Your login and/or password is incorrect. Please try again'))
+        elif result == "XMPP AUTH ERROR":
+            # TODO: call stdui action CHANGE_XMPP_PASSWD_ID as it's done in primitivus
+            Window.alert(_(u'Your SàT profile has been authenticated but the associated XMPP account failed to connect. Please use another SàT frontend to set another XMPP password.'))
+        elif result == "LOGGED":
+            self.callback()
+        elif result == "SESSION_ACTIVE":
+            Window.alert(_('Session already active, this should not happen, please contact the author to fix it'))
+        elif result == "ALREADY EXISTS":
+            self.register_warning_msg.setHTML(_('This login already exists,<br>please choose another one'))
+            self.register_warning_msg.setVisible(True)
+        elif result == "INTERNAL":
+            self.register_warning_msg.setHTML(_('SERVER ERROR: something went wrong during registration process, please contact the server administrator'))
+            self.register_warning_msg.setVisible(True)
+        elif result == "REGISTRATION":
+            self.login_warning_msg.setVisible(False)
+            self.register_warning_msg.setVisible(False)
+            self.login_box.setText(self.register_login_box.getText())
+            self.login_pass_box.setText('')
+            self.register_login_box.setText('')
+            self.register_pass_box.setText('')
+            self.email_box.setText('')
+            self.right_side.selectTab(0)
+            self.login_pass_box.setFocus(True)
+            Window.alert(_('An email has been sent to you with your login informations\nPlease remember that this is ONLY A TECHNICAL DEMO'))
+        else:
+            Window.alert(_('Submit error: %s' % result))
+
+
+class RegisterBox(PopupPanel):
+
+    def __init__(self, callback, *args, **kwargs):
+        PopupPanel.__init__(self, *args, **kwargs)
+        self._form = RegisterPanel(callback)
+        self.setWidget(self._form)
+
+    def onWindowResized(self, width, height):
+        super(RegisterBox, self).onWindowResized(width, height)
+        self.centerBox()
+
+    def show(self):
+        super(RegisterBox, self).show()
+        self.centerBox()
+        self._form.login_box.setFocus(True)