diff --git a/addons/auth_signup/controllers/main.py b/addons/auth_signup/controllers/main.py index 650268755e5..d1e58facf7f 100644 --- a/addons/auth_signup/controllers/main.py +++ b/addons/auth_signup/controllers/main.py @@ -22,9 +22,11 @@ import logging import openerp import openerp.addons.web.controllers.main as webmain +from openerp.addons.auth_signup.res_users import SignupError from openerp import http from openerp.http import request, LazyResponse from openerp.tools.translate import _ +from openerp.tools import exception_to_unicode _logger = logging.getLogger(__name__) @@ -77,15 +79,22 @@ class Home(openerp.addons.web.controllers.main.Home): res_users.reset_password(request.cr, openerp.SUPERUSER_ID, login) qcontext['message'] = _("An email has been sent with credentials to reset your password") response.params['template'] = 'web.login' - except: + except Exception: qcontext['error'] = _("Could not reset your password") _logger.exception('error when resetting password') else: values = dict((key, qcontext.get(key)) for key in ('login', 'name', 'password')) - res_users.signup(request.cr, openerp.SUPERUSER_ID, values, token) - request.cr.commit() + try: + self._signup_with_values(token, values) + request.cr.commit() + except SignupError, e: + qcontext['error'] = exception_to_unicode(e) return super(Home, self).web_login(*args, **kw) return response + def _signup_with_values(self, token, values): + request.registry['res.users'].signup(request.cr, openerp.SUPERUSER_ID, values, token) + + # vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/stock/product_view.xml b/addons/stock/product_view.xml index 582149760b4..11f970d6ddb 100644 --- a/addons/stock/product_view.xml +++ b/addons/stock/product_view.xml @@ -122,9 +122,9 @@ - - - + + + diff --git a/addons/stock/wizard/stock_fill_inventory.py b/addons/stock/wizard/stock_fill_inventory.py index 47ac45a90ac..aa31580cf2d 100644 --- a/addons/stock/wizard/stock_fill_inventory.py +++ b/addons/stock/wizard/stock_fill_inventory.py @@ -28,7 +28,7 @@ class stock_fill_inventory(osv.osv_memory): _description = "Import Inventory" def _default_location(self, cr, uid, ids, context=None): - location = self.pool.get('ir.model.data').get_object(cr, uid, 'stock', 'stock_location_stock') + location = self.pool.get('ir.model.data').get_object(cr, uid, 'stock', 'stock_location_stock', raise_exception=False) if not location.exists(): return False try: 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/static/src/js/website.snippets.animation.js b/addons/website/static/src/js/website.snippets.animation.js index 7d3b84f2254..60c5aea49e2 100644 --- a/addons/website/static/src/js/website.snippets.animation.js +++ b/addons/website/static/src/js/website.snippets.animation.js @@ -3,21 +3,28 @@ var website = openerp.website; website.snippet = {}; + website.snippet.readyAnimation = []; website.snippet.start_animation = function () { - $("[data-snippet-id]").each(function() { - var $snipped_id = $(this); - if ( !$snipped_id.parents("#oe_snippets").length && - !$snipped_id.parent("body").length && - !$snipped_id.data("snippet-view") && - website.snippet.animationRegistry[$snipped_id.data("snippet-id")]) { - var snippet = new website.snippet.animationRegistry[$snipped_id.data("snippet-id")]($snipped_id); - $snipped_id.data("snippet-view", snippet); + for (var k in website.snippet.animationRegistry) { + var Animation = website.snippet.animationRegistry[k]; + var selector = "[data-snippet-id='"+k+"']"; + if (Animation.prototype.selector) { + selector += ", " + Animation.prototype.selector; } - }); + $(selector).each(function() { + var $snipped_id = $(this); + if ( !$snipped_id.parents("#oe_snippets").length && + !$snipped_id.parent("body").length && + !$snipped_id.data("snippet-view")) { + website.snippet.readyAnimation.push($snipped_id); + $snipped_id.data("snippet-view", new Animation($snipped_id)); + } + }); + } }; website.snippet.stop_animation = function () { - $("[data-snippet-id]").each(function() { + $(website.snippet.readyAnimation).each(function() { var $snipped_id = $(this); if ($snipped_id.data("snippet-view")) { $snipped_id.data("snippet-view").stop(); @@ -30,6 +37,7 @@ website.snippet.animationRegistry = {}; website.snippet.Animation = openerp.Class.extend({ + selector: false, $: function () { return this.$el.find.apply(this.$el, arguments); }, @@ -51,14 +59,15 @@ }, }); - website.snippet.animationRegistry.carousel = website.snippet.animationRegistry.slider = website.snippet.Animation.extend({ + selector: ".carousel", start: function () { this.$target.carousel({interval: 10000}); }, }); website.snippet.animationRegistry.parallax = website.snippet.Animation.extend({ + parallax: ".parallax", start: function () { var self = this; setTimeout(function () {self.set_values();}); 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 b03238739a0..fa67365b2e8 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -716,42 +716,6 @@ Sitemap: sitemap.xml - -