From 44af6d1e09aa3bec6967ac3eb4e67b3e9215fb08 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 26 Nov 2013 17:01:48 +0100 Subject: [IMP] significantly improve handling of trying to create a new page which already exists # Through the menu Rather than output a generic error (500 due to an IntegrityError), return a templated 409 letting the user either visit the page-which-already-exists-with-the-name-he'd-picked or open the page creation dialog again for a second round. An alternative would be to promote the website.prompt use to full-blown dialog as a result of selecting "New Page" and handle the "page already exists" case without even closing the dialog. # Through the link dialog Added an RPC call to check if a page already exists (essentially a cheaper version of opening /page/whatever and checking whether it's a 200 over JSON-RPC), if the page matching the completion term already exists, do *not* add the choice of creating the page, only provide completions from existing pages. bzr revid: xmo@openerp.com-20131126160148-wrk4zvz9istscwa0 --- addons/website/static/src/js/website.editor.js | 52 +++++++++++++++++--------- 1 file changed, 34 insertions(+), 18 deletions(-) (limited to 'addons/website/static/src/js/website.editor.js') diff --git a/addons/website/static/src/js/website.editor.js b/addons/website/static/src/js/website.editor.js index 52b3f19e1ba..c50ad392887 100644 --- a/addons/website/static/src/js/website.editor.js +++ b/addons/website/static/src/js/website.editor.js @@ -888,7 +888,8 @@ this._super(editor); this.text = null; // Store last-performed request to be able to cancel/abort it. - this.req = null; + this.page_exists_req = null; + this.search_pages_req = null; }, start: function () { var self = this; @@ -896,15 +897,20 @@ minimumInputLength: 1, placeholder: _t("New or existing page"), query: function (q) { - self.fetch_pages(q.term).then(function (results) { + $.when( + self.page_exists(q.term), + self.fetch_pages(q.term) + ).then(function (exists, results) { var rs = _.map(results, function (r) { return { id: r.url, text: r.name, }; }); - rs.push({ - create: true, - id: q.term, - text: _.str.sprintf(_t("Create page '%s'"), q.term), - }); + if (!exists) { + rs.push({ + create: true, + id: q.term, + text: _.str.sprintf(_t("Create page '%s'"), q.term), + }); + } q.callback({ more: false, results: rs @@ -983,20 +989,30 @@ .siblings().removeClass('active') .addBack().removeClass('has-error'); }, - fetch_pages: function (term) { + call: function (method, args, kwargs) { var self = this; - if (this.req) { this.req.abort(); } - return this.req = openerp.jsonRpc('/web/dataset/call_kw', 'call', { + var req = method + '_req'; + + if (this[req]) { this[req].abort(); } + + return this[req] = openerp.jsonRpc('/web/dataset/call_kw', 'call', { model: 'website', - method: 'search_pages', - args: [null, term], - kwargs: { - limit: 9, - context: website.get_context() - }, + method: method, + args: args, + kwargs: kwargs, }).always(function () { - // request completed -> unstore it - self.req = null; + self[req] = null; + }); + }, + page_exists: function (term) { + return this.call('page_exists', [null, term], { + context: website.get_context(), + }); + }, + fetch_pages: function (term) { + return this.call('search_pages', [null, term], { + limit: 9, + context: website.get_context(), }); }, }); -- cgit v1.2.3