diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index 5540744e7a7..dcdfdb5114e 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -22,11 +22,8 @@ from openerp.addons.website.models import website from openerp.addons.web import http from openerp.addons.web.http import request, LazyResponse -from ..utils import slugify - logger = logging.getLogger(__name__) -NOPE = object() # Completely arbitrary limits MAX_IMAGE_WIDTH, MAX_IMAGE_HEIGHT = IMAGE_LIMITS = (1024, 768) @@ -51,20 +48,10 @@ class Website(openerp.addons.web.controllers.main.Home): return response @http.route('/pagenew/', type='http', auth="user", website=True) - def pagenew(self, path, noredirect=NOPE): - web = request.registry['website'] - try: - 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) - 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: + def pagenew(self, path, noredirect=False): + xml_id = request.registry['website'].new_page(request.cr, request.uid, path, context=request.context) + url = "/page/" + xml_id + if noredirect: return werkzeug.wrappers.Response(url, mimetype='text/plain') return werkzeug.utils.redirect(url) diff --git a/addons/website/models/website.py b/addons/website/models/website.py index bcf2526596c..1f0aa092369 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- import fnmatch import inspect +import itertools import logging import math -import itertools +import re import urllib import urlparse @@ -11,13 +12,16 @@ import simplejson import werkzeug import werkzeug.exceptions import werkzeug.wrappers +# optional python-slugify import (https://github.com/un33k/python-slugify) +try: + import slugify as slugify_lib +except ImportError: + slugify_lib = None import openerp from openerp.osv import orm, osv, fields from openerp.tools.safe_eval import safe_eval - from openerp.addons.web.http import request, LazyResponse -from ..utils import slugify logger = logging.getLogger(__name__) @@ -49,6 +53,13 @@ def url_for(path_or_uri, lang=None, keep_query=None): return location +def slugify(s, max_length=None): + if slugify_lib: + return slugify_lib.slugify(s, max_length) + spaceless = re.sub(r'\s+', '-', s) + specialless = re.sub(r'[^-_A-Za-z0-9]', '', spaceless) + return specialless[:max_length] + def slug(value): if isinstance(value, orm.browse_record): # [(id, name)] = value.name_get() @@ -117,37 +128,36 @@ class website(osv.osv): return super(website, self).write(cr, uid, ids, vals, context) def new_page(self, cr, uid, name, template='website.default_page', ispage=True, context=None): - context=context or {} - # completely arbitrary max_length - idname = slugify(name, max_length=50) - + context = context or {} imd = self.pool.get('ir.model.data') view = self.pool.get('ir.ui.view') + template_module, template_name = template.split('.') - module, tmp_page = template.split('.') - view_model, view_id = imd.get_object_reference(cr, uid, module, tmp_page) + # completely arbitrary max_length + page_name = slugify(name, max_length=50) + page_xmlid = "%s.%s" % (template_module, page_name) - cr.execute('SAVEPOINT new_page') try: - newview_id = view.copy(cr, uid, view_id, context=context) - newview = view.browse(cr, uid, newview_id, context=context) - newview.write({ - 'arch': newview.arch.replace(template, "%s.%s" % (module, idname)), - 'name': name, + # existing page + imd.get_object_reference(cr, uid, template_module, page_name) + except ValueError: + # new page + _, template_id = imd.get_object_reference(cr, uid, template_module, template_name) + page_id = view.copy(cr, uid, template_id, context=context) + page = view.browse(cr, uid, page_id, context=context) + page.write({ + 'arch': page.arch.replace(template, page_xmlid), + 'name': page_name, 'page': ispage, }) imd.create(cr, uid, { - 'name': idname, - 'module': module, + 'name': page_name, + 'module': template_module, 'model': 'ir.ui.view', - 'res_id': newview_id, + 'res_id': page_id, 'noupdate': True }, context=context) - cr.execute('RELEASE SAVEPOINT new_page') - return "%s.%s" % (module, idname) - except: - cr.execute("ROLLBACK TO SAVEPOINT new_page") - raise + return page_xmlid def page_for_name(self, cr, uid, ids, name, module='website', context=None): # whatever diff --git a/addons/website/static/src/js/website.editor.js b/addons/website/static/src/js/website.editor.js index 3f253e9b34c..55ab6e8fcad 100644 --- a/addons/website/static/src/js/website.editor.js +++ b/addons/website/static/src/js/website.editor.js @@ -1072,7 +1072,7 @@ } else { // Create the page, get the URL back done = $.get(_.str.sprintf( - '/pagenew/%s?noredirect', encodeURI(data.id))) + '/pagenew/%s?noredirect=1', encodeURI(data.id))) .then(function (response) { self.make_link(response, false, data.id); }); diff --git a/addons/website/utils.py b/addons/website/utils.py deleted file mode 100644 index 98f00319f60..00000000000 --- a/addons/website/utils.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -import re - -__all__ = ['slugify'] - -try: - # use python-slugify (https://github.com/un33k/python-slugify) if available - from slugify import slugify -except ImportError: - def slugify(s, max_length=None): - spaceless = re.sub(r'\s+', '-', s) - specialless = re.sub(r'[^-_A-Za-z0-9]', '', spaceless) - return specialless[:max_length] diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index 8fd310b0cc5..97e1c1d9fdb 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -715,42 +715,6 @@ Sitemap: sitemap.xml - -