+
diff --git a/addons/survey/security/ir.model.access.csv b/addons/survey/security/ir.model.access.csv
index 89c001ce44e..e49c976ea1f 100644
--- a/addons/survey/security/ir.model.access.csv
+++ b/addons/survey/security/ir.model.access.csv
@@ -1,11 +1,11 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-access_survey_public,survey.survey public,model_survey_survey,base.group_public,1,0,0,0
-access_survey_page_public,survey.page public,model_survey_page,base.group_public,1,0,0,0
-access_survey_question_public,survey.question public,model_survey_question,base.group_public,1,0,0,0
-access_survey_label_public,survey.label public,model_survey_label,base.group_public,1,0,0,0
-access_survey_user_input_public,survey.user_input public,model_survey_user_input,base.group_public,1,1,1,0
-access_survey_user_input_line_public,survey.user_input_line public,model_survey_user_input_line,base.group_public,1,1,1,0
-access_survey_stage_public,survey.stage public,model_survey_stage,base.group_public,1,0,0,0
+access_survey_public,survey.survey public,model_survey_survey,,1,0,0,0
+access_survey_page_public,survey.page public,model_survey_page,,1,0,0,0
+access_survey_question_public,survey.question public,model_survey_question,,1,0,0,0
+access_survey_label_public,survey.label public,model_survey_label,,1,0,0,0
+access_survey_user_input_public,survey.user_input public,model_survey_user_input,,1,1,1,0
+access_survey_user_input_line_public,survey.user_input_line public,model_survey_user_input_line,,1,1,1,0
+access_survey_stage_public,survey.stage public,model_survey_stage,,1,0,0,0
access_survey_user,survey.survey user,model_survey_survey,base.group_survey_user,1,0,0,0
access_survey_page_user,survey.page user,model_survey_page,base.group_survey_user,1,0,0,0
access_survey_question_user,survey.question user,model_survey_question,base.group_survey_user,1,0,0,0
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index ffe9d268240..a4ecc4e17d9 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -2596,6 +2596,7 @@ instance.web.form.FieldCharDomain = instance.web.form.AbstractField.extend(insta
this.$('.select_records').on('click', self.on_click);
},
on_click: function(ev) {
+ event.preventDefault();
var self = this;
var model = this.options.model || this.field_manager.get_field_value(this.options.model_field);
this.pop = new instance.web.form.SelectCreatePopup(this);
@@ -2614,15 +2615,14 @@ instance.web.form.FieldCharDomain = instance.web.form.AbstractField.extend(insta
});
}
else {
- var domain = ["id", "in", element_ids];
+ var domain = [["id", "in", element_ids]];
var domain_done = $.Deferred().resolve(domain);
}
$.when(domain_done).then(function (domain) {
var domain = self.pop.dataset.domain.concat(domain || []);
- self.set_value(JSON.stringify(domain))
+ self.set_value(domain);
});
});
- event.preventDefault();
},
});
@@ -4463,7 +4463,11 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
else
return $.when();
}).done(function () {
- if (!self.o2m.options.reload_on_button) {
+ var ds = self.o2m.dataset;
+ var cached_records = _.any([ds.to_create, ds.to_delete, ds.to_write], function(value) {
+ return value.length;
+ });
+ if (!self.o2m.options.reload_on_button && !cached_records) {
self.handle_button(name, id, callback);
}else {
self.handle_button(name, id, function(){
diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js
index 753d52d497a..c6e28301c42 100644
--- a/addons/web/static/src/js/views.js
+++ b/addons/web/static/src/js/views.js
@@ -436,6 +436,16 @@ instance.web.ActionManager = instance.web.Widget.extend({
ir_actions_act_window: function (action, options) {
var self = this;
+ if (action.target === 'current'){
+ action.context['active_model'] = action.res_model;
+ if (action.res_id){
+ action.context['active_id'] = action.res_id;
+ action.context['active_ids'] = [action.res_id];
+ } else{
+ delete action.context['active_id'];
+ delete action.context['active_ids'];
+ }
+ }
return this.ir_actions_common({
widget: function () { return new instance.web.ViewManagerAction(self, action); },
action: action,
diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py
index 39f3067720f..446080875a6 100644
--- a/addons/website/controllers/main.py
+++ b/addons/website/controllers/main.py
@@ -378,7 +378,7 @@ class Website(openerp.addons.web.controllers.main.Home):
"""
response = werkzeug.wrappers.Response()
return request.registry['website']._image(
- request.cr, request.uid, model, id, field, response)
+ request.cr, request.uid, model, id, field, response, max_width, max_height)
#------------------------------------------------------
diff --git a/addons/website/models/ir_http.py b/addons/website/models/ir_http.py
index 360b34c877c..44b3f771f62 100644
--- a/addons/website/models/ir_http.py
+++ b/addons/website/models/ir_http.py
@@ -141,49 +141,50 @@ class ir_http(orm.AbstractModel):
return response
def _handle_exception(self, exception=None, code=500):
- if isinstance(exception, werkzeug.exceptions.HTTPException) and hasattr(exception, 'response') and exception.response:
- return exception.response
+ try:
+ return super(ir_http, self)._handle_exception(exception)
+ except Exception:
- attach = self._serve_attachment()
- if attach:
- return attach
+ attach = self._serve_attachment()
+ if attach:
+ return attach
- if getattr(request, 'website_enabled', False) and request.website:
- values = dict(
- exception=exception,
- traceback=traceback.format_exc(exception),
- )
- if exception:
- code = getattr(exception, 'code', code)
- if isinstance(exception, ir_qweb.QWebException):
- values.update(qweb_exception=exception)
- if isinstance(exception.qweb.get('cause'), openerp.exceptions.AccessError):
- code = 403
- if code == 500:
- logger.error("500 Internal Server Error:\n\n%s", values['traceback'])
- 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]
- values['views'] = to_reset
- elif code == 403:
- logger.warn("403 Forbidden:\n\n%s", values['traceback'])
+ if getattr(request, 'website_enabled', False) and request.website:
+ values = dict(
+ exception=exception,
+ traceback=traceback.format_exc(exception),
+ )
+ if exception:
+ code = getattr(exception, 'code', code)
+ if isinstance(exception, ir_qweb.QWebException):
+ values.update(qweb_exception=exception)
+ if isinstance(exception.qweb.get('cause'), openerp.exceptions.AccessError):
+ code = 403
+ if code == 500:
+ logger.error("500 Internal Server Error:\n\n%s", values['traceback'])
+ 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]
+ values['views'] = to_reset
+ elif code == 403:
+ logger.warn("403 Forbidden:\n\n%s", values['traceback'])
- values.update(
- status_message=werkzeug.http.HTTP_STATUS_CODES[code],
- status_code=code,
- )
+ values.update(
+ status_message=werkzeug.http.HTTP_STATUS_CODES[code],
+ status_code=code,
+ )
- if not request.uid:
- self._auth_method_public()
+ if not request.uid:
+ self._auth_method_public()
- try:
- html = request.website._render('website.%s' % code, values)
- except Exception:
- html = request.website._render('website.http_error', values)
- return werkzeug.wrappers.Response(html, status=code, content_type='text/html;charset=utf-8')
+ try:
+ html = request.website._render('website.%s' % code, values)
+ except Exception:
+ html = request.website._render('website.http_error', values)
+ return werkzeug.wrappers.Response(html, status=code, content_type='text/html;charset=utf-8')
- return super(ir_http, self)._handle_exception(exception)
+ raise
class ModelConverter(ir.ir_http.ModelConverter):
def __init__(self, url_map, model=False, domain='[]'):
diff --git a/addons/website/models/ir_qweb.py b/addons/website/models/ir_qweb.py
index ad2b63a6dd9..0e1fe2beb89 100644
--- a/addons/website/models/ir_qweb.py
+++ b/addons/website/models/ir_qweb.py
@@ -15,6 +15,7 @@ import urllib2
import urlparse
import re
+import werkzeug.urls
import werkzeug.utils
from dateutil import parser
from lxml import etree, html
@@ -265,10 +266,19 @@ class Image(orm.AbstractModel):
if options is None: options = {}
classes = ['img', 'img-responsive'] + options.get('class', '').split()
- return ir_qweb.HTMLSafe('

' % (
+ url_params = {
+ 'model': record._model._name,
+ 'field': field_name,
+ 'id': record.id,
+ }
+ for options_key in ['max_width', 'max_height']:
+ if options.get(options_key):
+ url_params[options_key] = options[options_key]
+
+ return ir_qweb.HTMLSafe('

' % (
' '.join(itertools.imap(werkzeug.utils.escape, classes)),
- record._model._name,
- field_name, record.id))
+ werkzeug.urls.url_encode(url_params)
+ ))
local_url_re = re.compile(r'^/(?P
[^]]+)/static/(?P.+)$')
def from_html(self, cr, uid, model, column, element, context=None):
diff --git a/addons/website/models/website.py b/addons/website/models/website.py
index 433d8644698..db02dcce51e 100644
--- a/addons/website/models/website.py
+++ b/addons/website/models/website.py
@@ -541,7 +541,10 @@ class website(osv.osv):
response.mimetype = Image.MIME[image.format]
w, h = image.size
- max_w, max_h = int(max_width), int(max_height)
+ try:
+ max_w, max_h = int(max_width), int(max_height)
+ except:
+ max_w, max_h = (maxint, maxint)
if w < max_w and h < max_h:
response.data = data
diff --git a/addons/website/static/src/js/website.seo.js b/addons/website/static/src/js/website.seo.js
index 8588b7a3765..1c4bad90ffc 100644
--- a/addons/website/static/src/js/website.seo.js
+++ b/addons/website/static/src/js/website.seo.js
@@ -264,21 +264,21 @@
},
description: function () {
var $description = $('meta[name=description]');
- return ($description.length > 0) && ($description.attr('value') && $description.attr('value').trim());
+ return ($description.length > 0) && ($description.attr('content') && $description.attr('content').trim());
},
changeDescription: function (description) {
// TODO create tag if missing
- $('meta[name=description]').attr('value', description);
+ $('meta[name=description]').attr('content', description);
this.trigger('description-changed', description);
},
keywords: function () {
var $keywords = $('meta[name=keywords]');
- var parsed = ($keywords.length > 0) && $keywords.attr('value') && $keywords.attr('value').split(",");
+ var parsed = ($keywords.length > 0) && $keywords.attr('content') && $keywords.attr('content').split(",");
return (parsed && parsed[0]) ? parsed: [];
},
changeKeywords: function (keywords) {
// TODO create tag if missing
- $('meta[name=keywords]').attr('value', keywords.join(","));
+ $('meta[name=keywords]').attr('content', keywords.join(","));
this.trigger('keywords-changed', keywords);
},
headers: function (tag) {
@@ -296,7 +296,7 @@
});
},
company: function () {
- return $('meta[name="openerp.company"]').attr('value');
+ return $('html').attr('data-oe-company-name');
},
bodyText: function () {
return $('body').children().not('.js_seo_configuration').text();
diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml
index 6226e3a0aa7..56d954e8a35 100644
--- a/addons/website/views/website_templates.xml
+++ b/addons/website/views/website_templates.xml
@@ -61,8 +61,10 @@
t-att-data-editable="'1' if editable else None"
t-att-data-translatable="'1' if translatable else None"
t-att-data-view-xmlid="xmlid if editable else None"
- t-att-data-main-object="repr(main_object) if editable else None">
+ t-att-data-main-object="repr(main_object) if editable else None"
+ t-att-data-oe-company-name="res_company.name">
+
@@ -73,10 +75,9 @@
-
-
-
-
@@ -137,14 +138,14 @@