diff --git a/addons/account/report/account_overdue_report.py b/addons/account/report/account_overdue_report.py index 6cfd79b1bbb..3aff4821c5e 100644 --- a/addons/account/report/account_overdue_report.py +++ b/addons/account/report/account_overdue_report.py @@ -25,7 +25,7 @@ class ReportOverdue(models.AbstractModel): "FROM account_move_line l " "JOIN account_account_type at ON (l.user_type_id = at.id) " "JOIN account_move m ON (l.move_id = m.id) " - "WHERE l.partner_id IN %s AND at.type IN ('receivable', 'payable') GROUP BY l.date, l.name, l.ref, l.date_maturity, l.partner_id, at.type, l.blocked, l.amount_currency, l.currency_id, l.move_id, m.name", (((fields.date.today(), ) + (tuple(partner_ids),)))) + "WHERE l.partner_id IN %s AND at.type IN ('receivable', 'payable') AND NOT l.reconciled GROUP BY l.date, l.name, l.ref, l.date_maturity, l.partner_id, at.type, l.blocked, l.amount_currency, l.currency_id, l.move_id, m.name", (((fields.date.today(), ) + (tuple(partner_ids),)))) for row in self.env.cr.dictfetchall(): res[row.pop('partner_id')].append(row) return res diff --git a/addons/crm/base_partner_merge.py b/addons/crm/base_partner_merge.py index 95ad18f044f..59ffb1845ea 100644 --- a/addons/crm/base_partner_merge.py +++ b/addons/crm/base_partner_merge.py @@ -554,9 +554,12 @@ class MergePartnerAutomatic(osv.TransientModel): 'min_id': min_id, 'aggr_ids': aggr_ids, } - - proxy.create(cr, uid, values, context=context) - counter += 1 + # To ensure that the used partners are accessible by the user + partner_ids = self.pool['res.partner'].search(cr, uid, [('id', 'in', aggr_ids)], context=context) + if len(partner_ids) >= 2: + values['aggr_ids'] = partner_ids + proxy.create(cr, uid, values, context=context) + counter += 1 values = { 'state': 'selection', diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index e56e012533a..ae9b6357b98 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -65,14 +65,24 @@ class PosOrder(models.Model): closed_session.id, order['name'], order['amount_total']) - _logger.warning('attempting to create recovery session for saving order %s', order['name']) - new_session = PosSession.create({ - 'config_id': closed_session.config_id.id, - 'name': _('(RESCUE FOR %(session)s)') % {'session': closed_session.name}, - 'rescue': True, # avoid conflict with live sessions - }) - # bypass opening_control (necessary when using cash control) - new_session.signal_workflow('open') + + open_sessions = PosSession.search([('state', '=', 'opened'), + ('rescue', '=', True), + ('config_id', '=', closed_session.config_id.id), + ('name', 'ilike', closed_session.name)], + limit=1, order="start_at DESC") + if open_sessions: + new_session = open_sessions[0] + _logger.warning('using existing recovery session %s for saving order %s', new_session, order['name']) + else: + _logger.warning('attempting to create recovery session for saving order %s', order['name']) + new_session = PosSession.create({ + 'config_id': closed_session.config_id.id, + 'name': _('(RESCUE FOR %(session)s)') % {'session': closed_session.name}, + 'rescue': True, # avoid conflict with live sessions + }) + # bypass opening_control (necessary when using cash control) + new_session.signal_workflow('open') return new_session diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 5ff1cae6e8e..c209cdfdff9 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -636,8 +636,6 @@ class Database(http.Controller): @http.route('/web/database/create', type='http', auth="none", methods=['POST'], csrf=False) def create(self, master_pwd, name, lang, password, **post): try: - if not re.match('^[a-zA-Z][a-zA-Z0-9_]+$', name): - raise Exception(_('Invalid database name. Only alphanumerical characters and underscore are allowed.')) # country code could be = "False" which is actually True in python country_code = post.get('country_code') or False request.session.proxy("db").create_database(master_pwd, name, bool(post.get('demo')), lang, password, post['login'], country_code) @@ -650,8 +648,6 @@ class Database(http.Controller): @http.route('/web/database/duplicate', type='http', auth="none", methods=['POST'], csrf=False) def duplicate(self, master_pwd, name, new_name): try: - if not re.match('^[a-zA-Z][a-zA-Z0-9_]+$', new_name): - raise Exception(_('Invalid database name. Only alphanumerical characters and underscore are allowed.')) request.session.proxy("db").duplicate_database(master_pwd, name, new_name) return http.local_redirect('/web/database/manager') except Exception, e: diff --git a/addons/web/static/lib/qweb/qweb2.js b/addons/web/static/lib/qweb/qweb2.js index 1cfc7bb69ef..b1bf280f516 100644 --- a/addons/web/static/lib/qweb/qweb2.js +++ b/addons/web/static/lib/qweb/qweb2.js @@ -120,12 +120,15 @@ var QWeb2 = { } return r.join(''); } else { + // avoid XMLSerializer with text node for IE + if (node.nodeType == 3) { + return node.data; + } if (typeof XMLSerializer !== 'undefined') { return (new XMLSerializer()).serializeToString(node); } else { switch(node.nodeType) { case 1: return node.outerHTML; - case 3: return node.data; case 4: return ''; case 8: return ''; } diff --git a/addons/web/views/database_manager.html b/addons/web/views/database_manager.html index ff78eddd6e3..7cef4678e8d 100644 --- a/addons/web/views/database_manager.html +++ b/addons/web/views/database_manager.html @@ -61,7 +61,7 @@
- +
@@ -208,7 +208,7 @@
- +
@@ -281,7 +281,7 @@
- +