Merge lp:~openerp-dev/openerp-web/7.0-monodb-login-screen-fme into lp:openerp-web/7.0

Proposed by Antony Lesuisse (OpenERP)
Status: Merged
Merged at revision: 3837
Proposed branch: lp:~openerp-dev/openerp-web/7.0-monodb-login-screen-fme
Merge into: lp:openerp-web/7.0
Diff against target: 279 lines (+122/-36)
4 files modified
addons/web/controllers/main.py (+49/-6)
addons/web/static/src/js/chrome.js (+67/-28)
addons/web/static/src/js/coresetup.js (+4/-0)
addons/web/static/src/xml/base.xml (+2/-2)
To merge this branch: bzr merge lp:~openerp-dev/openerp-web/7.0-monodb-login-screen-fme
Reviewer Review Type Date Requested Status
Christophe Simonis (OpenERP) Needs Fixing
Review via email: mp+151075@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Antony Lesuisse (OpenERP) (al-openerp) wrote :

dont merge it it's wrong i tell you by phone

Revision history for this message
Christophe Simonis (OpenERP) (kangol) wrote :

1/ in js: use instance.web.redirect(url) instead of setting window.location
2/ in py: do not change the api of db_monodb(), create a new function for the purpose of returning a tuple...

review: Needs Fixing
Revision history for this message
Fabien Meghazi (OpenERP) (fme) wrote :

done

PS: the status of this merge proposal is "Work in Progress", not "Needs Review".

Revision history for this message
Fabien Meghazi (OpenERP) (fme) wrote :

As no description about this branch has been given, here it is :

This branch provides a monodb behavior without the need of server's switch --load (which will be deprecated)

- On the client, the url is changed when another database is selected.

- When another database is selected, a cookie is set so the Home controller knows which database should be selected by default.

- If there's no database on the server, the database manager is started.

- If no 'db' url parameter is present in the request and if there's more than one database on the server, the Home controller send a redirection to an url with the appropriate 'db' url parameter.

3806. By Fabien Meghazi (OpenERP)

[REM] Removed database check, this is not the role of the controller to reject a bad database name

Revision history for this message
Fabien Meghazi (OpenERP) (fme) wrote :
3807. By Antony Lesuisse (OpenERP)

db_monodb use the new implementation

3808. By Antony Lesuisse (OpenERP)

db_monodb better version and naming

3809. By Fabien Meghazi (OpenERP)

[FIX] db_monodb: cookie not used. keep same behavior as previous

3810. By Fabien Meghazi (OpenERP)

[FIX] Restore cookie_db check

3811. By Fabien Meghazi (OpenERP)

[FIX] Add redirect helper for IE<10 (looses hash on redirects)

3812. By Fabien Meghazi (OpenERP)

[FIX] Use new db parameter after database creation's reload

3813. By Fabien Meghazi (OpenERP)

