diff options
| author | Xavier Morel <xmo@openerp.com> | 2013-11-26 17:01:48 +0100 |
|---|---|---|
| committer | Xavier Morel <xmo@openerp.com> | 2013-11-26 17:01:48 +0100 |
| commit | 44af6d1e09aa3bec6967ac3eb4e67b3e9215fb08 (patch) | |
| tree | edd62496333fd12960b2b3a3a5f111c72b54314a | |
| parent | b3061b910357a320aae568efe68fbe7561b7ea3e (diff) | |
[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
| -rw-r--r-- | addons/website/controllers/main.py | 7 | ||||
| -rw-r--r-- | addons/website/models/website.py | 22 | ||||
| -rw-r--r-- | addons/website/static/src/js/website.editor.js | 52 | ||||
| -rw-r--r-- | addons/website/static/src/xml/website.xml | 13 | ||||
| -rw-r--r-- | addons/website/views/website_templates.xml | 36 |
5 files changed, 103 insertions, 27 deletions
diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index c5628765ed8..a214e6cd334 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -53,7 +53,12 @@ class Website(openerp.addons.web.controllers.main.Home): path = web.new_page(request.cr, request.uid, path, context=request.context) except psycopg2.IntegrityError: logger.exception('Unable to create ir_model_data for page %s', path) - return werkzeug.exceptions.InternalServerError() + response = request.website.render('website.creation_failed', { + 'page': path, + 'path': '/page/' + request.website.page_for_name(name=path) + }) + response.status_code = 409 + return response url = "/page/" + path if noredirect is not NOPE: return werkzeug.wrappers.Response(url, mimetype='text/plain') diff --git a/addons/website/models/website.py b/addons/website/models/website.py index 43b0be03831..62844305403 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -143,6 +143,20 @@ class website(osv.osv): cr.execute("ROLLBACK TO SAVEPOINT new_page") raise + def page_for_name(self, cr, uid, ids, name, module='website', context=None): + # whatever + return '%s.%s' % (module, slugify(name, max_length=50)) + + def page_exists(self, cr, uid, ids, name, module='website', context=None): + page = self.page_for_name(cr, uid, ids, name, module=module, context=context) + + try: + return self.get_template( + cr, uid, ids, template=page, context=context + ).exists() + except: + return False + def get_public_user(self, cr, uid, context=None): if not self.public_user: uid = openerp.SUPERUSER_ID @@ -185,14 +199,14 @@ class website(osv.osv): }) def get_template(self, cr, uid, ids, template, context=None): - IMD = self.pool.get("ir.model.data") + IMD = self.pool["ir.model.data"] try: module, xmlid = template.split('.', 1) - view_ref = IMD.get_object_reference(cr, uid, module, xmlid) + model, id = IMD.get_object_reference(cr, uid, module, xmlid) except ValueError: # catches both unpack errors and gor errors module, xmlid = 'website', template - view_ref = IMD.get_object_reference(cr, uid, module, xmlid) - return self.pool.get("ir.ui.view").browse(cr, uid, view_ref[1]) + model, id = IMD.get_object_reference(cr, uid, module, xmlid) + return self.pool["ir.ui.view"].browse(cr, uid, id, context=context) def _render(self, cr, uid, ids, template, values=None, context=None): user = self.pool.get("res.users") 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(), }); }, }); diff --git a/addons/website/static/src/xml/website.xml b/addons/website/static/src/xml/website.xml index b35dd8a9cfc..d5368ec7b94 100644 --- a/addons/website/static/src/xml/website.xml +++ b/addons/website/static/src/xml/website.xml @@ -72,16 +72,21 @@ <button title="Close" type="button" class="close" data-dismiss="modal">×</button> <div class="h2"><t t-esc="title"/></div> </div> - <div class="modal-body"> + <div class="modal-body" t-if="message or backend_url"> <section> <t t-esc="message"/> </section> - <section class="mt32"> - You have encountered an error. You can edit in the <a t-att-href="backend_url">backend</a> this data. + <section class="mt32" t-if="backend_url"> + <p>The web site has encountered an error.</p> + <p> + It might be possible to edit the relevant items + or fix the issue in <a t-href="#{backend_url}"> + the classic OpenERP interface</a>. + </p> </section> </div> <div class="modal-footer"> - <button type="button" data-dismiss="modal" href="#" class="close btn btn-default">Close</button> + <button type="button" data-dismiss="modal" class="btn btn-primary">Close</button> </div> </div> </div> diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index 375cac64dfb..da9f80375f4 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -629,5 +629,41 @@ Sitemap: <t t-esc="url_root"/>sitemap.xml </t> </template> + <template id="creation_failed"> + <t t-call="website.layout"> + <div id="wrap"> + <div class="oe_structure"> + <div class="container"> + <h1 class="text-center"> + The page "<em><t t-esc="page"/></em>" + already exists + </h1> + <h3 class="text-center text-muted">We could not create it.</h3> + <ul> + <li> + You can <a t-href="#{path}">visit the existing page</a> + </li> + <li>Or you can <a href="#" class="create-new-page"> + create an other page.</a></li> + </ul> + </div> + </div> + </div> + <script type="application/javascript"> + $(document.body).on('click', 'a.create-new-page', function (e) { + e.preventDefault(); + openerp.website.prompt({ + window_title: "New Page", + input: "Page Title", + }).then(function (val) { + if (val) { + document.location = '/pagenew/' + encodeURI(val); + } + }); + }); + </script> + </t> + </template> + </data> </openerp> |
