Merge lp:~openerp-dev/openerp-web/7.0-monodb-login-screen-fme into lp:openerp-web/7.0
- 7.0-monodb-login-screen-fme
- Merge into 7.0
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Christophe Simonis (OpenERP) | Needs Fixing | ||
Review via email: mp+151075@code.launchpad.net |
Commit message
Description of the change
Antony Lesuisse (OpenERP) (al-openerp) wrote : | # |
Christophe Simonis (OpenERP) (kangol) wrote : | # |
1/ in js: use instance.
2/ in py: do not change the api of db_monodb(), create a new function for the purpose of returning a tuple...
Fabien Meghazi (OpenERP) (fme) wrote : | # |
done
PS: the status of this merge proposal is "Work in Progress", not "Needs Review".
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
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
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> |
dont merge it it's wrong i tell you by phone