diff --git a/addons/account/security/account_security.xml b/addons/account/security/account_security.xml index 9a2383de45b..65d3e95be54 100644 --- a/addons/account/security/account_security.xml +++ b/addons/account/security/account_security.xml @@ -139,6 +139,13 @@ ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + + Account subscription line company rule + + + ['|',('subscription_id.model_id.company_id','=',False),('subscription_id.model_id.company_id','child_of',[user.company_id.id])] + + Invoice Line company rule diff --git a/addons/account/wizard/account_subscription_generate.py b/addons/account/wizard/account_subscription_generate.py index a61f3eee252..e284f1d12b1 100644 --- a/addons/account/wizard/account_subscription_generate.py +++ b/addons/account/wizard/account_subscription_generate.py @@ -36,11 +36,11 @@ class account_subscription_generate(osv.osv_memory): def action_generate(self, cr, uid, ids, context=None): mod_obj = self.pool.get('ir.model.data') act_obj = self.pool.get('ir.actions.act_window') + sub_line_obj = self.pool.get('account.subscription.line') moves_created=[] for data in self.read(cr, uid, ids, context=context): - cr.execute('select id from account_subscription_line where date<%s and move_id is null', (data['date'],)) - line_ids = map(lambda x: x[0], cr.fetchall()) - moves = self.pool.get('account.subscription.line').move_create(cr, uid, line_ids, context=context) + line_ids = sub_line_obj.search(cr, uid, [('date', '<', data['date']), ('move_id', '=', False)], context=context) + moves = sub_line_obj.move_create(cr, uid, line_ids, context=context) moves_created.extend(moves) result = mod_obj.get_object_reference(cr, uid, 'account', 'action_move_line_form') id = result and result[1] or False diff --git a/addons/crm_claim/crm_claim.py b/addons/crm_claim/crm_claim.py index 50cbe4a6c44..e170f234242 100644 --- a/addons/crm_claim/crm_claim.py +++ b/addons/crm_claim/crm_claim.py @@ -164,6 +164,13 @@ class crm_claim(osv.osv): # context: no_log, because subtype already handle this return super(crm_claim, self).create(cr, uid, vals, context=context) + def copy(self, cr, uid, id, default=None, context=None): + claim = self.browse(cr, uid, id, context=context) + default = dict(default or {}, + stage_id = self._get_default_stage_id(cr, uid, context=context), + name = _('%s (copy)') % claim.name) + return super(crm_claim, self).copy(cr, uid, id, default, context=context) + # ------------------------------------------------------- # Mail gateway # ------------------------------------------------------- diff --git a/addons/l10n_be/wizard/l10n_be_vat_intra.py b/addons/l10n_be/wizard/l10n_be_vat_intra.py index 1a2d9201790..b806e995ce0 100644 --- a/addons/l10n_be/wizard/l10n_be_vat_intra.py +++ b/addons/l10n_be/wizard/l10n_be_vat_intra.py @@ -224,7 +224,7 @@ class partner_vat_intra(osv.osv_memory): data_head = """ - %(company_vat)s + %(vatnum)s %(company_name)s %(street)s %(post_code)s diff --git a/addons/purchase_requisition/purchase_requisition.py b/addons/purchase_requisition/purchase_requisition.py index 319cceb1e1a..592058b30d3 100644 --- a/addons/purchase_requisition/purchase_requisition.py +++ b/addons/purchase_requisition/purchase_requisition.py @@ -71,6 +71,8 @@ class purchase_requisition(osv.osv): for purchase_id in purchase.purchase_ids: if str(purchase_id.state) in('draft'): purchase_order_obj.action_cancel(cr,uid,[purchase_id.id]) + procurement_ids = self.pool['procurement.order'].search(cr, uid, [('requisition_id', 'in', ids)], context=context) + self.pool['procurement.order'].action_done(cr, uid, procurement_ids) return self.write(cr, uid, ids, {'state': 'cancel'}) def tender_in_progress(self, cr, uid, ids, context=None): @@ -80,6 +82,8 @@ class purchase_requisition(osv.osv): return self.write(cr, uid, ids, {'state': 'draft'}) def tender_done(self, cr, uid, ids, context=None): + procurement_ids = self.pool['procurement.order'].search(cr, uid, [('requisition_id', 'in', ids)], context=context) + self.pool['procurement.order'].action_done(cr, uid, procurement_ids) return self.write(cr, uid, ids, {'state':'done', 'date_end':time.strftime('%Y-%m-%d %H:%M:%S')}, context=context) def _planned_date(self, requisition, delay=0.0): @@ -212,6 +216,10 @@ class purchase_order(osv.osv): proc_obj.write(cr, uid, proc_ids, {'purchase_id': po.id}) self.signal_purchase_cancel(cr, uid, [order.id]) po.requisition_id.tender_done(context=context) + if po.requisition_id and all(purchase_id.state in ['draft', 'cancel'] for purchase_id in po.requisition_id.purchase_ids if purchase_id.id != po.id): + procurement_ids = self.pool['procurement.order'].search(cr, uid, [('requisition_id', '=', po.requisition_id.id)], context=context) + for procurement in proc_obj.browse(cr, uid, procurement_ids, context=context): + procurement.move_id.write({'location_id': procurement.move_id.location_dest_id.id}) return res @@ -268,7 +276,7 @@ class procurement_order(osv.osv): for procurement in self.browse(cr, uid, ids, context=context): if procurement.product_id.purchase_requisition: user_company = self.pool['res.users'].browse(cr, uid, uid, context=context).company_id - req = res[procurement.id] = requisition_obj.create(cr, uid, { + req = requisition_obj.create(cr, uid, { 'origin': procurement.origin, 'date_end': procurement.date_planned, 'warehouse_id': self._get_warehouse(procurement, user_company), @@ -284,6 +292,7 @@ class procurement_order(osv.osv): 'state': 'running', 'requisition_id': req }) + res[procurement.id] = 0 else: non_requisition.append(procurement.id) diff --git a/addons/web/static/src/js/formats.js b/addons/web/static/src/js/formats.js index f08dc31021a..3d7b574e56a 100644 --- a/addons/web/static/src/js/formats.js +++ b/addons/web/static/src/js/formats.js @@ -271,7 +271,7 @@ instance.web.parse_value = function (value, descriptor, value_if_empty) { value, (date_pattern + ' ' + time_pattern)); if (datetime !== null) return instance.web.datetime_to_str(datetime); - datetime = Date.parseExact(value.replace(/\d+/g, function(m){ + datetime = Date.parseExact(value.toString().replace(/\d+/g, function(m){ return m.length === 1 ? "0" + m : m ; }), (date_pattern + ' ' + time_pattern)); if (datetime !== null) @@ -284,7 +284,7 @@ instance.web.parse_value = function (value, descriptor, value_if_empty) { var date = Date.parseExact(value, date_pattern); if (date !== null) return instance.web.date_to_str(date); - date = Date.parseExact(value.replace(/\d+/g, function(m){ + date = Date.parseExact(value.toString().replace(/\d+/g, function(m){ return m.length === 1 ? "0" + m : m ; }), date_pattern); if (date !== null) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 16d0310ab4d..714f7a640d8 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -1108,7 +1108,7 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web. ids = value; } new instance.web.Model(column.relation) - .call('name_get', [ids]).done(function (names) { + .call('name_get', [ids, this.dataset.context]).done(function (names) { // FIXME: nth horrible hack in this poor listview record.set(column.id + '__display', _(names).pluck(1).join(', ')); diff --git a/addons/web_calendar/static/src/js/web_calendar.js b/addons/web_calendar/static/src/js/web_calendar.js index 3b7f41999e2..07c06403f82 100644 --- a/addons/web_calendar/static/src/js/web_calendar.js +++ b/addons/web_calendar/static/src/js/web_calendar.js @@ -664,17 +664,13 @@ 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] = instance.web.parse_value(event.start, this.fields[this.date_start]); + data[this.date_start] = event.start; if (this.date_stop) { - data[this.date_stop] = instance.web.parse_value(event_end, this.fields[this.date_stop]); + data[this.date_stop] = event_end; } diff_seconds = Math.round((event_end.getTime() - event.start.getTime()) / 1000); } diff --git a/openerp/addons/base/ir/ir_ui_view.py b/openerp/addons/base/ir/ir_ui_view.py index b2b2726a7c1..7613e7386bd 100644 --- a/openerp/addons/base/ir/ir_ui_view.py +++ b/openerp/addons/base/ir/ir_ui_view.py @@ -373,7 +373,7 @@ class view(osv.osv): node.getparent().remove(node) elif pos == 'attributes': for child in spec.getiterator('attribute'): - attribute = (child.get('name'), child.text and child.text.encode('utf8') or None) + attribute = (child.get('name'), child.text or None) if attribute[1]: node.set(attribute[0], attribute[1]) elif attribute[0] in node.attrib: diff --git a/openerp/addons/base/module/wizard/base_module_upgrade.py b/openerp/addons/base/module/wizard/base_module_upgrade.py index 365895be7ac..0f8781fcd6f 100644 --- a/openerp/addons/base/module/wizard/base_module_upgrade.py +++ b/openerp/addons/base/module/wizard/base_module_upgrade.py @@ -103,17 +103,7 @@ class base_module_upgrade(osv.osv_memory): openerp.modules.registry.RegistryManager.new(cr.dbname, update_module=True) - ir_model_data = self.pool.get('ir.model.data') - __, res_id = ir_model_data.get_object_reference(cr, uid, 'base', 'view_base_module_upgrade_install') - return { - 'view_type': 'form', - 'view_mode': 'form', - 'res_model': 'base.module.upgrade', - 'views': [(res_id, 'form')], - 'view_id': False, - 'type': 'ir.actions.act_window', - 'target': 'new', - } + return {'type': 'ir.actions.act_window_close'} def config(self, cr, uid, ids, context=None): return self.pool.get('res.config').next(cr, uid, [], context=context) diff --git a/openerp/addons/base/module/wizard/base_module_upgrade_view.xml b/openerp/addons/base/module/wizard/base_module_upgrade_view.xml index 10c023e5148..705ba31b16f 100644 --- a/openerp/addons/base/module/wizard/base_module_upgrade_view.xml +++ b/openerp/addons/base/module/wizard/base_module_upgrade_view.xml @@ -13,7 +13,7 @@ diff --git a/openerp/osv/expression.py b/openerp/osv/expression.py index d3231c54462..58999e751fd 100644 --- a/openerp/osv/expression.py +++ b/openerp/osv/expression.py @@ -1036,34 +1036,30 @@ class expression(object): unaccent = self._unaccent if sql_operator.endswith('like') else lambda x: x - trans_left = unaccent('value') - quote_left = unaccent(_quote(left)) instr = unaccent('%s') if sql_operator == 'in': # params will be flatten by to_sql() => expand the placeholders instr = '(%s)' % ', '.join(['%s'] * len(right)) - subselect = """(SELECT res_id - FROM ir_translation - WHERE name = %s - AND lang = %s - AND type = %s - AND {trans_left} {operator} {right} - ) UNION ( - SELECT id - FROM "{table}" - WHERE {left} {operator} {right} - ) - """.format(trans_left=trans_left, operator=sql_operator, - right=instr, table=working_model._table, left=quote_left) + subselect = """WITH temp_irt_current (id, name) as ( + SELECT ct.id, coalesce(it.value,ct.{quote_left}) + FROM {current_table} ct + LEFT JOIN ir_translation it ON (it.name = %s and + it.lang = %s and + it.type = %s and + it.res_id = ct.id and + it.value != '') + ) + SELECT id FROM temp_irt_current WHERE {name} {operator} {right} order by name + """.format(current_table=working_model._table, quote_left=_quote(left), name=unaccent('name'), + operator=sql_operator, right=instr) params = ( working_model._name + ',' + left, context.get('lang') or 'en_US', 'model', right, - right, ) push(create_substitution_leaf(leaf, ('id', inselect_operator, (subselect, params)), working_model)) diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index db59d37d350..e7404520ef3 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -1556,7 +1556,8 @@ class property(function): default_val = self._get_default(obj, cr, uid, prop_name, context) property_create = False - if isinstance(default_val, openerp.osv.orm.browse_record): + if isinstance(default_val, (openerp.osv.orm.browse_record, + openerp.osv.orm.browse_null)): if default_val.id != id_val: property_create = True elif default_val != id_val: