diff --git a/addons/survey/views/survey_templates.xml b/addons/survey/views/survey_templates.xml
index de186b85b92..b49a48d2a53 100644
--- a/addons/survey/views/survey_templates.xml
+++ b/addons/survey/views/survey_templates.xml
@@ -8,7 +8,7 @@
Thank you!
-
+
You scored points.
diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js
index ef3aedb7cf3..b0e22f918c8 100644
--- a/addons/web/static/src/js/chrome.js
+++ b/addons/web/static/src/js/chrome.js
@@ -185,12 +185,12 @@ instance.web.Dialog = instance.web.Widget.extend({
close: function(reason) {
if (this.dialog_inited && !this.__tmp_dialog_hiding) {
$('.tooltip').remove(); //remove open tooltip if any to prevent them staying when modal has disappeared
- this.trigger("closing", reason);
if (this.$el.is(":data(bs.modal)")) { // may have been destroyed by closing signal
this.__tmp_dialog_hiding = true;
this.$dialog_box.modal('hide');
this.__tmp_dialog_hiding = undefined;
}
+ this.trigger("closing", reason);
}
},
_closing: function() {
diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js
index 8a6c8def9ca..ac51a3445f2 100644
--- a/addons/web/static/src/js/views.js
+++ b/addons/web/static/src/js/views.js
@@ -691,8 +691,8 @@ instance.web.ViewManager = instance.web.Widget.extend({
var container = this.$el.find("> div > div > .oe_view_manager_body > .oe_view_manager_view_" + view_type);
var view_promise = controller.appendTo(container);
this.views[view_type].controller = controller;
- this.views[view_type].deferred.resolve(view_type);
return $.when(view_promise).done(function() {
+ self.views[view_type].deferred.resolve(view_type);
if (self.searchview
&& self.flags.auto_search
&& view.controller.searchable !== false) {
@@ -1122,7 +1122,7 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({
);
}
- $.when(defs).done(function() {
+ $.when(this.views[this.active_view] ? this.views[this.active_view].deferred : $.when(), defs).done(function() {
self.views[self.active_view].controller.do_load_state(state, warm);
});
},
diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py
index 5d1dbe04bec..22ec7f1fd02 100644
--- a/addons/website/controllers/main.py
+++ b/addons/website/controllers/main.py
@@ -191,14 +191,19 @@ class Website(openerp.addons.web.controllers.main.Home):
modules_to_update = []
for temp_id in templates:
view = request.registry['ir.ui.view'].browse(request.cr, request.uid, int(temp_id), context=request.context)
+ if view.page:
+ continue
view.model_data_id.write({
'noupdate': False
})
if view.model_data_id.module not in modules_to_update:
modules_to_update.append(view.model_data_id.module)
- module_obj = request.registry['ir.module.module']
- module_ids = module_obj.search(request.cr, request.uid, [('name', 'in', modules_to_update)], context=request.context)
- module_obj.button_immediate_upgrade(request.cr, request.uid, module_ids, context=request.context)
+
+ if modules_to_update:
+ module_obj = request.registry['ir.module.module']
+ module_ids = module_obj.search(request.cr, request.uid, [('name', 'in', modules_to_update)], context=request.context)
+ if module_ids:
+ module_obj.button_immediate_upgrade(request.cr, request.uid, module_ids, context=request.context)
return request.redirect(redirect)
@http.route('/website/customize_template_get', type='json', auth='user', website=True)
diff --git a/addons/website/models/ir_http.py b/addons/website/models/ir_http.py
index 8521d83630b..8c09c998bd1 100644
--- a/addons/website/models/ir_http.py
+++ b/addons/website/models/ir_http.py
@@ -210,7 +210,7 @@ class ir_http(orm.AbstractModel):
if 'qweb_exception' in values:
view = request.registry.get("ir.ui.view")
views = view._views_get(request.cr, request.uid, exception.qweb['template'], request.context)
- to_reset = [v for v in views if v.model_data_id.noupdate is True]
+ to_reset = [v for v in views if v.model_data_id.noupdate is True and not v.page]
values['views'] = to_reset
elif code == 403:
logger.warn("403 Forbidden:\n\n%s", values['traceback'])
diff --git a/addons/website/static/src/js/website.editor.js b/addons/website/static/src/js/website.editor.js
index f15278ee49f..60076b9664b 100644
--- a/addons/website/static/src/js/website.editor.js
+++ b/addons/website/static/src/js/website.editor.js
@@ -356,7 +356,13 @@
observer.disconnect();
var editor = this.rte.editor;
var root = editor.element && editor.element.$;
- editor.destroy();
+ try {
+ editor.destroy();
+ }
+ catch(err) {
+ // Hack to avoid the lost of all changes because ckeditor fails in destroy
+ console.log("Error in editor.destroy() : " + err.toString() + "\n " + err.stack);
+ }
// FIXME: select editables then filter by dirty?
var defs = this.rte.fetch_editables(root)
.filter('.oe_dirty')
diff --git a/addons/website_blog/models/website_blog.py b/addons/website_blog/models/website_blog.py
index 9953b5f1ac8..5cb6f82e610 100644
--- a/addons/website_blog/models/website_blog.py
+++ b/addons/website_blog/models/website_blog.py
@@ -58,7 +58,7 @@ class BlogPost(osv.Model):
'tag_ids': fields.many2many(
'blog.tag', string='Tags',
),
- 'content': fields.html('Content', translate=True),
+ 'content': fields.html('Content', translate=True, sanitize=False),
# website control
'website_published': fields.boolean(
'Publish', help="Publish on the website", copy=False,
diff --git a/addons/website_crm/controllers/main.py b/addons/website_crm/controllers/main.py
index 5e2d8e75866..d8d437bc045 100644
--- a/addons/website_crm/controllers/main.py
+++ b/addons/website_crm/controllers/main.py
@@ -25,10 +25,19 @@ class contactus(http.Controller):
values.update(kwargs=kwargs.items())
return request.website.render("website.contactus", values)
- def create_lead(self, request, values):
+ def create_lead(self, request, values, kwargs):
""" Allow to be overrided """
return request.registry['crm.lead'].create(request.cr, SUPERUSER_ID, values, request.context)
+ def preRenderThanks(self, request, values, kwargs):
+ """ Allow to be overrided """
+ company = request.website.company_id
+ return {
+ 'google_map_url': self.generate_google_map_url(company.street, company.city, company.zip, company.country_id and company.country_id.name_get()[0][1] or ''),
+ '_values': values,
+ '_kwargs': kwargs,
+ }
+
@http.route(['/crm/contactus'], type='http', auth="public", website=True)
def contactus(self, **kwargs):
def dict_to_str(title, dictvar):
@@ -37,7 +46,7 @@ class contactus(http.Controller):
ret += "\n%s" % field
return ret
- _TECHNICAL = ['show_info'] # Only use for behavior, don't stock it
+ _TECHNICAL = ['show_info', 'view_from', 'view_callback'] # Only use for behavior, don't stock it
_BLACKLIST = ['id', 'create_uid', 'create_date', 'write_uid', 'write_date', 'user_id', 'active'] # Allow in description
_REQUIRED = ['name', 'contact_name', 'email_from', 'description'] # Could be improved including required from model
@@ -56,12 +65,12 @@ class contactus(http.Controller):
if "name" not in kwargs and values.get("contact_name"): # if kwarg.name is empty, it's an error, we cannot copy the contact_name
values["name"] = values.get("contact_name")
# fields validation : Check that required field from model crm_lead exists
- error = set(field for field in _REQUIRED if not kwargs.get(field))
+ error = set(field for field in _REQUIRED if not values.get(field))
values = dict(values, error=error)
if error:
values.update(kwargs=kwargs.items())
- return request.website.render("website.contactus", values)
+ return request.website.render(kwargs.get("view_from", "website.contactus"), values)
try:
values['medium_id'] = request.registry['ir.model.data'].get_object_reference(request.cr, SUPERUSER_ID, 'crm', 'crm_tracking_medium_website')[1]
@@ -82,7 +91,7 @@ class contactus(http.Controller):
post_description.append("%s: %s" % ("REFERER", environ.get("HTTP_REFERER")))
values['description'] += dict_to_str(_("Environ Fields: "), post_description)
- lead_id = self.create_lead(request, dict(values, user_id=False))
+ lead_id = self.create_lead(request, dict(values, user_id=False), kwargs)
if lead_id:
for field_value in post_file:
attachment_value = {
@@ -95,8 +104,5 @@ class contactus(http.Controller):
}
request.registry['ir.attachment'].create(request.cr, SUPERUSER_ID, attachment_value, context=request.context)
- company = request.website.company_id
- values = {
- 'google_map_url': self.generate_google_map_url(company.street, company.city, company.zip, company.country_id and company.country_id.name_get()[0][1] or ''),
- }
- return request.website.render("website_crm.contactus_thanks", values)
+ values = self.preRenderThanks(request, values, kwargs)
+ return request.website.render(kwargs.get("view_callback", "website_crm.contactus_thanks"), values)
diff --git a/addons/website_membership/controllers/main.py b/addons/website_membership/controllers/main.py
index 9947eab4d98..c88fb43da9d 100644
--- a/addons/website_membership/controllers/main.py
+++ b/addons/website_membership/controllers/main.py
@@ -48,7 +48,7 @@ class WebsiteMembership(http.Controller):
('partner.website_description', 'ilike', post_name)]
# group by country, based on all customers (base domain)
- membership_line_ids = membership_line_obj.search(cr, uid, base_line_domain, context=context)
+ membership_line_ids = membership_line_obj.search(cr, SUPERUSER_ID, base_line_domain, context=context)
countries = partner_obj.read_group(
cr, uid, [('member_lines', 'in', membership_line_ids), ("website_published", "=", True)], ["id", "country_id"],
groupby="country_id", orderby="country_id", context=request.context)
@@ -70,8 +70,14 @@ class WebsiteMembership(http.Controller):
'country_id': (0, _("All Countries"))
})
+ # format domain for group_by and memberships
+ membership_ids = product_obj.search(cr, uid, [('membership', '=', True)], order="website_sequence", context=context)
+ memberships = product_obj.browse(cr, uid, membership_ids, context=context)
+ # make sure we don't access to lines with unpublished membershipts
+ line_domain.append(('membership_id', 'in', membership_ids))
+
# displayed membership lines
- membership_line_ids = membership_line_obj.search(cr, uid, line_domain, context=context)
+ membership_line_ids = membership_line_obj.search(cr, SUPERUSER_ID, line_domain, context=context)
membership_lines = membership_line_obj.browse(cr, uid, membership_line_ids, context=context)
membership_lines = sorted(membership_lines, key=lambda x: x.membership_id.website_sequence)
partner_ids = [m.partner.id for m in membership_lines]
@@ -79,10 +85,6 @@ class WebsiteMembership(http.Controller):
partners = dict((p.id, p) for p in partner_obj.browse(request.cr, SUPERUSER_ID, partner_ids, request.context))
- # format domain for group_by and memberships
- membership_ids = product_obj.search(cr, uid, [('membership', '=', True)], order="website_sequence", context=context)
- memberships = product_obj.browse(cr, uid, membership_ids, context=context)
-
# request pager for lines
pager = request.website.pager(url="/members", total=len(membership_line_ids), page=page, step=self._references_per_page, scope=7, url_args=post)
diff --git a/openerp/addons/base/ir/ir_fields.py b/openerp/addons/base/ir/ir_fields.py
index 79ede18e4ed..494111d812c 100644
--- a/openerp/addons/base/ir/ir_fields.py
+++ b/openerp/addons/base/ir/ir_fields.py
@@ -11,7 +11,8 @@ import pytz
from openerp.osv import orm
from openerp.tools.translate import _
from openerp.tools.misc import DEFAULT_SERVER_DATE_FORMAT,\
- DEFAULT_SERVER_DATETIME_FORMAT
+ DEFAULT_SERVER_DATETIME_FORMAT,\
+ ustr
from openerp.tools import html_sanitize
REFERENCING_FIELDS = set([None, 'id', '.id'])
@@ -263,6 +264,7 @@ class ir_fields_converter(orm.Model):
# Or just copy context & remove lang?
selection = selection(model, cr, uid, context=None)
for item, label in selection:
+ label = ustr(label)
labels = self._get_translations(
cr, uid, ('selection', 'model', 'code'), label, context=context)
labels.append(label)
@@ -271,8 +273,8 @@ class ir_fields_converter(orm.Model):
raise ValueError(
_(u"Value '%s' not found in selection field '%%(field)s'") % (
value), {
- 'moreinfo': [label or unicode(item) for item, label in selection
- if label or item]
+ 'moreinfo': [_label or unicode(item) for item, _label in selection
+ if _label or item]
})
diff --git a/openerp/addons/base/ir/ir_values.py b/openerp/addons/base/ir/ir_values.py
index f34f02a8aec..4720f601f49 100644
--- a/openerp/addons/base/ir/ir_values.py
+++ b/openerp/addons/base/ir/ir_values.py
@@ -319,10 +319,10 @@ class ir_values(osv.osv):
(SELECT company_id from res_users where id = %%s)
)
%s
- ORDER BY v.user_id, u.company_id, v.key2"""
+ ORDER BY v.user_id, u.company_id"""
params = ('default', model, uid, uid)
if condition:
- query %= 'AND (v.key2 = %s OR v.key2 IS NULL)'
+ query %= 'AND v.key2 = %s'
params += (condition[:200],)
else:
query %= 'AND v.key2 is NULL'
diff --git a/openerp/tools/safe_eval.py b/openerp/tools/safe_eval.py
index 94d417c9e84..2d548fff406 100644
--- a/openerp/tools/safe_eval.py
+++ b/openerp/tools/safe_eval.py
@@ -72,7 +72,7 @@ _SAFE_OPCODES = _EXPR_OPCODES.union(set(opmap[x] for x in [
# New in Python 2.7 - http://bugs.python.org/issue4715 :
'JUMP_IF_FALSE_OR_POP', 'JUMP_IF_TRUE_OR_POP', 'POP_JUMP_IF_FALSE',
'POP_JUMP_IF_TRUE', 'SETUP_EXCEPT', 'END_FINALLY',
- 'LOAD_FAST', 'STORE_FAST', 'DELETE_FAST',
+ 'LOAD_FAST', 'STORE_FAST', 'DELETE_FAST', 'UNPACK_SEQUENCE',
'LOAD_GLOBAL', # Only allows access to restricted globals
] if x in opmap))
@@ -300,6 +300,7 @@ def safe_eval(expr, globals_dict=None, locals_dict=None, mode="eval", nocopy=Fal
'range': range,
'xrange': xrange,
'zip': zip,
+ 'Exception': Exception,
}
)
if locals_builtins:
diff --git a/openerp/tools/translate.py b/openerp/tools/translate.py
index 25ee4218d0f..a487b3dd9e3 100644
--- a/openerp/tools/translate.py
+++ b/openerp/tools/translate.py
@@ -796,7 +796,7 @@ def trans_generate(lang, modules, cr):
for bin_path in ['osv', 'report' ]:
path_list.append(os.path.join(config.config['root_path'], bin_path))
- _logger.debug("Scanning modules at paths: ", path_list)
+ _logger.debug("Scanning modules at paths: %s", path_list)
mod_paths = list(path_list)