[ADD] Restore timestamp in Reload

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'addons/web/controllers/main.py'
2--- addons/web/controllers/main.py 2013-03-06 10:07:01 +0000
3+++ addons/web/controllers/main.py 2013-03-07 17:38:22 +0000
4@@ -15,6 +15,7 @@
5 import time
6 import urllib
7 import urllib2
8+import urlparse
9 import xmlrpclib
10 import zlib
11 from xml.etree import ElementTree
12@@ -92,16 +93,50 @@
13 dbs = [i for i in dbs if re.match(r, i)]
14 return dbs
15
16-def db_monodb(req):
17- # if only one db exists, return it else return False
18+def db_monodb_redirect(req):
19+ db = False
20+ redirect = False
21+
22+ # 1 try the db in the url
23+ db_url = req.params.get('db')
24+ if db_url:
25+ return (db_url, False)
26+
27 try:
28 dbs = db_list(req)
29- if len(dbs) == 1:
30- return dbs[0]
31 except xmlrpclib.Fault:
32 # ignore access denied
33- pass
34- return False
35+ dbs = []
36+
37+ # 2 use the database from the cookie if it's listable and still listed
38+ cookie_db = req.httprequest.cookies.get('last_used_database')
39+ if cookie_db in dbs:
40+ db = cookie_db
41+
42+ # 3 use the first db
43+ if dbs and not db:
44+ db = dbs[0]
45+
46+ # redirect to the chosen db if multiple are available
47+ if db and len(dbs) > 1:
48+ query = dict(urlparse.parse_qsl(req.httprequest.query_string, keep_blank_values=True))
49+ query.update({ 'db': db })
50+ redirect = req.httprequest.path + '?' + urllib.urlencode(query)
51+ return (db, redirect)
52+
53+def db_monodb(req):
54+ # if only one db exists, return it else return False
55+ return db_monodb_redirect(req)[0]
56+
57+def redirect_with_hash(req, url, code=303):
58+ if req.httprequest.user_agent.browser == 'msie':
59+ try:
60+ version = float(req.httprequest.user_agent.version)
61+ if version < 10:
62+ return "<html><head><script>window.location = '%s#' + location.hash;</script></head></html>" % url
63+ except Exception:
64+ pass
65+ return werkzeug.utils.redirect(url, code)
66
67 def module_topological_sort(modules):
68 """ Return a list of module names sorted so that their dependencies of the
69@@ -292,6 +327,10 @@
70 return r
71
72 def manifest_list(req, extension, mods=None, db=None):
73+ """ list ressources to load specifying either:
74+ mods: a comma separated string listing modules
75+ db: a database name (return all installed modules in that database)
76+ """
77 if not req.debug:
78 path = '/web/webclient/' + extension
79 if mods is not None:
80@@ -530,6 +569,10 @@
81
82 @openerpweb.httprequest
83 def index(self, req, s_action=None, db=None, **kw):
84+ db, redir = db_monodb_redirect(req)
85+ if redir:
86+ return redirect_with_hash(req, redir)
87+
88 js = "\n ".join('<script type="text/javascript" src="%s"></script>' % i for i in manifest_list(req, 'js', db=db))
89 css = "\n ".join('<link rel="stylesheet" href="%s">' % i for i in manifest_list(req, 'css', db=db))
90
91
92=== modified file 'addons/web/static/src/js/chrome.js'
93--- addons/web/static/src/js/chrome.js 2013-02-27 11:31:32 +0000
94+++ addons/web/static/src/js/chrome.js 2013-03-07 17:38:22 +0000
95@@ -478,7 +478,16 @@
96 'login': 'admin',
97 'password': form_obj['create_admin_pwd'],
98 'login_successful': function() {
99- self.do_action("reload");
100+ var action = {
101+ type: "ir.actions.client",
102+ tag: 'reload',
103+ params: {
104+ url_search : {
105+ db: form_obj['db_name'],
106+ },
107+ }
108+ };
109+ self.do_action(action);
110 },
111 },
112 _push_me: false,
113@@ -589,6 +598,11 @@
114 instance.web.Login = instance.web.Widget.extend({
115 template: "Login",
116 remember_credentials: true,
117+ events: {
118+ 'change input[name=db],select[name=db]': function(ev) {
119+ this.set('database_selector', $(ev.currentTarget).val());
120+ },
121+ },
122
123 init: function(parent, action) {
124 this._super(parent);
125@@ -600,18 +614,18 @@
126 if (_.isEmpty(this.params)) {
127 this.params = $.bbq.getState(true);
128 }
129+ if (action && action.params && action.params.db) {
130+ this.params.db = action.params.db;
131+ } else if ($.deparam.querystring().db) {
132+ this.params.db = $.deparam.querystring().db;
133+ }
134+ if (this.params.db) {
135+ this.selected_db = this.params.db;
136+ }
137
138 if (this.params.login_successful) {
139 this.on('login_successful', this, this.params.login_successful);
140 }
141-
142- if (this.has_local_storage && this.remember_credentials) {
143- this.selected_db = localStorage.getItem('last_db_login_success');
144- this.selected_login = localStorage.getItem('last_login_login_success');
145- if (jQuery.deparam(jQuery.param.querystring()).debug !== undefined) {
146- this.selected_password = localStorage.getItem('last_password_login_success');
147- }
148- }
149 },
150 start: function() {
151 var self = this;
152@@ -619,10 +633,10 @@
153 self.$el.find('.oe_login_manage_db').click(function() {
154 self.do_action("database_manager");
155 });
156+ self.on('change:database_selector', this, function() {
157+ this.database_selected(this.get('database_selector'));
158+ });
159 var d = $.when();
160- if ($.deparam.querystring().db) {
161- self.params.db = $.deparam.querystring().db;
162- }
163 if ($.param.fragment().token) {
164 self.params.token = $.param.fragment().token;
165 }
166@@ -630,16 +644,44 @@
167 if (self.params.db && self.params.login && self.params.password) {
168 d = self.do_login(self.params.db, self.params.login, self.params.password);
169 } else {
170- if (self.params.db) {
171- self.on_db_loaded([self.params.db])
172- } else {
173- d = self.rpc("/web/database/get_list", {}).done(self.on_db_loaded).fail(self.on_db_failed);
174- }
175+ d = self.rpc("/web/database/get_list", {})
176+ .done(self.on_db_loaded)
177+ .fail(self.on_db_failed)
178+ .always(function() {
179+ if (self.selected_db && self.has_local_storage && self.remember_credentials) {
180+ self.$("[name=login]").val(localStorage.getItem(self.selected_db + '|last_login') || '');
181+ if (self.session.debug) {
182+ self.$("[name=password]").val(localStorage.getItem(self.selected_db + '|last_password') || '');
183+ }
184+ }
185+ });
186 }
187 return d;
188 },
189+ remember_last_used_database: function(db) {
190+ // This cookie will be used server side in order to avoid db reloading on first visit
191+ var ttl = 24 * 60 * 60 * 365;
192+ document.cookie = [
193+ 'last_used_database=' + db,
194+ 'path=/',
195+ 'max-age=' + ttl,
196+ 'expires=' + new Date(new Date().getTime() + ttl * 1000).toGMTString()
197+ ].join(';');
198+ },
199+ database_selected: function(db) {
200+ var params = $.deparam.querystring();
201+ params.db = db;
202+ this.remember_last_used_database(db);
203+ this.$('.oe_login_dbpane').empty().text(_t('Loading...'));
204+ this.$('[name=login], [name=password]').prop('readonly', true);
205+ instance.web.redirect('/?' + $.param(params));
206+ },
207 on_db_loaded: function (result) {
208+ var self = this;
209 this.db_list = result;
210+ if (!this.selected_db) {
211+ this.selected_db = result[0];
212+ }
213 this.$("[name=db]").replaceWith(QWeb.render('Login.dblist', { db_list: this.db_list, selected_db: this.selected_db}));
214 if(this.db_list.length === 0) {
215 this.do_action("database_manager");
216@@ -680,17 +722,11 @@
217 self.hide_error();
218 self.$(".oe_login_pane").fadeOut("slow");
219 return this.session.session_authenticate(db, login, password).then(function() {
220- if (self.has_local_storage) {
221- if(self.remember_credentials) {
222- localStorage.setItem('last_db_login_success', db);
223- localStorage.setItem('last_login_login_success', login);
224- if (jQuery.deparam(jQuery.param.querystring()).debug !== undefined) {
225- localStorage.setItem('last_password_login_success', password);
226- }
227- } else {
228- localStorage.setItem('last_db_login_success', '');
229- localStorage.setItem('last_login_login_success', '');
230- localStorage.setItem('last_password_login_success', '');
231+ self.remember_last_used_database(db);
232+ if (self.has_local_storage && self.remember_credentials) {
233+ localStorage.setItem(db + '|last_login', login);
234+ if (self.session.debug) {
235+ localStorage.setItem(db + '|last_password', password);
236 }
237 }
238 self.trigger('login_successful');
239@@ -748,6 +784,9 @@
240
241 var sobj = $.deparam(l.search.substr(1));
242 sobj.ts = new Date().getTime();
243+ if (params.url_search) {
244+ sobj = _.extend(sobj, params.url_search);
245+ }
246 var search = '?' + $.param(sobj);
247
248 var hash = l.hash;
249
250=== modified file 'addons/web/static/src/js/coresetup.js'
251--- addons/web/static/src/js/coresetup.js 2012-12-27 07:44:38 +0000
252+++ addons/web/static/src/js/coresetup.js 2013-03-07 17:38:22 +0000
253@@ -89,6 +89,10 @@
254 });
255 },
256 session_is_valid: function() {
257+ var db = $.deparam.querystring().db;
258+ if (db && this.db !== db) {
259+ return false;
260+ }
261 return !!this.uid;
262 },
263 /**
264
265=== modified file 'addons/web/static/src/xml/base.xml'
266--- addons/web/static/src/xml/base.xml 2013-03-06 15:13:06 +0000
267+++ addons/web/static/src/xml/base.xml 2013-03-07 17:38:22 +0000
268@@ -71,9 +71,9 @@
269 </div>
270 <ul>
271 <li>Username</li>
272- <li><input name="login" type="text" t-att-value="widget.selected_login || ''" autofocus="autofocus"/></li>
273+ <li><input name="login" type="text" value="" autofocus="autofocus"/></li>
274 <li>Password</li>
275- <li><input name="password" type="password" t-att-value="widget.selected_password || ''"/></li>
276+ <li><input name="password" type="password" value=""/></li>
277 <li><button name="submit">Log in</button></li>
278 </ul>
279 </form>