diff options
| author | Christophe Simonis <chs@odoo.com> | 2014-06-27 16:08:09 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2014-06-27 16:08:09 +0200 |
| commit | 8dfd5eab0134d8995514b7965d3244d260cabfa4 (patch) | |
| tree | 2ef0287b192d95edba8767e1b444b83126102857 | |
| parent | 368936df7c980e80ec46d034c5d682b078e155e5 (diff) | |
| parent | a4bc65cdbaf8c26992317d34a99472a012a90735 (diff) | |
[MERGE] forward port of branch saas-4 up to a4bc65c
| -rw-r--r-- | addons/base_action_rule/base_action_rule.py | 10 | ||||
| -rw-r--r-- | addons/hr_recruitment/hr_recruitment_data.xml | 2 | ||||
| -rw-r--r-- | addons/hr_timesheet_sheet/static/src/js/timesheet.js | 16 | ||||
| -rw-r--r-- | addons/l10n_be_coda/l10n_be_coda.py | 2 | ||||
| -rwxr-xr-x | addons/l10n_fr_hr_payroll/report/fiche_paye.py | 1 | ||||
| -rw-r--r-- | addons/mail/mail_message_view.xml | 4 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_list.js | 1 | ||||
| -rw-r--r-- | addons/web/static/src/js/views.js | 1 | ||||
| -rw-r--r-- | addons/web_calendar/static/src/js/web_calendar.js | 8 | ||||
| -rw-r--r-- | addons/website/models/ir_http.py | 5 | ||||
| -rw-r--r-- | addons/website/views/website_templates.xml | 4 | ||||
| -rw-r--r-- | openerp/modules/loading.py | 2 | ||||
| -rw-r--r-- | openerp/report/report_sxw.py | 6 | ||||
| -rw-r--r-- | openerp/service/db.py | 36 |
14 files changed, 56 insertions, 42 deletions
diff --git a/addons/base_action_rule/base_action_rule.py b/addons/base_action_rule/base_action_rule.py index 6c5e8d4d6cb..5189bcbc7df 100644 --- a/addons/base_action_rule/base_action_rule.py +++ b/addons/base_action_rule/base_action_rule.py @@ -156,13 +156,13 @@ class base_action_rule(osv.osv): """ Return a wrapper around `old_create` calling both `old_create` and `_process`, in that order. """ - def create(cr, uid, vals, context=None): + def create(cr, uid, vals, context=None, **kwargs): # avoid loops or cascading actions if context and context.get('action'): return old_create(cr, uid, vals, context=context) context = dict(context or {}, action=True) - new_id = old_create(cr, uid, vals, context=context) + new_id = old_create(cr, uid, vals, context=context, **kwargs) # retrieve the action rules to run on creation action_dom = [('model', '=', model), ('kind', 'in', ['on_create', 'on_create_or_write'])] @@ -180,10 +180,10 @@ class base_action_rule(osv.osv): """ Return a wrapper around `old_write` calling both `old_write` and `_process`, in that order. """ - def write(cr, uid, ids, vals, context=None): + def write(cr, uid, ids, vals, context=None, **kwargs): # avoid loops or cascading actions if context and context.get('action'): - return old_write(cr, uid, ids, vals, context=context) + return old_write(cr, uid, ids, vals, context=context, **kwargs) context = dict(context or {}, action=True) ids = [ids] if isinstance(ids, (int, long, str)) else ids @@ -199,7 +199,7 @@ class base_action_rule(osv.osv): pre_ids[action] = self._filter(cr, uid, action, action.filter_pre_id, ids, context=context) # execute write - old_write(cr, uid, ids, vals, context=context) + old_write(cr, uid, ids, vals, context=context, **kwargs) # check postconditions, and execute actions on the records that satisfy them for action in actions: diff --git a/addons/hr_recruitment/hr_recruitment_data.xml b/addons/hr_recruitment/hr_recruitment_data.xml index 5849a67d949..81e01629798 100644 --- a/addons/hr_recruitment/hr_recruitment_data.xml +++ b/addons/hr_recruitment/hr_recruitment_data.xml @@ -148,7 +148,7 @@ <record id="mt_job_applicant_new" model="mail.message.subtype"> <field name="name">Applicant Created</field> <field name="res_model">hr.job</field> - <field name="default" eval="False"/> + <field name="default" eval="True"/> <field name="parent_id" eval="ref('mt_applicant_new')"/> <field name="relation_field">job_id</field> </record> diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index c7afd62c8ab..ef1e2f17145 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -7,6 +7,9 @@ openerp.hr_timesheet_sheet = function(instance) { events: { "click .oe_timesheet_weekly_account a": "go_to", }, + ignore_fields: function() { + return ['line_id']; + }, init: function() { this._super.apply(this, arguments); var self = this; @@ -323,11 +326,8 @@ openerp.hr_timesheet_sheet = function(instance) { generate_o2m_value: function() { var self = this; var ops = []; - + var ignored_fields = self.ignore_fields(); _.each(self.accounts, function(account) { - var auth_keys = _.extend(_.clone(account.account_defaults), { - name: true, amount:true, unit_amount: true, date: true, account_id:true, - }); _.each(account.days, function(day) { _.each(day.lines, function(line) { if (line.unit_amount !== 0) { @@ -338,12 +338,8 @@ openerp.hr_timesheet_sheet = function(instance) { tmp[k] = v[0]; } }); - // we have to remove some keys, because analytic lines are shitty - _.each(_.keys(tmp), function(key) { - if (auth_keys[key] === undefined) { - tmp[key] = undefined; - } - }); + // we remove line_id as the reference to the _inherits field will no longer exists + tmp = _.omit(tmp, ignored_fields); ops.push(tmp); } }); diff --git a/addons/l10n_be_coda/l10n_be_coda.py b/addons/l10n_be_coda/l10n_be_coda.py index 0dfa9bf9db4..46f3b2f7e34 100644 --- a/addons/l10n_be_coda/l10n_be_coda.py +++ b/addons/l10n_be_coda/l10n_be_coda.py @@ -56,7 +56,7 @@ class account_bank_statement_line(osv.osv): """ Same as create function above, but for write function """ - if 'partner_id' in vals: + if vals.get('partner_id'): for line in self.pool.get('account.bank.statement.line').browse(cr, uid, ids, context=context): if line.coda_account_number: acc_number_ids = self.pool.get('res.partner.bank').search(cr, uid, [('acc_number', '=', line.coda_account_number)]) diff --git a/addons/l10n_fr_hr_payroll/report/fiche_paye.py b/addons/l10n_fr_hr_payroll/report/fiche_paye.py index c6933228687..18eb7f30b8a 100755 --- a/addons/l10n_fr_hr_payroll/report/fiche_paye.py +++ b/addons/l10n_fr_hr_payroll/report/fiche_paye.py @@ -31,6 +31,7 @@ class fiche_paye_parser(report_sxw.rml_parse): def __init__(self, cr, uid, name, context): super(fiche_paye_parser, self).__init__(cr, uid, name, context) self.localcontext.update({ + 'lang': "fr_FR", 'get_payslip_lines': self.get_payslip_lines, 'get_total_by_rule_category': self.get_total_by_rule_category, 'get_employer_line': self.get_employer_line, diff --git a/addons/mail/mail_message_view.xml b/addons/mail/mail_message_view.xml index 6c15114cde6..0cec847ade3 100644 --- a/addons/mail/mail_message_view.xml +++ b/addons/mail/mail_message_view.xml @@ -102,11 +102,11 @@ <div class="oe_kanban_global_click"> <div t-attf-class="oe_attachment" t-if="record.file_type_icon.value != 'webimage'"> <img t-att-src="'/mail/static/src/img/mimetypes/' + record.file_type_icon.value + '.png'"></img> - <div class='oe_name'><t t-raw='record.name.value' />bb</div> + <div class='oe_name'><t t-raw='record.name.value' /></div> </div> <div t-attf-class="oe_attachment oe_preview" t-if="record.file_type_icon.value == 'webimage'"> <img t-att-src="kanban_image('ir.attachment', 'datas', record.id.value)" class="oe_kanban_image"/> - <div class='oe_name'><t t-raw='record.name.value' />aa</div> + <div class='oe_name'><t t-raw='record.name.value' /></div> </div> </div> </t> diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 714f7a640d8..dfefa3c0d08 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -1605,6 +1605,7 @@ instance.web.ListView.Groups = instance.web.Class.extend( /** @lends instance.we .filter(function (column) { return column.tag === 'field';}) .pluck('name').value(), function (groups) { + self.view.$pager.hide(); $el[0].appendChild( self.render_groups(groups)); if (post_render) { post_render(); } diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index ec233159d63..64be8a9493c 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -618,7 +618,6 @@ instance.web.ViewManager = instance.web.Widget.extend({ var view_promise; var form = this.views['form']; if (!view || (form && form.controller && !form.controller.can_be_discarded())) { - self.trigger('switch_mode', view_type, no_store, view_options); return $.Deferred().reject(); } if (!no_store) { diff --git a/addons/web_calendar/static/src/js/web_calendar.js b/addons/web_calendar/static/src/js/web_calendar.js index e65bee826e6..a7cff99f436 100644 --- a/addons/web_calendar/static/src/js/web_calendar.js +++ b/addons/web_calendar/static/src/js/web_calendar.js @@ -663,13 +663,17 @@ openerp.web_calendar = function(instance) { date_start_day = new Date(event.start.getFullYear(),event.start.getMonth(),event.start.getDate(),7); date_stop_day = new Date(event_end.getFullYear(),event_end.getMonth(),event_end.getDate(),19); } + data[this.date_start] = instance.web.parse_value(date_start_day, this.fields[this.date_start]); + if (this.date_stop) { + data[this.date_stop] = instance.web.parse_value(date_stop_day, this.fields[this.date_stop]); + } diff_seconds = Math.round((date_stop_day.getTime() - date_start_day.getTime()) / 1000); } else { - data[this.date_start] = event.start; + data[this.date_start] = instance.web.parse_value(event.start, this.fields[this.date_start]); if (this.date_stop) { - data[this.date_stop] = event_end; + data[this.date_stop] = instance.web.parse_value(event_end, this.fields[this.date_stop]); } diff_seconds = Math.round((event_end.getTime() - event.start.getTime()) / 1000); } diff --git a/addons/website/models/ir_http.py b/addons/website/models/ir_http.py index 8be35f5a9ae..f3bb906d4ba 100644 --- a/addons/website/models/ir_http.py +++ b/addons/website/models/ir_http.py @@ -176,6 +176,11 @@ class ir_http(orm.AbstractModel): if isinstance(exception.qweb.get('cause'), openerp.exceptions.AccessError): code = 403 + if isinstance(exception, werkzeug.exceptions.HTTPException) and code is None: + # Hand-crafted HTTPException likely coming from abort(), + # usually for a redirect response -> return it directly + return exception + if code == 500: logger.error("500 Internal Server Error:\n\n%s", values['traceback']) if 'qweb_exception' in values: diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index df3a4298e5b..c23e18ebf8e 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -113,8 +113,8 @@ <t t-foreach="website.menu_id.child_id" t-as="submenu"> <t t-call="website.submenu"/> </t> - <li class="divider" groups="base.group_user,base.group_portal" t-ignore="true"/> - <li class="dropdown" t-ignore="true" groups="base.group_user,base.group_portal"> + <li class="divider" t-ignore="true" t-if="website.user_id != user_id"/> + <li class="dropdown" t-ignore="true" t-if="website.user_id != user_id"> <a href="#" class="dropdown-toggle" data-toggle="dropdown"> <b> <span t-esc="user_id.name"/> diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index 2b507acc0bb..11dcee179eb 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -203,7 +203,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= # Set new modules and dependencies modobj.write(cr, SUPERUSER_ID, [module_id], {'state': 'installed', 'latest_version': ver}) # Update translations for all installed languages - modobj.update_translations(cr, SUPERUSER_ID, [module_id], None) + modobj.update_translations(cr, SUPERUSER_ID, [module_id], None, {'overwrite': openerp.tools.config["overwrite_existing_translations"]}) package.state = 'installed' for kind in ('init', 'demo', 'update'): diff --git a/openerp/report/report_sxw.py b/openerp/report/report_sxw.py index b4f90126b92..f98261b0833 100644 --- a/openerp/report/report_sxw.py +++ b/openerp/report/report_sxw.py @@ -241,8 +241,10 @@ class rml_parse(object): def _get_lang_dict(self): pool_lang = self.pool['res.lang'] lang = self.localcontext.get('lang', 'en_US') or 'en_US' - lang_ids = pool_lang.search(self.cr,self.uid,[('code','=',lang)])[0] - lang_obj = pool_lang.browse(self.cr,self.uid,lang_ids) + lang_ids = pool_lang.search(self.cr,self.uid,[('code','=',lang)]) + if not lang_ids: + lang_ids = pool_lang.search(self.cr,self.uid,[('code','=','en_US')]) + lang_obj = pool_lang.browse(self.cr,self.uid,lang_ids[0]) self.lang_dict.update({'lang_obj':lang_obj,'date_format':lang_obj.date_format,'time_format':lang_obj.time_format}) self.default_lang[lang] = self.lang_dict.copy() return True diff --git a/openerp/service/db.py b/openerp/service/db.py index bb97e72f992..81667eaccee 100644 --- a/openerp/service/db.py +++ b/openerp/service/db.py @@ -152,6 +152,24 @@ def exp_get_progress(id): exc, tb = a['exception'], a['traceback'] raise Exception, exc, tb + +def _drop_conn(cr, db_name): + # Try to terminate all other connections that might prevent + # dropping the database + try: + # PostgreSQL 9.2 renamed pg_stat_activity.procpid to pid: + # http://www.postgresql.org/docs/9.2/static/release-9-2.html#AEN110389 + pid_col = 'pid' if cr._cnx.server_version >= 90200 else 'procpid' + + cr.execute("""SELECT pg_terminate_backend(%(pid_col)s) + FROM pg_stat_activity + WHERE datname = %%s AND + %(pid_col)s != pg_backend_pid()""" % {'pid_col': pid_col}, + (db_name,)) + except Exception: + pass + + def exp_drop(db_name): if db_name not in exp_list(True): return False @@ -160,21 +178,8 @@ def exp_drop(db_name): db = openerp.sql_db.db_connect('postgres') with closing(db.cursor()) as cr: - cr.autocommit(True) # avoid transaction block - # Try to terminate all other connections that might prevent - # dropping the database - try: - # PostgreSQL 9.2 renamed pg_stat_activity.procpid to pid: - # http://www.postgresql.org/docs/9.2/static/release-9-2.html#AEN110389 - pid_col = 'pid' if cr._cnx.server_version >= 90200 else 'procpid' - - cr.execute("""SELECT pg_terminate_backend(%(pid_col)s) - FROM pg_stat_activity - WHERE datname = %%s AND - %(pid_col)s != pg_backend_pid()""" % {'pid_col': pid_col}, - (db_name,)) - except Exception: - pass + cr.autocommit(True) # avoid transaction block + _drop_conn(cr, db_name) try: cr.execute('DROP DATABASE "%s"' % db_name) @@ -331,6 +336,7 @@ def exp_rename(old_name, new_name): db = openerp.sql_db.db_connect('postgres') with closing(db.cursor()) as cr: cr.autocommit(True) # avoid transaction block + _drop_conn(cr, old_name) try: cr.execute('ALTER DATABASE "%s" RENAME TO "%s"' % (old_name, new_name)) _logger.info('RENAME DB: %s -> %s', old_name, new_name) |
