diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index c71a22cf24e..b120874fc8c 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -8,7 +8,6 @@ font-weight: normal; font-style: normal; } - @font-face { font-family: "EntypoRegular"; src: url("/web/static/src/font/entypo-webfont.eot") format("eot"); @@ -19,7 +18,6 @@ font-weight: normal; font-style: normal; } - .openerp { padding: 0; margin: 0; @@ -1366,6 +1364,9 @@ .openerp .oe_view_manager_inline > .oe_view_manager_header, .openerp .oe_view_manager_inlineview > .oe_view_manager_header { display: none; } +.openerp .oe_popup_form { + display: table; +} .openerp .oe_popup_form .oe_formview .oe_form_pager { display: none !important; } @@ -3087,7 +3088,6 @@ top: 0px; } } - .kitten-mode-activated { background-size: cover; background-attachment: fixed; diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 151d695d22e..6250d112fb2 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -1134,6 +1134,7 @@ $sheet-padding: 16px // }}} // FormPopup {{{ .oe_popup_form + display: table .oe_formview .oe_form_pager display: none !important // Customize label weight for popup wizard appear from another wizard according bootstrap3 diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 5dc160f78f5..02f73b47ab0 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -5684,6 +5684,20 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({ this._super.apply(this, arguments); this.render_value(); this.set_filename(''); + }, + set_value: function(value_){ + var changed = value_ !== this.get_value(); + this._super.apply(this, arguments); + // By default, on binary images read, the server returns the binary size + // This is possible that two images have the exact same size + // Therefore we trigger the change in case the image value hasn't changed + // So the image is re-rendered correctly + if (!changed){ + this.trigger("change:value", this, { + oldValue: value_, + newValue: value_ + }); + } } }); diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index dba45914154..39b5f50fa17 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -420,8 +420,8 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ stop: function(event, ui) { var stop_index = ui.item.index(); if (start_index !== stop_index) { - var $start_column = $('.oe_kanban_groups_records .oe_kanban_column').eq(start_index); - var $stop_column = $('.oe_kanban_groups_records .oe_kanban_column').eq(stop_index); + var $start_column = self.$('.oe_kanban_groups_records .oe_kanban_column').eq(start_index); + var $stop_column = self.$('.oe_kanban_groups_records .oe_kanban_column').eq(stop_index); var method = (start_index > stop_index) ? 'insertBefore' : 'insertAfter'; $start_column[method]($stop_column); var tmp_group = self.groups.splice(start_index, 1)[0]; @@ -1143,7 +1143,7 @@ instance.web_kanban.KanbanRecord = instance.web.Widget.extend({ */ instance.web_kanban.QuickCreate = instance.web.Widget.extend({ template: 'KanbanView.quick_create', - + /** * close_btn: If true, the widget will display a "Close" button able to trigger * a "close" event. diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index 7810f179af8..4beac69cd67 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -359,14 +359,12 @@ class Website(openerp.addons.web.controllers.main.Home): @http.route(['/website/seo_suggest/'], type='http', auth="public", website=True) def seo_suggest(self, keywords): url = "http://google.com/complete/search" - param = { - 'ie': 'utf8', - 'oe': 'utf8', - 'output': 'toolbar', - 'q': keywords - } - req = urllib2.Request("%s?%s" % (url, werkzeug.url_encode(param))) - request = urllib2.urlopen(req) + try: + req = urllib2.Request("%s?%s" % (url, werkzeug.url_encode({ + 'ie': 'utf8', 'oe': 'utf8', 'output': 'toolbar', 'q': keywords}))) + request = urllib2.urlopen(req) + except (urllib2.HTTPError, urllib2.URLError): + return [] xmlroot = ET.fromstring(request.read()) return json.dumps([sugg[0].attrib['data'] for sugg in xmlroot if len(sugg) and sugg[0].attrib['data']]) diff --git a/openerp/addons/base/ir/ir_cron.py b/openerp/addons/base/ir/ir_cron.py index e0f6e38b5ba..7dfe209d465 100644 --- a/openerp/addons/base/ir/ir_cron.py +++ b/openerp/addons/base/ir/ir_cron.py @@ -24,9 +24,10 @@ import time import psycopg2 from datetime import datetime from dateutil.relativedelta import relativedelta +import pytz import openerp -from openerp import netsvc +from openerp import netsvc, SUPERUSER_ID from openerp.osv import fields, osv from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT from openerp.tools.safe_eval import safe_eval as eval @@ -158,8 +159,8 @@ class ir_cron(osv.osv): must not be committed/rolled back! """ try: - now = datetime.now() - nextcall = datetime.strptime(job['nextcall'], DEFAULT_SERVER_DATETIME_FORMAT) + now = fields.datetime.context_timestamp(job_cr, SUPERUSER_ID, datetime.now()) + nextcall = fields.datetime.context_timestamp(job_cr, SUPERUSER_ID, datetime.strptime(job['nextcall'], DEFAULT_SERVER_DATETIME_FORMAT)) numbercall = job['numbercall'] ok = False @@ -175,7 +176,7 @@ class ir_cron(osv.osv): if not numbercall: addsql = ', active=False' cron_cr.execute("UPDATE ir_cron SET nextcall=%s, numbercall=%s"+addsql+" WHERE id=%s", - (nextcall.strftime(DEFAULT_SERVER_DATETIME_FORMAT), numbercall, job['id'])) + (nextcall.astimezone(pytz.UTC).strftime(DEFAULT_SERVER_DATETIME_FORMAT), numbercall, job['id'])) finally: job_cr.commit() diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index c3b0fbc388f..25742404933 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -451,7 +451,7 @@ class YamlInterpreter(object): # do not shadow values explicitly set in yaml. record_dict[key] = process_val(key, val) else: - _logger.warning("The returning field '%s' from your on_change call '%s'" + _logger.debug("The returning field '%s' from your on_change call '%s'" " does not exist either on the object '%s', either in" " the view '%s'", key, match.group(1), model._name, view_info['name'])