From 7b852d44e3493a086e0451277a18377d67f258fb Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Mon, 6 Feb 2012 17:57:39 +0100 Subject: [PATCH 001/581] [IMP] stock: Give a new reference to the backorders, and keep the old reference for the partial picking done lp bug: https://launchpad.net/bugs/891664 fixed bzr revid: ls@numerigraphe.fr-20120206165739-d4ov9wz6fich0cr1 --- addons/stock/stock.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 9b4644c1161..4fb1c0ecafe 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -1247,9 +1247,14 @@ class stock_picking(osv.osv): for move in too_few: product_qty = move_product_qty[move.id] if not new_picking: + new_picking_name = pick.name + self.write(cr, uid, [pick.id], + {'name': sequence_obj.get(cr, uid, + 'stock.picking.%s'%(pick.type)), + }) new_picking = self.copy(cr, uid, pick.id, { - 'name': sequence_obj.get(cr, uid, 'stock.picking.%s'%(pick.type)), + 'name': new_picking_name, 'move_lines' : [], 'state':'draft', }) From 4f01d6d6a48f3208f7bf91b83de65450ed6c9fa4 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Tue, 7 Feb 2012 11:58:08 +0100 Subject: [PATCH 002/581] [IMP] Stock: reset traceability on backorder after partial move lp bug: https://launchpad.net/bugs/928191 fixed bzr revid: ls@numerigraphe.fr-20120207105808-xz7hrbjyyscj5fyg --- addons/stock/stock.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 9b4644c1161..df1e2380f0a 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -1269,9 +1269,10 @@ class stock_picking(osv.osv): move_obj.copy(cr, uid, move.id, defaults) move_obj.write(cr, uid, [move.id], { - 'product_qty' : move.product_qty - partial_qty[move.id], + 'product_qty': move.product_qty - partial_qty[move.id], 'product_uos_qty': move.product_qty - partial_qty[move.id], #TODO: put correct uos_qty - + 'prodlot_id': False, + 'tracking_id': False, }) if new_picking: @@ -2573,8 +2574,10 @@ class stock_move(osv.osv): complete.append(self.browse(cr, uid, new_move)) self.write(cr, uid, [move.id], { - 'product_qty' : move.product_qty - product_qty, - 'product_uos_qty':move.product_qty - product_qty, + 'product_qty': move.product_qty - product_qty, + 'product_uos_qty': move.product_qty - product_qty, + 'prodlot_id': False, + 'tracking_id': False, }) From 292517875f81ba7fcf4d66b773a6f89271ac21be Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Fri, 10 Feb 2012 16:07:25 +0100 Subject: [PATCH 003/581] [FIX] don't add "[]" to tracking lot name lp bug: https://launchpad.net/bugs/930189 fixed bzr revid: ls@numerigraphe.fr-20120210150725-z65672axjekqsvdn --- addons/stock/stock.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 9b4644c1161..59b9f8883f1 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -504,9 +504,13 @@ class stock_tracking(osv.osv): return self.name_get(cr, user, ids, context) def name_get(self, cr, uid, ids, context=None): + """Append the serial to the name""" if not len(ids): return [] - res = [(r['id'], r['name']+' ['+(r['serial'] or '')+']') for r in self.read(cr, uid, ids, ['name', 'serial'], context)] + res = [ (r['id'], r['serial'] and '%s [%s]' % (r['name'], r['serial']) + or r['name'] ) + for r in self.read(cr, uid, ids, ['name', 'serial'], + context=context) ] return res def unlink(self, cr, uid, ids, context=None): From 9e346ccb118e8ed9575ec936f9f24260777a59b9 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Wed, 22 Feb 2012 14:12:16 +0100 Subject: [PATCH 004/581] [IMP] procurement: consistent cording for MTS/MTO bzr revid: ls@numerigraphe.fr-20120222131216-z5mgm13ee5a3dmb3 --- addons/procurement/procurement.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py index 164314c4573..5804a2f002f 100644 --- a/addons/procurement/procurement.py +++ b/addons/procurement/procurement.py @@ -98,7 +98,7 @@ class procurement_order(osv.osv): 'move_id': fields.many2one('stock.move', 'Reservation', ondelete='set null'), 'close_move': fields.boolean('Close Move at end', required=True), 'location_id': fields.many2one('stock.location', 'Location', required=True, states={'draft':[('readonly',False)]}, readonly=True), - 'procure_method': fields.selection([('make_to_stock','from stock'),('make_to_order','on order')], 'Procurement Method', states={'draft':[('readonly',False)], 'confirmed':[('readonly',False)]}, + 'procure_method': fields.selection([('make_to_stock','Make to Stock'),('make_to_order','Make to Order')], 'Procurement Method', states={'draft':[('readonly',False)], 'confirmed':[('readonly',False)]}, readonly=True, required=True, help="If you encode manually a Procurement, you probably want to use" \ " a make to order method."), From 9ae977e92810f1c0cde09e925b5f256fbe993b59 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Wed, 22 Feb 2012 14:18:49 +0100 Subject: [PATCH 005/581] [FIX] purchase: don't alter caller's context bzr revid: ls@numerigraphe.fr-20120222131849-42mv2m6mfdb41miw --- addons/purchase/purchase.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index a3135935045..9cb11ac420f 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -903,9 +903,10 @@ class procurement_order(osv.osv): purchase_date = self._get_purchase_order_date(cr, uid, procurement, company, schedule_date, context=context) #Passing partner_id to context for purchase order line integrity of Line name - context.update({'lang': partner.lang, 'partner_id': partner_id}) + new_context = context.copy() + new_context.update({'lang': partner.lang, 'partner_id': partner_id}) - product = prod_obj.browse(cr, uid, procurement.product_id.id, context=context) + product = prod_obj.browse(cr, uid, procurement.product_id.id, context=new_context) taxes_ids = procurement.product_id.product_tmpl_id.supplier_taxes_id taxes = acc_pos_obj.map_tax(cr, uid, partner.property_account_position, taxes_ids) @@ -933,7 +934,7 @@ class procurement_order(osv.osv): 'company_id': procurement.company_id.id, 'fiscal_position': partner.property_account_position and partner.property_account_position.id or False } - res[procurement.id] = self.create_procurement_purchase_order(cr, uid, procurement, po_vals, line_vals, context=context) + res[procurement.id] = self.create_procurement_purchase_order(cr, uid, procurement, po_vals, line_vals, context=new_context) self.write(cr, uid, [procurement.id], {'state': 'running', 'purchase_id': res[procurement.id]}) return res From 68015f9f9f385501b16181241c0bd6ff2ffe71aa Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Wed, 22 Feb 2012 15:26:09 +0100 Subject: [PATCH 006/581] [IMP] explicit help texts on stock move quantities lp bug: https://launchpad.net/bugs/904118 fixed bzr revid: ls@numerigraphe.fr-20120222142609-in23kx3atgeefig2 --- addons/stock/stock.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 885f7cd2077..5b8edce471d 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -1572,10 +1572,28 @@ class stock_move(osv.osv): 'date_expected': fields.datetime('Scheduled Date', states={'done': [('readonly', True)]},required=True, select=True, help="Scheduled date for the processing of this move"), 'product_id': fields.many2one('product.product', 'Product', required=True, select=True, domain=[('type','<>','service')],states={'done': [('readonly', True)]}), - 'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM'), required=True,states={'done': [('readonly', True)]}), + 'product_qty': fields.float('Ordered quantity', + digits_compute=dp.get_precision('Product UoM'), required=True, + states={'done': [('readonly', True)]}, + help="This is the quantity of products from an inventory " + "point of view. For moves in the state 'done', this is the " + "quantity of products that were actually moved. For other " + "moves, this is the quantity of product that is planned to " + "be moved. Lowering this quantity does not generate a " + "backorder. Changing this quantity on assigned moves affects " + "the product reservation, and should be done with care."), 'product_uom': fields.many2one('product.uom', 'Unit of Measure', required=True,states={'done': [('readonly', True)]}), - 'product_uos_qty': fields.float('Quantity (UOS)', digits_compute=dp.get_precision('Product UoM'), states={'done': [('readonly', True)]}), - 'product_uos': fields.many2one('product.uom', 'Product UOS', states={'done': [('readonly', True)]}), + 'product_uos_qty': fields.float('Ordered quantity (UOS)', + digits_compute=dp.get_precision('Product UoM'), + states={'done': [('readonly', True)]}, + help="This is the quantity of products from a sales or invoicing " + "point of view. For moves in the state 'done', this is the " + "quantity of products that were actually moved. For other " + "moves, this is the quantity of product that is planned to " + "be moved. Lowering this quantity does not generate a " + "backorder. Changing this quantity on assigned moves affects " + "the product reservation, and should be done with care."), + 'product_uos': fields.many2one('product.uom', 'Unit of Sale', states={'done': [('readonly', True)]}), 'product_packaging': fields.many2one('product.packaging', 'Packaging', help="It specifies attributes of packaging like type, quantity of packaging,etc."), 'location_id': fields.many2one('stock.location', 'Source Location', required=True, select=True,states={'done': [('readonly', True)]}, help="Sets a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations."), From 821fd5d7e455be27c5cec560f48bfde750995375 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Fri, 24 Feb 2012 11:58:49 +0100 Subject: [PATCH 007/581] [IMP] stock: Make the name of backorder_id fields consistent (was wrong on moves) bzr revid: ls@numerigraphe.fr-20120224105849-uuq67bo447yasncr --- addons/stock/stock.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 885f7cd2077..d1cdf48a35f 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -1599,7 +1599,7 @@ class stock_move(osv.osv): 'price_currency_id': fields.many2one('res.currency', 'Currency for average price', help="Technical field used to record the currency chosen by the user during a picking confirmation (when average price costing method is used)"), 'company_id': fields.many2one('res.company', 'Company', required=True, select=True), 'partner_id': fields.related('picking_id','address_id','partner_id',type='many2one', relation="res.partner", string="Partner", store=True, select=True), - 'backorder_id': fields.related('picking_id','backorder_id',type='many2one', relation="stock.picking", string="Back Order", select=True), + 'backorder_id': fields.related('picking_id','backorder_id',type='many2one', relation="stock.picking", string="Back Order of", select=True), 'origin': fields.related('picking_id','origin',type='char', size=64, relation="stock.picking", string="Origin", store=True), # used for colors in tree views: From 96b5717bc056440f3e0fbe6173a56400851b0ada Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Mon, 27 Feb 2012 10:58:35 +0100 Subject: [PATCH 008/581] [FIX] check picking workflow when forcing a single move's availibility bzr revid: ls@numerigraphe.fr-20120227095835-91b9m1mjhnwivdih --- addons/stock/stock.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 885f7cd2077..151fbf2af5d 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -1987,6 +1987,10 @@ class stock_move(osv.osv): @return: True """ self.write(cr, uid, ids, {'state': 'assigned'}) + wf_service = netsvc.LocalService('workflow') + for move in self.browse(cr, uid, ids, context): + if move.picking_id: + wf_service.trg_write(uid, 'stock.picking', move.picking_id.id, cr) return True def cancel_assign(self, cr, uid, ids, context=None): From 4b3c0dc716cefbabd66c00d524192338e1136a8d Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Mon, 27 Feb 2012 11:10:20 +0100 Subject: [PATCH 009/581] [REF] docstrings and comments bzr revid: ls@numerigraphe.fr-20120227101020-oxahk059rjeso09h --- addons/stock/stock.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 885f7cd2077..fdb732b9141 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -669,6 +669,7 @@ class stock_picking(osv.osv): ] def action_process(self, cr, uid, ids, context=None): + """Open the partial picking wizard""" if context is None: context = {} context = dict(context, active_ids=ids, active_model=self._name) partial_id = self.pool.get("stock.partial.picking").create(cr, uid, {}, context=context) @@ -844,14 +845,20 @@ class stock_picking(osv.osv): # TODO: change and create a move if not parents # def action_done(self, cr, uid, ids, context=None): - """ Changes picking state to done. + """Changes picking state to done. + + This method is called at the end of the workflow by the activity "done". @return: True """ self.write(cr, uid, ids, {'state': 'done', 'date_done': time.strftime('%Y-%m-%d %H:%M:%S')}) return True def action_move(self, cr, uid, ids, context=None): - """ Changes move state to assigned. + """Process the Stock Moves of the Picking + + This method is called by the workflow by the activity "move". + Normally that happens when the signal button_done is received (button + "Done" pressed on a Picking view). @return: True """ for pick in self.browse(cr, uid, ids, context=context): @@ -2367,6 +2374,7 @@ class stock_move(osv.osv): return res # action_split function is not used anywhere + # FIXME: deprecate this method def action_split(self, cr, uid, ids, quantity, split_by_qty=1, prefix=False, with_lot=True, context=None): """ Split Stock Move lines into production lot which specified split by quantity. @param cr: the database cursor From 6435b29dd5c893be16787432496fd642ac1b6cec Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Tue, 28 Feb 2012 16:05:27 +0100 Subject: [PATCH 010/581] [IMP] reset negative qty to 0.0 in onchanges in stock bzr revid: ls@numerigraphe.fr-20120228150527-8mwlpjvjcunni8ii --- addons/stock/stock.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 885f7cd2077..b552553bc42 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -1764,6 +1764,7 @@ class stock_move(osv.osv): } if (not product_id) or (product_qty <=0.0): + result['product_qty'] = 0.0 return {'value': result} product_obj = self.pool.get('product.product') @@ -1790,6 +1791,7 @@ class stock_move(osv.osv): } if (not product_id) or (product_uos_qty <=0.0): + result['product_uos_qty'] = 0.0 return {'value': result} product_obj = self.pool.get('product.product') From 03d0c84871b5925a4bf0fc8b49279efa03a3b461 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Tue, 28 Feb 2012 17:04:00 +0100 Subject: [PATCH 011/581] [IMP] docstring for picking.explode() bzr revid: ls@numerigraphe.fr-20120228160400-abndfkp5t157o32d --- addons/stock/stock.py | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index fdb732b9141..2cb5bbb1a5e 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -711,6 +711,7 @@ class stock_picking(osv.osv): return {} def action_explode(self, cr, uid, moves, context=None): + """Hook to allow other modules to split the moves of a picking.""" return moves def action_confirm(self, cr, uid, ids, context=None): From 9696b43f6c92fb58a5c43bc455088b3ddeb4b8e5 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Wed, 29 Feb 2012 12:08:20 +0100 Subject: [PATCH 012/581] [IMP] Warn if the quantity is decreased in the stock moves bzr revid: ls@numerigraphe.fr-20120229110820-7ods08ps2rm0j03o --- addons/stock/stock.py | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 5b8edce471d..2470ec362d7 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -1780,19 +1780,30 @@ class stock_move(osv.osv): result = { 'product_uos_qty': 0.00 } + warning = {} if (not product_id) or (product_qty <=0.0): return {'value': result} product_obj = self.pool.get('product.product') uos_coeff = product_obj.read(cr, uid, product_id, ['uos_coeff']) + + # Warn if the quantity was decreased + for move in self.read(cr, uid, ids, ['product_qty']): + if product_qty < move['product_qty']: + warning.update({ + 'title': _('Warning: No Back Order'), + 'message': _("By changing the quantity here, you accept the " + "new quantity as complete: OpenERP will not " + "automatically generate a Back Order.") }) + break if product_uos and product_uom and (product_uom != product_uos): result['product_uos_qty'] = product_qty * uos_coeff['uos_coeff'] else: result['product_uos_qty'] = product_qty - return {'value': result} + return {'value': result, 'warning': warning} def onchange_uos_quantity(self, cr, uid, ids, product_id, product_uos_qty, product_uos, product_uom): @@ -1806,19 +1817,29 @@ class stock_move(osv.osv): result = { 'product_qty': 0.00 } + warning = {} if (not product_id) or (product_uos_qty <=0.0): return {'value': result} product_obj = self.pool.get('product.product') uos_coeff = product_obj.read(cr, uid, product_id, ['uos_coeff']) + + # Warn if the quantity was decreased + for move in self.read(cr, uid, ids, ['product_uos_qty']): + if product_uos_qty < move['product_uos_qty']: + warning.update({ + 'title': _('Warning: No Back Order'), + 'message': _("By changing the quantity here, you accept the " + "new quantity as complete: OpenERP will not " + "automatically generate a Back Order.") }) + break if product_uos and product_uom and (product_uom != product_uos): result['product_qty'] = product_uos_qty / uos_coeff['uos_coeff'] else: result['product_qty'] = product_uos_qty - - return {'value': result} + return {'value': result, 'warning': warning} def onchange_product_id(self, cr, uid, ids, prod_id=False, loc_id=False, loc_dest_id=False, address_id=False): From a2c3aad8c1628423df8ae66df943026338bf2889 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Mon, 5 Mar 2012 18:14:23 +0100 Subject: [PATCH 013/581] [FIX] unmutable default in sale/sale.py bzr revid: ls@numerigraphe.fr-20120305171423-5opxnru256g4mm9c --- addons/sale/sale.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/addons/sale/sale.py b/addons/sale/sale.py index 82bfda7b580..9606b1fd004 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -326,7 +326,7 @@ class sale_order(osv.osv): self.log(cr, uid, id, message) return True - def onchange_pricelist_id(self, cr, uid, ids, pricelist_id, order_lines, context={}): + def onchange_pricelist_id(self, cr, uid, ids, pricelist_id, order_lines, context=None): if (not pricelist_id) or (not order_lines): return {} warning = { @@ -335,7 +335,7 @@ class sale_order(osv.osv): } return {'warning': warning} - def onchange_partner_order_id(self, cr, uid, ids, order_id, invoice_id=False, shipping_id=False, context={}): + def onchange_partner_order_id(self, cr, uid, ids, order_id, invoice_id=False, shipping_id=False, context=None): if not order_id: return {} val = {} @@ -501,7 +501,9 @@ class sale_order(osv.osv): 'res_id': inv_ids and inv_ids[0] or False, } - def action_invoice_create(self, cr, uid, ids, grouped=False, states=['confirmed', 'done', 'exception'], date_inv = False, context=None): + def action_invoice_create(self, cr, uid, ids, grouped=False, states=None, date_inv=False, context=None): + if states is None: + states = ['confirmed', 'done', 'exception'] res = False invoices = {} invoice_ids = [] From 5e4446f483acaf15aa85cbd339911d2711dae9f1 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Mon, 5 Mar 2012 18:32:36 +0100 Subject: [PATCH 014/581] [FIX] unmutable default in account/account.py bzr revid: ls@numerigraphe.fr-20120305173236-wdnj66ti4bopedzp --- addons/account/account.py | 52 +++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index c1a30967aea..46b1374ccd0 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -591,12 +591,15 @@ class account_account(osv.osv): res.append((record['id'], name)) return res - def copy(self, cr, uid, id, default={}, context=None, done_list=[], local=False): + def copy(self, cr, uid, id, None, context=None, done_list=None, local=False): + if default is None: + default = {} + else: + default = default.copy() + if done_list is None: + done_list = [] account = self.browse(cr, uid, id, context=context) new_child_ids = [] - if not default: - default = {} - default = default.copy() default['code'] = (account['code'] or '') + '(copy)' if not local: done_list = [] @@ -765,11 +768,14 @@ class account_journal(osv.osv): (_check_currency, 'Configuration error! The currency chosen should be shared by the default accounts too.', ['currency','default_debit_account_id','default_credit_account_id']), ] - def copy(self, cr, uid, id, default={}, context=None, done_list=[], local=False): - journal = self.browse(cr, uid, id, context=context) - if not default: + def copy(self, cr, uid, id, default=None, context=None, done_list=None, local=False): + if default is None: default = {} - default = default.copy() + else: + default = default.copy() + if done_list is None: + done_list = [] + journal = self.browse(cr, uid, id, context=context) default['code'] = (journal['code'] or '') + '(copy)' default['name'] = (journal['name'] or '') + '(copy)' default['sequence_id'] = False @@ -1161,7 +1167,7 @@ class account_fiscalyear(osv.osv): 'end_journal_period_id':fields.many2one('account.journal.period','End of Year Entries Journal', readonly=True), } - def copy(self, cr, uid, id, default={}, context=None): + def copy(self, cr, uid, id, default=None, context=None): default.update({ 'period_ids': [], 'end_journal_period_id': False @@ -1420,9 +1426,15 @@ class account_move(osv.osv): result = super(account_move, self).create(cr, uid, vals, context) return result - def copy(self, cr, uid, id, default={}, context=None): + def copy(self, cr, uid, id, default=None, context=None): + if context is None: + default = {} + else: + default = default.copy() if context is None: context = {} + else: + context = context.copy() default.update({ 'state':'draft', 'name':'/', @@ -2239,7 +2251,9 @@ class account_model(osv.osv): _defaults = { 'legend': lambda self, cr, uid, context:_('You can specify year, month and date in the name of the model using the following labels:\n\n%(year)s: To Specify Year \n%(month)s: To Specify Month \n%(date)s: Current Date\n\ne.g. My model on %(date)s'), } - def generate(self, cr, uid, ids, datas={}, context=None): + def generate(self, cr, uid, ids, datas=None, context=None): + if datas is None: + datas = {} move_ids = [] entry = {} account_move_obj = self.pool.get('account.move') @@ -3193,7 +3207,7 @@ class wizard_multi_charts_accounts(osv.osv_memory): property_obj.create(cr, uid, vals, context=context) return True - def _install_template(self, cr, uid, template_id, company_id, code_digits=None, obj_wizard=None, acc_ref={}, taxes_ref={}, tax_code_ref={}, context=None): + def _install_template(self, cr, uid, template_id, company_id, code_digits=None, obj_wizard=None, acc_ref=None, taxes_ref=None, tax_code_ref=None, context=None): ''' This function recursively loads the template objects and create the real objects from them. @@ -3211,6 +3225,12 @@ class wizard_multi_charts_accounts(osv.osv_memory): * a last identical containing the mapping of tax code templates and tax codes :rtype: tuple(dict, dict, dict) ''' + if acc_ref is None: + acc_ref = {} + if taxes_ref is None: + taxes_ref = {} + if tax_code_ref is None: + tax_code_ref = {} template = self.pool.get('account.chart.template').browse(cr, uid, template_id, context=context) if template.parent_id: tmp1, tmp2, tmp3 = self._install_template(cr, uid, template.parent_id.id, company_id, code_digits=code_digits, acc_ref=acc_ref, taxes_ref=taxes_ref, tax_code_ref=tax_code_ref, context=context) @@ -3223,7 +3243,7 @@ class wizard_multi_charts_accounts(osv.osv_memory): tax_code_ref.update(tmp3) return acc_ref, taxes_ref, tax_code_ref - def _load_template(self, cr, uid, template_id, company_id, code_digits=None, obj_wizard=None, account_ref={}, taxes_ref={}, tax_code_ref={}, context=None): + def _load_template(self, cr, uid, template_id, company_id, code_digits=None, obj_wizard=None, account_ref=None, taxes_ref=None, tax_code_ref=None, context=None): ''' This function generates all the objects from the templates @@ -3241,6 +3261,12 @@ class wizard_multi_charts_accounts(osv.osv_memory): * a last identical containing the mapping of tax code templates and tax codes :rtype: tuple(dict, dict, dict) ''' + if account_ref is None: + account_ref = {} + if taxes_ref is None: + taxes_ref = {} + if tax_code_ref is None: + tax_code_ref = {} template = self.pool.get('account.chart.template').browse(cr, uid, template_id, context=context) obj_tax_code_template = self.pool.get('account.tax.code.template') obj_acc_tax = self.pool.get('account.tax') From f120f5aa5bd406b32839586d19555b1e629aec4d Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Mon, 5 Mar 2012 18:41:11 +0100 Subject: [PATCH 015/581] [FIX] unmutable default in account bzr revid: ls@numerigraphe.fr-20120305174111-zf5j02cm7veyvzs4 --- addons/account/account_bank.py | 6 +++--- addons/account/account_move_line.py | 2 +- addons/account/project/wizard/account_analytic_chart.py | 2 +- .../wizard/account_analytic_inverted_balance_report.py | 2 +- .../project/wizard/project_account_analytic_line.py | 2 +- addons/account/report/account_balance.py | 2 +- addons/account/report/account_central_journal.py | 2 +- addons/account/report/account_general_journal.py | 2 +- addons/account/report/account_report.py | 2 +- addons/account/report/account_tax_report.py | 8 ++++++-- addons/account/res_currency.py | 2 +- addons/account/wizard/account_invoice_state.py | 2 +- addons/account/wizard/account_journal_select.py | 2 +- addons/account/wizard/account_move_bank_reconcile.py | 2 +- addons/account/wizard/account_move_journal.py | 2 +- .../account/wizard/account_move_line_reconcile_select.py | 2 +- addons/account/wizard/account_move_line_select.py | 2 +- .../wizard/account_move_line_unreconcile_select.py | 2 +- addons/account/wizard/account_period_close.py | 2 +- addons/account/wizard/account_reconcile.py | 2 +- .../account/wizard/account_reconcile_partner_process.py | 2 +- addons/account/wizard/account_state_open.py | 2 +- addons/account/wizard/account_subscription_generate.py | 2 +- addons/account/wizard/account_unreconcile.py | 2 +- 24 files changed, 31 insertions(+), 27 deletions(-) diff --git a/addons/account/account_bank.py b/addons/account/account_bank.py index 5a84dee53de..ebd9fd80f1a 100644 --- a/addons/account/account_bank.py +++ b/addons/account/account_bank.py @@ -29,12 +29,12 @@ class bank(osv.osv): 'currency_id': fields.related('journal_id', 'currency', type="many2one", relation='res.currency', readonly=True, string="Currency", help="Currency of the related account journal."), } - def create(self, cr, uid, data, context={}): + def create(self, cr, uid, data, context=None): result = super(bank, self).create(cr, uid, data, context=context) self.post_write(cr, uid, [result], context=context) return result - def write(self, cr, uid, ids, data, context={}): + def write(self, cr, uid, ids, data, context=None): result = super(bank, self).write(cr, uid, ids, data, context=context) self.post_write(cr, uid, ids, context=context) return result @@ -43,7 +43,7 @@ class bank(osv.osv): "Return the name to use when creating a bank journal" return (bank.bank_name or '') + ' ' + bank.acc_number - def post_write(self, cr, uid, ids, context={}): + def post_write(self, cr, uid, ids, context=None): if isinstance(ids, (int, long)): ids = [ids] diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 17120ee265e..50fbf08cc2d 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -1097,7 +1097,7 @@ class account_move_line(osv.osv): 'has been confirmed!') % res[2]) return res - def _remove_move_reconcile(self, cr, uid, move_ids=[], context=None): + def _remove_move_reconcile(self, cr, uid, move_ids=None, context=None): # Function remove move rencocile ids related with moves obj_move_line = self.pool.get('account.move.line') obj_move_rec = self.pool.get('account.move.reconcile') diff --git a/addons/account/project/wizard/account_analytic_chart.py b/addons/account/project/wizard/account_analytic_chart.py index a10e938e293..92367e27da5 100644 --- a/addons/account/project/wizard/account_analytic_chart.py +++ b/addons/account/project/wizard/account_analytic_chart.py @@ -47,4 +47,4 @@ class account_analytic_chart(osv.osv_memory): return result account_analytic_chart() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/project/wizard/account_analytic_inverted_balance_report.py b/addons/account/project/wizard/account_analytic_inverted_balance_report.py index 2c9690fee50..95365716a22 100644 --- a/addons/account/project/wizard/account_analytic_inverted_balance_report.py +++ b/addons/account/project/wizard/account_analytic_inverted_balance_report.py @@ -52,4 +52,4 @@ class account_analytic_inverted_balance(osv.osv_memory): } account_analytic_inverted_balance() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/project/wizard/project_account_analytic_line.py b/addons/account/project/wizard/project_account_analytic_line.py index e49fbe911cb..54979d79b8a 100644 --- a/addons/account/project/wizard/project_account_analytic_line.py +++ b/addons/account/project/wizard/project_account_analytic_line.py @@ -55,4 +55,4 @@ class project_account_analytic_line(osv.osv_memory): project_account_analytic_line() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/report/account_balance.py b/addons/account/report/account_balance.py index c3117e60379..fdda9cb11ce 100644 --- a/addons/account/report/account_balance.py +++ b/addons/account/report/account_balance.py @@ -68,7 +68,7 @@ class account_balance(report_sxw.rml_parse, common_report_header): return self.pool.get('account.account').browse(self.cr, self.uid, data['form']['id']).company_id.name return super(account_balance ,self)._get_account(data) - def lines(self, form, ids=[], done=None):#, level=1): + def lines(self, form, ids=None, done=None): def _process_child(accounts, disp_acc, parent): account_rec = [acct for acct in accounts if acct['id']==parent][0] currency_obj = self.pool.get('res.currency') diff --git a/addons/account/report/account_central_journal.py b/addons/account/report/account_central_journal.py index d3113b63133..a42712f40d7 100644 --- a/addons/account/report/account_central_journal.py +++ b/addons/account/report/account_central_journal.py @@ -105,4 +105,4 @@ class journal_print(report_sxw.rml_parse, common_report_header): report_sxw.report_sxw('report.account.central.journal', 'account.journal.period', 'addons/account/report/account_central_journal.rml', parser=journal_print, header='internal') -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/report/account_general_journal.py b/addons/account/report/account_general_journal.py index 9eb81157dba..0ffa08b31ef 100644 --- a/addons/account/report/account_general_journal.py +++ b/addons/account/report/account_general_journal.py @@ -158,4 +158,4 @@ class journal_print(report_sxw.rml_parse, common_report_header): report_sxw.report_sxw('report.account.general.journal', 'account.journal.period', 'addons/account/report/general_journal.rml', parser=journal_print, header='internal') -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/report/account_report.py b/addons/account/report/account_report.py index 9f81f295d74..92d0fc95b85 100644 --- a/addons/account/report/account_report.py +++ b/addons/account/report/account_report.py @@ -283,4 +283,4 @@ class report_account_sales(osv.osv): )""") report_account_sales() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/report/account_tax_report.py b/addons/account/report/account_tax_report.py index 2a0c5987b47..cef1cf54af0 100644 --- a/addons/account/report/account_tax_report.py +++ b/addons/account/report/account_tax_report.py @@ -160,7 +160,7 @@ class tax_report(report_sxw.rml_parse, common_report_header): i+=1 return res - def _get_codes(self, based_on, company_id, parent=False, level=0, period_list=[], context=None): + def _get_codes(self, based_on, company_id, parent=False, level=0, period_list=None, context=None): obj_tc = self.pool.get('account.tax.code') ids = obj_tc.search(self.cr, self.uid, [('parent_id','=',parent),('company_id','=',company_id)], order='sequence', context=context) @@ -171,7 +171,11 @@ class tax_report(report_sxw.rml_parse, common_report_header): res += self._get_codes(based_on, company_id, code.id, level+1, context=context) return res - def _add_codes(self, based_on, account_list=[], period_list=[], context=None): + def _add_codes(self, based_on, account_list=None, period_list=None, context=None): + if account_list is None: + account_list = [] + if period_list is None: + period_list = [] res = [] obj_tc = self.pool.get('account.tax.code') for account in account_list: diff --git a/addons/account/res_currency.py b/addons/account/res_currency.py index 8c9c6a8b103..ce781a1e11a 100644 --- a/addons/account/res_currency.py +++ b/addons/account/res_currency.py @@ -44,4 +44,4 @@ class res_currency_account(osv.osv): res_currency_account() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_invoice_state.py b/addons/account/wizard/account_invoice_state.py index 7adcb908a34..4924f6762d5 100644 --- a/addons/account/wizard/account_invoice_state.py +++ b/addons/account/wizard/account_invoice_state.py @@ -71,4 +71,4 @@ class account_invoice_cancel(osv.osv_memory): account_invoice_cancel() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_journal_select.py b/addons/account/wizard/account_journal_select.py index 98099925e29..b91c195f6b3 100644 --- a/addons/account/wizard/account_journal_select.py +++ b/addons/account/wizard/account_journal_select.py @@ -47,4 +47,4 @@ class account_journal_select(osv.osv_memory): account_journal_select() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_move_bank_reconcile.py b/addons/account/wizard/account_move_bank_reconcile.py index 9be351ed440..65ff3f4501e 100644 --- a/addons/account/wizard/account_move_bank_reconcile.py +++ b/addons/account/wizard/account_move_bank_reconcile.py @@ -61,4 +61,4 @@ the bank account\nin the journal definition for reconciliation.')) account_move_bank_reconcile() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_move_journal.py b/addons/account/wizard/account_move_journal.py index 6756e0d06c6..4be80bd1bc3 100644 --- a/addons/account/wizard/account_move_journal.py +++ b/addons/account/wizard/account_move_journal.py @@ -38,7 +38,7 @@ class account_move_journal(osv.osv_memory): _defaults = { 'target_move': 'all' } - def _get_period(self, cr, uid, context={}): + def _get_period(self, cr, uid, context=None): """ Return default account period value """ diff --git a/addons/account/wizard/account_move_line_reconcile_select.py b/addons/account/wizard/account_move_line_reconcile_select.py index 8e57c57884d..e23212c514c 100644 --- a/addons/account/wizard/account_move_line_reconcile_select.py +++ b/addons/account/wizard/account_move_line_reconcile_select.py @@ -52,4 +52,4 @@ class account_move_line_reconcile_select(osv.osv_memory): account_move_line_reconcile_select() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_move_line_select.py b/addons/account/wizard/account_move_line_select.py index 4a2f40ec708..a99750a36fe 100644 --- a/addons/account/wizard/account_move_line_select.py +++ b/addons/account/wizard/account_move_line_select.py @@ -69,4 +69,4 @@ class account_move_line_select(osv.osv_memory): account_move_line_select() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_move_line_unreconcile_select.py b/addons/account/wizard/account_move_line_unreconcile_select.py index ad59493503d..26421eb4c0c 100644 --- a/addons/account/wizard/account_move_line_unreconcile_select.py +++ b/addons/account/wizard/account_move_line_unreconcile_select.py @@ -41,4 +41,4 @@ class account_move_line_unreconcile_select(osv.osv_memory): account_move_line_unreconcile_select() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_period_close.py b/addons/account/wizard/account_period_close.py index fecf43f07ab..6b070808bbd 100644 --- a/addons/account/wizard/account_period_close.py +++ b/addons/account/wizard/account_period_close.py @@ -60,4 +60,4 @@ class account_period_close(osv.osv_memory): account_period_close() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_reconcile.py b/addons/account/wizard/account_reconcile.py index 729792e2222..99a57f8f556 100644 --- a/addons/account/wizard/account_reconcile.py +++ b/addons/account/wizard/account_reconcile.py @@ -173,4 +173,4 @@ class account_move_line_reconcile_writeoff(osv.osv_memory): account_move_line_reconcile_writeoff() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_reconcile_partner_process.py b/addons/account/wizard/account_reconcile_partner_process.py index 7cfeff70891..fd34a222f1d 100644 --- a/addons/account/wizard/account_reconcile_partner_process.py +++ b/addons/account/wizard/account_reconcile_partner_process.py @@ -100,4 +100,4 @@ class account_partner_reconcile_process(osv.osv_memory): account_partner_reconcile_process() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_state_open.py b/addons/account/wizard/account_state_open.py index 62e837b7366..efa4baff3cc 100644 --- a/addons/account/wizard/account_state_open.py +++ b/addons/account/wizard/account_state_open.py @@ -41,4 +41,4 @@ class account_state_open(osv.osv_memory): account_state_open() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_subscription_generate.py b/addons/account/wizard/account_subscription_generate.py index 8efcd25b789..b14da9b4403 100644 --- a/addons/account/wizard/account_subscription_generate.py +++ b/addons/account/wizard/account_subscription_generate.py @@ -50,4 +50,4 @@ class account_subscription_generate(osv.osv_memory): account_subscription_generate() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_unreconcile.py b/addons/account/wizard/account_unreconcile.py index 0e6c38f9d7c..5494875cf26 100644 --- a/addons/account/wizard/account_unreconcile.py +++ b/addons/account/wizard/account_unreconcile.py @@ -50,4 +50,4 @@ class account_unreconcile_reconcile(osv.osv_memory): account_unreconcile_reconcile() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From 559843258e2955edd0a7081eb5bc1f4c438a74fb Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Mon, 5 Mar 2012 18:53:10 +0100 Subject: [PATCH 016/581] [FIX] unmutable default in stock bzr revid: ls@numerigraphe.fr-20120305175310-l3jcpsf3u0jtf2id --- addons/stock/report/product_stock.py | 4 +++- addons/stock/report/report_stock.py | 4 ++-- addons/stock/report/stock_by_location.py | 2 +- addons/stock/stock.py | 14 ++++++++++---- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/addons/stock/report/product_stock.py b/addons/stock/report/product_stock.py index b7dd254234c..1d882ad632b 100644 --- a/addons/stock/report/product_stock.py +++ b/addons/stock/report/product_stock.py @@ -42,7 +42,9 @@ class external_pdf(render): class report_stock(report_int): - def create(self, cr, uid, ids, datas, context={}): + def create(self, cr, uid, ids, datas, context=None): + if context is None: + context = {} product_ids = ids if 'location_id' in context: location_id = context['location_id'] diff --git a/addons/stock/report/report_stock.py b/addons/stock/report/report_stock.py index 37e4f28c858..d11589ae462 100644 --- a/addons/stock/report/report_stock.py +++ b/addons/stock/report/report_stock.py @@ -74,7 +74,7 @@ class stock_report_prodlots(osv.osv): group by location_id, product_id, prodlot_id )""") - def unlink(self, cr, uid, ids, context={}): + def unlink(self, cr, uid, ids, context=None): raise osv.except_osv(_('Error !'), _('You cannot delete any record!')) @@ -131,7 +131,7 @@ class stock_report_tracklots(osv.osv): group by location_id, product_id, tracking_id )""") - def unlink(self, cr, uid, ids, context={}): + def unlink(self, cr, uid, ids, context=None): raise osv.except_osv(_('Error !'), _('You cannot delete any record!')) stock_report_tracklots() diff --git a/addons/stock/report/stock_by_location.py b/addons/stock/report/stock_by_location.py index 2dbe03a347e..8ed8800fb29 100644 --- a/addons/stock/report/stock_by_location.py +++ b/addons/stock/report/stock_by_location.py @@ -26,7 +26,7 @@ from report.interface import toxml #FIXME: we should use toxml class report_custom(report_rml): - def create_xml(self, cr, uid, ids, datas, context={}): + def create_xml(self, cr, uid, ids, datas, context=None): config = """ 09/09/2005 diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 885f7cd2077..9a0bc8ebfd2 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -345,22 +345,28 @@ class stock_location(osv.osv): }) return product_obj.get_product_available(cr, uid, product_ids, context=context) - def _product_get(self, cr, uid, id, product_ids=False, context=None, states=['done']): + def _product_get(self, cr, uid, id, product_ids=False, context=None, states=None): """ @param product_ids: @param states: @return: """ + if states is None: + states = ['done'] ids = id and [id] or [] return self._product_get_multi_location(cr, uid, ids, product_ids, context=context, states=states) - def _product_all_get(self, cr, uid, id, product_ids=False, context=None, states=['done']): + def _product_all_get(self, cr, uid, id, product_ids=False, context=None, states=None): + if states is None: + states = ['done'] # build the list of ids of children of the location given by id ids = id and [id] or [] location_ids = self.search(cr, uid, [('location_id', 'child_of', ids)]) return self._product_get_multi_location(cr, uid, location_ids, product_ids, context, states) - def _product_virtual_get(self, cr, uid, id, product_ids=False, context=None, states=['done']): + def _product_virtual_get(self, cr, uid, id, product_ids=False, context=None, states=None): + if states is None: + states = ['done'] return self._product_all_get(cr, uid, id, product_ids, context, ['confirmed', 'waiting', 'assigned', 'done']) def _product_reserve(self, cr, uid, ids, product_id, product_qty, context=None, lock=False): @@ -518,7 +524,7 @@ class stock_tracking(osv.osv): def unlink(self, cr, uid, ids, context=None): raise osv.except_osv(_('Error'), _('You can not remove a lot line !')) - def action_traceability(self, cr, uid, ids, context={}): + def action_traceability(self, cr, uid, ids, context=None): """ It traces the information of a product @param self: The object pointer. @param cr: A database cursor From 520e2c680f927f16cfb97f543e2f73f7ab9ae7ac Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Mon, 5 Mar 2012 18:58:42 +0100 Subject: [PATCH 017/581] [FIX] unmutable default in account_analytic_plans bzr revid: ls@numerigraphe.fr-20120305175842-zpbl324ihaz7vj39 --- addons/account_analytic_plans/report/crossovered_analytic.py | 4 +++- .../wizard/analytic_plan_create_model.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/account_analytic_plans/report/crossovered_analytic.py b/addons/account_analytic_plans/report/crossovered_analytic.py index e2ad9e05b04..f1d8d67f445 100644 --- a/addons/account_analytic_plans/report/crossovered_analytic.py +++ b/addons/account_analytic_plans/report/crossovered_analytic.py @@ -113,7 +113,9 @@ class crossovered_analytic(report_sxw.rml_parse): result.append(res) return result - def _lines(self, form, ids={}): + def _lines(self, form, ids=None): + if ids is None: + ids = {} if not ids: ids = self.ids diff --git a/addons/account_analytic_plans/wizard/analytic_plan_create_model.py b/addons/account_analytic_plans/wizard/analytic_plan_create_model.py index 1cd3022f60b..ed5259f50bf 100644 --- a/addons/account_analytic_plans/wizard/analytic_plan_create_model.py +++ b/addons/account_analytic_plans/wizard/analytic_plan_create_model.py @@ -57,4 +57,4 @@ class analytic_plan_create_model(osv.osv_memory): analytic_plan_create_model() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From 2d2a44dcf2e3b29e4fef4000792a064862967769 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Mon, 5 Mar 2012 19:40:03 +0100 Subject: [PATCH 018/581] [FIX] unmutable default in the remaining modules [REF] coding style consistency lp bug: https://launchpad.net/bugs/525808 fixed bzr revid: ls@numerigraphe.fr-20120305184003-er00xtj9vtcw7gna --- .../report/crossovered_analytic.py | 6 +-- addons/account_anglo_saxon/__init__.py | 2 +- addons/account_anglo_saxon/sale.py | 43 ---------------- addons/account_asset/account_asset.py | 8 +-- .../report/analytic_account_budget_report.py | 8 +-- addons/account_budget/report/budget_report.py | 4 +- .../report/crossovered_budget_report.py | 4 +- .../wizard/account_budget_analytic.py | 2 +- .../account_budget_crossovered_report.py | 2 +- .../wizard/account_budget_report.py | 2 +- addons/account_coda/account_coda.py | 6 ++- addons/account_followup/__init__.py | 2 +- addons/account_followup/wizard/__init__.py | 2 +- .../wizard/account_followup_print.py | 2 +- .../wizard/account_invoice_special_message.py | 2 +- addons/account_payment/__init__.py | 2 +- addons/account_payment/account_invoice.py | 2 +- addons/account_payment/account_move_line.py | 4 +- addons/account_payment/account_payment.py | 4 +- addons/account_payment/report/__init__.py | 2 +- .../account_payment/report/payment_order.py | 4 +- addons/account_payment/wizard/__init__.py | 2 +- .../wizard/account_payment_order.py | 2 +- .../wizard/account_payment_pay.py | 2 +- .../account_payment_populate_statement.py | 2 +- addons/account_sequence/__init__.py | 2 +- addons/account_voucher/__init__.py | 2 +- addons/account_voucher/account_voucher.py | 6 ++- addons/account_voucher/report/__init__.py | 2 +- .../account_voucher/report/account_voucher.py | 2 +- .../report/account_voucher_print.py | 2 +- addons/account_voucher/wizard/__init__.py | 2 +- .../wizard/account_voucher_unreconcile.py | 2 +- addons/analytic/analytic.py | 2 +- addons/anonymization/anonymization.py | 4 +- addons/auction/auction.py | 2 +- addons/auction/barcode/code39.py | 2 +- addons/auction/barcode/common.py | 2 +- addons/auction/report/auction_invoice.py | 2 +- addons/auction/report/auction_total_rml.py | 8 +-- addons/auction/report/buyer_form_report.py | 2 +- addons/auction/report/buyer_list.py | 2 +- addons/auction/report/huissier.py | 2 +- addons/auction/report/photo_shadow.py | 2 +- addons/auction/report/seller_form_report.py | 2 +- addons/audittrail/audittrail.py | 10 ++-- addons/base_contact/base_contact.py | 6 +-- addons/base_crypt/crypt.py | 4 +- .../report/ir_module_reference_print_graph.py | 2 +- addons/base_module_quality/__init__.py | 2 +- .../base_module_quality.py | 18 +++++-- .../method_test/method_test.py | 2 +- .../object_test/object_test.py | 2 +- .../pep8_test/pep8_test.py | 2 +- .../structure_test/structure_test.py | 2 +- .../unit_test/unit_test.py | 2 +- .../wizard/module_quality_check.py | 2 +- .../wizard/quality_save_report.py | 2 +- .../workflow_test/workflow_test.py | 2 +- .../wizard/base_module_record_objects.py | 2 +- .../wizard/base_module_save.py | 2 +- .../openerp_sxw2rml/openerp_sxw2rml.py | 32 ++++++------ .../bin/script/About.py | 2 +- .../bin/script/AddAttachment.py | 16 +++--- .../bin/script/Change.py | 4 +- .../bin/script/ConvertBracesToField.py | 6 +-- .../bin/script/ConvertFieldsToBraces.py | 2 +- .../bin/script/ExportToRML.py | 2 +- .../bin/script/Expression.py | 6 +-- .../bin/script/Fields.py | 12 ++--- .../bin/script/ModifyExistingReport.py | 6 +-- .../bin/script/NewReport.py | 6 +-- .../bin/script/Repeatln.py | 8 +-- .../bin/script/SendToServer.py | 8 +-- .../bin/script/ServerParameter.py | 8 +-- .../bin/script/Translation.py | 12 ++--- .../bin/script/lib/error.py | 2 +- .../bin/script/lib/functions.py | 22 +++++--- .../bin/script/lib/logreport.py | 2 +- .../bin/script/lib/rpc.py | 4 +- .../bin/script/lib/tools.py | 6 +-- .../bin/script/modify.py | 2 +- .../test/test_fields.py | 6 ++- addons/base_setup/base_setup.py | 2 +- addons/base_synchro/base_synchro_obj.py | 8 +-- addons/base_vat/__init__.py | 2 +- addons/base_vat/res_company.py | 2 +- addons/caldav/caldav_node.py | 22 ++++---- addons/crm/crm.py | 4 +- addons/crm/crm_lead.py | 2 +- addons/crm_claim/crm_claim.py | 2 +- addons/crm_helpdesk/crm_helpdesk.py | 2 +- addons/crm_profiling/crm_profiling.py | 2 +- addons/delivery/wizard/delivery_sale_order.py | 2 +- addons/document/content_index.py | 8 +-- addons/document/document.py | 2 +- addons/document/document_directory.py | 6 +-- addons/document/nodes.py | 50 ++++++++++--------- addons/document/odt2txt.py | 6 +-- addons/document/std_index.py | 16 +++--- addons/document_webdav/document_webdav.py | 2 +- addons/document_webdav/redirect.py | 2 +- addons/document_webdav/test_davclient.py | 2 +- addons/document_webdav/webdav.py | 2 +- addons/document_webdav/webdav_server.py | 12 ++--- addons/email_template/html2text.py | 7 +-- .../wizard/mail_compose_message.py | 2 +- addons/event/event.py | 2 +- addons/event/report/__init__.py | 2 +- addons/event/res_partner.py | 2 +- addons/event/wizard/event_confirm.py | 2 +- addons/event_moodle/event_moodle.py | 2 +- addons/event_project/event_project.py | 2 +- .../wizard/event_project_retro.py | 2 +- addons/hr_attendance/wizard/__init__.py | 2 +- .../wizard/hr_attendance_bymonth.py | 2 +- .../wizard/hr_attendance_byweek.py | 2 +- .../wizard/hr_attendance_error.py | 2 +- addons/hr_evaluation/hr_evaluation.py | 2 +- .../report/report_contribution_register.py | 2 +- addons/hr_payroll/report/report_payslip.py | 2 +- .../report/report_payslip_details.py | 2 +- addons/hr_payroll_account/__init__.py | 2 +- addons/hr_payroll_account/wizard/__init__.py | 2 +- .../hr_payroll_payslips_by_employees.py | 2 +- addons/hr_recruitment/hr_recruitment.py | 2 +- .../hr_recruitment_create_partner_job.py | 4 +- .../wizard/hr_recruitment_employee_hired.py | 4 +- .../hr_timesheet_invoice.py | 2 +- .../report/account_analytic_profit.py | 2 +- .../wizard/hr_timesheet_invoice_create.py | 2 +- .../hr_timesheet_sheet/hr_timesheet_sheet.py | 4 +- .../wizard/hr_timesheet_current.py | 2 +- addons/idea/idea.py | 2 +- addons/import_base/import_framework.py | 2 +- addons/import_sugarcrm/import_sugarcrm.py | 6 +-- addons/l10n_be/__init__.py | 2 +- addons/l10n_be_invoice_bba/invoice.py | 12 ++--- addons/l10n_br/l10n_br.py | 2 +- addons/l10n_ch/partner.py | 2 +- addons/l10n_ch/payment.py | 2 +- addons/l10n_ch/report/report_webkit_html.py | 2 +- addons/l10n_ch/wizard/create_dta.py | 2 +- addons/l10n_fr/l10n_fr.py | 2 +- addons/l10n_fr/report/base_report.py | 2 +- addons/l10n_fr/wizard/fr_report_bilan.py | 2 +- .../wizard/fr_report_compute_resultant.py | 2 +- addons/l10n_lu/wizard/pdf_ext.py | 2 +- addons/lunch/report/order.py | 4 +- addons/mail/mail_thread.py | 2 +- .../mail/static/scripts/openerp_mailgate.py | 0 addons/membership/report/__init__.py | 2 +- addons/membership/report/report_membership.py | 2 +- addons/membership/wizard/__init__.py | 2 +- addons/mrp/mrp.py | 8 +-- addons/mrp/procurement.py | 2 +- addons/mrp/report/bom_structure.py | 4 +- addons/mrp/stock.py | 2 +- addons/mrp_operations/mrp_operations.py | 2 +- addons/plugin/plugin_handler.py | 2 +- .../point_of_sale/report/account_statement.py | 2 +- .../report/all_closed_cashbox_of_the_day.py | 18 +++---- addons/point_of_sale/report/pos_details.py | 6 +-- .../report/pos_details_summary.py | 4 +- addons/point_of_sale/report/pos_lines.py | 4 +- .../report/pos_payment_report.py | 6 +-- .../report/pos_payment_report_user.py | 4 +- addons/point_of_sale/report/pos_receipt.py | 2 +- addons/point_of_sale/report/pos_sales_user.py | 4 +- .../report/pos_sales_user_today.py | 4 +- .../point_of_sale/report/pos_users_product.py | 4 +- .../report/report_cash_register.py | 2 +- addons/procurement/company.py | 2 +- addons/product/product.py | 4 +- addons/product/report/product_pricelist.py | 8 +-- .../product_manufacturer.py | 2 +- addons/product_visible_discount/__init__.py | 2 +- addons/project/project.py | 24 +++++---- .../project/wizard/project_task_reevaluate.py | 2 +- addons/project_gtd/project_gtd.py | 2 +- .../project_gtd/wizard/project_gtd_empty.py | 2 +- addons/project_mailgate/project_mailgate.py | 4 +- addons/project_mrp/project_procurement.py | 2 +- addons/project_timesheet/project_timesheet.py | 2 +- .../project_timesheet/report/task_report.py | 4 +- addons/purchase/purchase.py | 4 +- .../purchase/wizard/purchase_order_group.py | 2 +- .../purchase_requisition.py | 2 +- addons/report_webkit/ir_report.py | 2 +- addons/report_webkit/report_helper.py | 2 +- addons/resource/faces/task.py | 3 +- addons/resource/resource.py | 2 +- addons/sale/edi/sale_order.py | 2 +- addons/sale/report/__init__.py | 2 +- addons/sale/wizard/__init__.py | 2 +- addons/sale/wizard/sale_make_invoice.py | 2 +- addons/sale_crm/__init__.py | 2 +- addons/sale_layout/sale_layout.py | 2 +- addons/sale_order_dates/sale_order_dates.py | 2 +- addons/stock/report/lot_overview.py | 2 +- addons/stock/report/lot_overview_all.py | 2 +- .../report/stock_inventory_move_report.py | 2 +- .../wizard/stock_invoice.py | 2 +- addons/stock_location/procurement_pull.py | 2 +- addons/stock_planning/stock_planning.py | 2 +- .../wizard/stock_planning_createlines.py | 2 +- addons/survey/survey.py | 4 +- addons/survey/wizard/__init__.py | 2 +- addons/survey/wizard/survey_answer.py | 10 ++-- addons/wiki/web/widgets/rss/feedparser.py | 4 +- .../wiki/web/widgets/wikimarkup/__init__.py | 6 ++- 211 files changed, 461 insertions(+), 440 deletions(-) delete mode 100644 addons/account_anglo_saxon/sale.py mode change 100755 => 100644 addons/document/odt2txt.py mode change 100755 => 100644 addons/document_webdav/test_davclient.py mode change 100755 => 100644 addons/email_template/html2text.py mode change 100755 => 100644 addons/mail/static/scripts/openerp_mailgate.py mode change 100755 => 100644 addons/wiki/web/widgets/rss/feedparser.py diff --git a/addons/account_analytic_plans/report/crossovered_analytic.py b/addons/account_analytic_plans/report/crossovered_analytic.py index f1d8d67f445..f990ade55a3 100644 --- a/addons/account_analytic_plans/report/crossovered_analytic.py +++ b/addons/account_analytic_plans/report/crossovered_analytic.py @@ -34,7 +34,7 @@ class crossovered_analytic(report_sxw.rml_parse): }) self.base_amount = 0.00 - def find_children(self,ref_ids): + def find_children(self, ref_ids): to_return_ids = [] final_list = [] parent_list = [] @@ -53,7 +53,7 @@ class crossovered_analytic(report_sxw.rml_parse): final_list.extend(set_list) return final_list #to_return_ids[0] - def set_account(self,cats): + def set_account(self, cats): lst = [] category = self.pool.get('account.analytic.account').read(self.cr, self.uid, cats) for cat in category: @@ -62,7 +62,7 @@ class crossovered_analytic(report_sxw.rml_parse): lst.extend(self.set_account(cat['child_ids'])) return lst - def _ref_lines(self,form): + def _ref_lines(self, form): result = [] res = {} acc_pool = self.pool.get('account.analytic.account') diff --git a/addons/account_anglo_saxon/__init__.py b/addons/account_anglo_saxon/__init__.py index 07b514d0327..440f8e87df7 100644 --- a/addons/account_anglo_saxon/__init__.py +++ b/addons/account_anglo_saxon/__init__.py @@ -23,4 +23,4 @@ import stock import purchase import invoice -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_anglo_saxon/sale.py b/addons/account_anglo_saxon/sale.py deleted file mode 100644 index e2cfa7bbb3b..00000000000 --- a/addons/account_anglo_saxon/sale.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2009 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -from osv import fields, osv - -#class sale_order_line(osv.osv): -# _name = 'sale.order.line' -# _description = 'Sale Order line' -# _inherit = 'sale.order.line' -# -# def invoice_line_create(self, cr, uid, ids, context={}): -# line_ids = super('sale_order_line',self).invoice_line_create(cr, uid, ids, context) -# invoice_line_obj = self.pool.get('account.invoice.line') -# for line in invoice_line_obj.browse(cr, uid, line_ids): -# if line.product_id: -# a = line.product_id.product_tmpl_id.property_stock_account_output and line.product_id.product_tmpl_id.property_stock_account_output.id -# if not a: -# a = line.product_id.categ_id.property_stock_account_output_categ and line.product_id.categ_id.property_stock_account_output_categ.id -# if a: -# a = self.pool.get('account.fiscal.position').map_account(cr, uid, fpos, a) -# invoice_line_obj.write(cr, uid, line.id, {'account_id':a}) -# -#sale_order_line() - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_asset/account_asset.py b/addons/account_asset/account_asset.py index 97aec1d8487..48f41df1ef4 100644 --- a/addons/account_asset/account_asset.py +++ b/addons/account_asset/account_asset.py @@ -75,7 +75,7 @@ class account_asset_asset(osv.osv): _name = 'account.asset.asset' _description = 'Asset' - def _get_period(self, cr, uid, context={}): + def _get_period(self, cr, uid, context=None): periods = self.pool.get('account.period').find(cr, uid) if periods: return periods[0] @@ -176,7 +176,9 @@ class account_asset_asset(osv.osv): year = depreciation_date.year return True - def validate(self, cr, uid, ids, context={}): + def validate(self, cr, uid, ids, context=None): + if context is None: + context = {} return self.write(cr, uid, ids, { 'state':'open' }, context) @@ -304,7 +306,7 @@ class account_asset_asset(osv.osv): default.update({'depreciation_line_ids': [], 'state': 'draft'}) return super(account_asset_asset, self).copy(cr, uid, id, default, context=context) - def _compute_entries(self, cr, uid, ids, period_id, context={}): + def _compute_entries(self, cr, uid, ids, period_id, context=None): result = [] period_obj = self.pool.get('account.period') depreciation_obj = self.pool.get('account.asset.depreciation.line') diff --git a/addons/account_budget/report/analytic_account_budget_report.py b/addons/account_budget/report/analytic_account_budget_report.py index aa5d39f8d49..e29af98b6a3 100644 --- a/addons/account_budget/report/analytic_account_budget_report.py +++ b/addons/account_budget/report/analytic_account_budget_report.py @@ -35,7 +35,9 @@ class analytic_account_budget_report(report_sxw.rml_parse): }) self.context = context - def funct(self, object, form, ids={}, done=None, level=1): + def funct(self, object, form, ids=None, done=None, level=1): + if ids is None: + ids = {} if not ids: ids = self.ids if not done: @@ -153,7 +155,7 @@ class analytic_account_budget_report(report_sxw.rml_parse): tot['perc'] = float(tot['prac'] / tot['theo']) * 100 return result - def funct_total(self,form): + def funct_total(self, form): result = [] res = {} res = { @@ -167,4 +169,4 @@ class analytic_account_budget_report(report_sxw.rml_parse): report_sxw.report_sxw('report.account.analytic.account.budget', 'account.analytic.account', 'addons/account_budget/report/analytic_account_budget_report.rml',parser=analytic_account_budget_report,header='internal') -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_budget/report/budget_report.py b/addons/account_budget/report/budget_report.py index 7681f9268d9..c7d4ba58f68 100644 --- a/addons/account_budget/report/budget_report.py +++ b/addons/account_budget/report/budget_report.py @@ -34,7 +34,9 @@ class budget_report(report_sxw.rml_parse): }) self.context = context - def funct(self, object, form, ids={}, done=None, level=1): + def funct(self, object, form, ids=None, done=None, level=1): + if ids is None: + ids = {} if not ids: ids = self.ids if not done: diff --git a/addons/account_budget/report/crossovered_budget_report.py b/addons/account_budget/report/crossovered_budget_report.py index b70b7da34bb..9f2f59fe715 100644 --- a/addons/account_budget/report/crossovered_budget_report.py +++ b/addons/account_budget/report/crossovered_budget_report.py @@ -37,7 +37,9 @@ class budget_report(report_sxw.rml_parse): }) self.context = context - def funct(self, object, form, ids={}, done=None, level=1): + def funct(self, object, form, ids=None, done=None, level=1): + if ids is None: + ids = {} if not ids: ids = self.ids if not done: diff --git a/addons/account_budget/wizard/account_budget_analytic.py b/addons/account_budget/wizard/account_budget_analytic.py index 3e3b4b0fa9d..6397ee87c76 100644 --- a/addons/account_budget/wizard/account_budget_analytic.py +++ b/addons/account_budget/wizard/account_budget_analytic.py @@ -52,4 +52,4 @@ class account_budget_analytic(osv.osv_memory): account_budget_analytic() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_budget/wizard/account_budget_crossovered_report.py b/addons/account_budget/wizard/account_budget_crossovered_report.py index ff6b6492a5a..e120bc47caa 100644 --- a/addons/account_budget/wizard/account_budget_crossovered_report.py +++ b/addons/account_budget/wizard/account_budget_crossovered_report.py @@ -53,4 +53,4 @@ class account_budget_crossvered_report(osv.osv_memory): account_budget_crossvered_report() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_budget/wizard/account_budget_report.py b/addons/account_budget/wizard/account_budget_report.py index fdae4c94adf..6ef22c649e9 100644 --- a/addons/account_budget/wizard/account_budget_report.py +++ b/addons/account_budget/wizard/account_budget_report.py @@ -54,4 +54,4 @@ class account_budget_report(osv.osv_memory): account_budget_report() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_coda/account_coda.py b/addons/account_coda/account_coda.py index e3cc6f40a0c..48fc491bee9 100644 --- a/addons/account_coda/account_coda.py +++ b/addons/account_coda/account_coda.py @@ -217,7 +217,9 @@ class coda_bank_statement(osv.osv): _name = 'coda.bank.statement' _description = 'CODA Bank Statement' - def _default_journal_id(self, cr, uid, context={}): + def _default_journal_id(self, cr, uid, context=None): + if context is None: + context = {} if context.get('journal_id', False): return context['journal_id'] return False @@ -233,7 +235,7 @@ class coda_bank_statement(osv.osv): res[r] = round(res[r], 2) return res - def _get_period(self, cr, uid, context={}): + def _get_period(self, cr, uid, context=None): periods = self.pool.get('account.period').find(cr, uid) if periods: return periods[0] diff --git a/addons/account_followup/__init__.py b/addons/account_followup/__init__.py index 4bfe3186298..ffa88c40a32 100644 --- a/addons/account_followup/__init__.py +++ b/addons/account_followup/__init__.py @@ -23,4 +23,4 @@ import account_followup import wizard import report -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_followup/wizard/__init__.py b/addons/account_followup/wizard/__init__.py index aea714d2a86..ad072c5b7d8 100644 --- a/addons/account_followup/wizard/__init__.py +++ b/addons/account_followup/wizard/__init__.py @@ -21,4 +21,4 @@ import account_followup_print -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_followup/wizard/account_followup_print.py b/addons/account_followup/wizard/account_followup_print.py index 1a5f3c0b60b..5ad3846dd71 100644 --- a/addons/account_followup/wizard/account_followup_print.py +++ b/addons/account_followup/wizard/account_followup_print.py @@ -209,7 +209,7 @@ class account_followup_print_all(osv.osv_memory): to_update[str(id)]= {'level': fups[followup_line_id][1], 'partner_id': stat_line_id} return {'partner_ids': partner_list, 'to_update': to_update} - def do_mail(self ,cr, uid, ids, context=None): + def do_mail(self, cr, uid, ids, context=None): mod_obj = self.pool.get('ir.model.data') move_obj = self.pool.get('account.move.line') user_obj = self.pool.get('res.users') diff --git a/addons/account_invoice_layout/wizard/account_invoice_special_message.py b/addons/account_invoice_layout/wizard/account_invoice_special_message.py index 27f6044a964..68edaf7cbe7 100644 --- a/addons/account_invoice_layout/wizard/account_invoice_special_message.py +++ b/addons/account_invoice_layout/wizard/account_invoice_special_message.py @@ -47,4 +47,4 @@ class account_invoice_special_msg(osv.osv_memory): account_invoice_special_msg() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_payment/__init__.py b/addons/account_payment/__init__.py index 6188de6a9da..82a05aa73e9 100644 --- a/addons/account_payment/__init__.py +++ b/addons/account_payment/__init__.py @@ -29,4 +29,4 @@ import account_move_line import account_invoice import report -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_payment/account_invoice.py b/addons/account_payment/account_invoice.py index fd787863c7d..7138540fa3b 100644 --- a/addons/account_payment/account_invoice.py +++ b/addons/account_payment/account_invoice.py @@ -50,4 +50,4 @@ class Invoice(osv.osv): Invoice() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_payment/account_move_line.py b/addons/account_payment/account_move_line.py index 24f9486be95..d01157a8a98 100644 --- a/addons/account_payment/account_move_line.py +++ b/addons/account_payment/account_move_line.py @@ -26,7 +26,7 @@ from tools.translate import _ class account_move_line(osv.osv): _inherit = "account.move.line" - def amount_to_pay(self, cr, uid, ids, name, arg={}, context=None): + def amount_to_pay(self, cr, uid, ids, name, arg=None, context=None): """ Return the amount still to pay regarding all the payemnt orders (excepting cancelled orders)""" if not ids: @@ -117,4 +117,4 @@ class account_move_line(osv.osv): account_move_line() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_payment/account_payment.py b/addons/account_payment/account_payment.py index 1de715dc777..c4257bf6f89 100644 --- a/addons/account_payment/account_payment.py +++ b/addons/account_payment/account_payment.py @@ -139,7 +139,9 @@ class payment_order(osv.osv): wf_service.trg_validate(uid, 'payment.order', ids[0], 'done', cr) return True - def copy(self, cr, uid, id, default={}, context=None): + def copy(self, cr, uid, id, default=None, context=None): + if default is None: + default = {} default.update({ 'state': 'draft', 'line_ids': [], diff --git a/addons/account_payment/report/__init__.py b/addons/account_payment/report/__init__.py index e9d7f4013ac..c73a5f33001 100644 --- a/addons/account_payment/report/__init__.py +++ b/addons/account_payment/report/__init__.py @@ -20,4 +20,4 @@ ############################################################################## import payment_order -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_payment/report/payment_order.py b/addons/account_payment/report/payment_order.py index 0b2a8061906..6872bbe3516 100644 --- a/addons/account_payment/report/payment_order.py +++ b/addons/account_payment/report/payment_order.py @@ -77,7 +77,7 @@ class payment_order(report_sxw.rml_parse): user = pool.get('res.users').browse(self.cr, self.uid, self.uid) return user.company_id and user.company_id.currency_id and user.company_id.currency_id.symbol or False - def _get_account_name(self,bank_id): + def _get_account_name(self, bank_id): if bank_id: pool = pooler.get_pool(self.cr.dbname) value_name = pool.get('res.partner.bank').name_get(self.cr, self.uid, [bank_id]) @@ -87,4 +87,4 @@ class payment_order(report_sxw.rml_parse): report_sxw.report_sxw('report.payment.order', 'payment.order', 'addons/account_payment/report/payment_order.rml', parser=payment_order, header="external") -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_payment/wizard/__init__.py b/addons/account_payment/wizard/__init__.py index 1c5aefacc78..35b907cd337 100644 --- a/addons/account_payment/wizard/__init__.py +++ b/addons/account_payment/wizard/__init__.py @@ -23,4 +23,4 @@ import account_payment_order import account_payment_populate_statement import account_payment_pay -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_payment/wizard/account_payment_order.py b/addons/account_payment/wizard/account_payment_order.py index 613b049a412..fc421abe085 100644 --- a/addons/account_payment/wizard/account_payment_order.py +++ b/addons/account_payment/wizard/account_payment_order.py @@ -119,4 +119,4 @@ class payment_order_create(osv.osv_memory): payment_order_create() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_payment/wizard/account_payment_pay.py b/addons/account_payment/wizard/account_payment_pay.py index 6bcb04fa490..3c16618f3d2 100644 --- a/addons/account_payment/wizard/account_payment_pay.py +++ b/addons/account_payment/wizard/account_payment_pay.py @@ -56,4 +56,4 @@ class account_payment_make_payment(osv.osv_memory): account_payment_make_payment() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_payment/wizard/account_payment_populate_statement.py b/addons/account_payment/wizard/account_payment_populate_statement.py index 6f2d9d02dbc..ecfd4988329 100644 --- a/addons/account_payment/wizard/account_payment_populate_statement.py +++ b/addons/account_payment/wizard/account_payment_populate_statement.py @@ -120,4 +120,4 @@ class account_payment_populate_statement(osv.osv_memory): account_payment_populate_statement() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_sequence/__init__.py b/addons/account_sequence/__init__.py index b6707106d4b..e85a910f037 100644 --- a/addons/account_sequence/__init__.py +++ b/addons/account_sequence/__init__.py @@ -22,4 +22,4 @@ import account_sequence import account_sequence_installer -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_voucher/__init__.py b/addons/account_voucher/__init__.py index 9796f81d5e5..2b1478d9fa0 100644 --- a/addons/account_voucher/__init__.py +++ b/addons/account_voucher/__init__.py @@ -24,4 +24,4 @@ import invoice import report import wizard -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 3ed173cca85..59a42ab3b24 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -830,7 +830,7 @@ class account_voucher(osv.osv): res['account_id'] = account_id return {'value':res} - def _sel_context(self, cr, uid, voucher_id,context=None): + def _sel_context(self, cr, uid, voucher_id, context=None): """ Select the context to use accordingly if it needs to be multicurrency or not. @@ -1251,7 +1251,9 @@ class account_voucher(osv.osv): move_line_pool.reconcile_partial(cr, uid, rec_ids, writeoff_acc_id=voucher.writeoff_acc_id.id, writeoff_period_id=voucher.period_id.id, writeoff_journal_id=voucher.journal_id.id) return True - def copy(self, cr, uid, id, default={}, context=None): + def copy(self, cr, uid, id, default=None, context=None): + if default is None: + default = {} default.update({ 'state': 'draft', 'number': False, diff --git a/addons/account_voucher/report/__init__.py b/addons/account_voucher/report/__init__.py index caeb155adbe..862843352a8 100644 --- a/addons/account_voucher/report/__init__.py +++ b/addons/account_voucher/report/__init__.py @@ -23,4 +23,4 @@ import account_voucher import account_voucher_print import account_voucher_sales_receipt -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_voucher/report/account_voucher.py b/addons/account_voucher/report/account_voucher.py index e44adee974e..146fcbc258a 100644 --- a/addons/account_voucher/report/account_voucher.py +++ b/addons/account_voucher/report/account_voucher.py @@ -72,4 +72,4 @@ report_sxw.report_sxw( parser=report_voucher,header="external" ) -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_voucher/report/account_voucher_print.py b/addons/account_voucher/report/account_voucher_print.py index 8bd8644c03c..6a5762be493 100644 --- a/addons/account_voucher/report/account_voucher_print.py +++ b/addons/account_voucher/report/account_voucher_print.py @@ -93,4 +93,4 @@ report_sxw.report_sxw( parser=report_voucher_print,header="external" ) -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_voucher/wizard/__init__.py b/addons/account_voucher/wizard/__init__.py index bfe32ba4b83..cc2f39f9d37 100644 --- a/addons/account_voucher/wizard/__init__.py +++ b/addons/account_voucher/wizard/__init__.py @@ -22,4 +22,4 @@ import account_voucher_unreconcile import account_statement_from_invoice -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_voucher/wizard/account_voucher_unreconcile.py b/addons/account_voucher/wizard/account_voucher_unreconcile.py index 42a9e1c5ec2..204839e3439 100644 --- a/addons/account_voucher/wizard/account_voucher_unreconcile.py +++ b/addons/account_voucher/wizard/account_voucher_unreconcile.py @@ -59,4 +59,4 @@ class account_voucher_unreconcile(osv.osv_memory): account_voucher_unreconcile() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/analytic/analytic.py b/addons/analytic/analytic.py index 6241b6e06f0..6583de992b2 100644 --- a/addons/analytic/analytic.py +++ b/addons/analytic/analytic.py @@ -219,7 +219,7 @@ class account_analytic_account(osv.osv): default['line_ids'] = [] return super(account_analytic_account, self).copy(cr, uid, id, default, context=context) - def on_change_partner_id(self, cr, uid, id, partner_id, context={}): + def on_change_partner_id(self, cr, uid, id, partner_id, context=None): if not partner_id: return {'value': {'contact_id': False}} addr = self.pool.get('res.partner').address_get(cr, uid, [partner_id], ['invoice']) diff --git a/addons/anonymization/anonymization.py b/addons/anonymization/anonymization.py index 39fb415e9e1..6e94838a4e7 100644 --- a/addons/anonymization/anonymization.py +++ b/addons/anonymization/anonymization.py @@ -350,7 +350,7 @@ class ir_model_fields_anonymize_wizard(osv.osv_memory): }) raise osv.except_osv(error_type, error_msg) - def anonymize_database(self,cr, uid, ids, context=None): + def anonymize_database(self, cr, uid, ids, context=None): """Sets the 'anonymized' state to defined fields""" # create a new history record: @@ -485,7 +485,7 @@ class ir_model_fields_anonymize_wizard(osv.osv_memory): 'target':'new', } - def reverse_anonymize_database(self,cr, uid, ids, context=None): + def reverse_anonymize_database(self, cr, uid, ids, context=None): """Set the 'clear' state to defined fields""" ir_model_fields_anonymization_model = self.pool.get('ir.model.fields.anonymization') diff --git a/addons/auction/auction.py b/addons/auction/auction.py index e701e399acf..03e6c805d78 100644 --- a/addons/auction/auction.py +++ b/addons/auction/auction.py @@ -533,7 +533,7 @@ class auction_lots(osv.osv): return self._sum_taxes_by_type_and_id(costs) # sum remise limite net and ristourne - def compute_seller_costs_summed(self, cr, uid, ids): #ach_pay_id + def compute_seller_costs_summed(self, cr, uid, ids): """This Fuction sum Net remittance limit and refund""" diff --git a/addons/auction/barcode/code39.py b/addons/auction/barcode/code39.py index a3926c6c48d..7dd7e5fca54 100644 --- a/addons/auction/barcode/code39.py +++ b/addons/auction/barcode/code39.py @@ -114,7 +114,7 @@ def _encode39(str, cksum): class _Code39Base(Barcode): - def __init__(self, value = "", **args): + def __init__(self, value="", **args): self.xdim = inch * 0.0075 self.lquiet = None self.rquiet = None diff --git a/addons/auction/barcode/common.py b/addons/auction/barcode/common.py index e6933fd1673..aa03b1079ca 100644 --- a/addons/auction/barcode/common.py +++ b/addons/auction/barcode/common.py @@ -39,7 +39,7 @@ class Barcode(Flowable): """Abstract Base for barcodes. Includes implementations of some methods suitable for the more primitive barcode types""" - def __init__(self, value = ''): + def __init__(self, value=''): self.value = value if not hasattr(self, 'gap'): diff --git a/addons/auction/report/auction_invoice.py b/addons/auction/report/auction_invoice.py index 40ca8498756..172c7dc73d3 100644 --- a/addons/auction/report/auction_invoice.py +++ b/addons/auction/report/auction_invoice.py @@ -26,7 +26,7 @@ class auction_invoice(report_int): def __init__(self, name): report_int.__init__(self, name) - def create(self,cr, uid, ids, datas, context): + def create(self, cr, uid, ids, datas, context): lots = self.pool.get('auction.lots').read(cr, uid, ids, ['ach_inv_id'], context=context) invoices = {} diff --git a/addons/auction/report/auction_total_rml.py b/addons/auction/report/auction_total_rml.py index 610cb108cc4..38f9adaa040 100644 --- a/addons/auction/report/auction_total_rml.py +++ b/addons/auction/report/auction_total_rml.py @@ -65,7 +65,7 @@ class auction_total_rml(report_sxw.rml_parse): return auct_dat - def sum_taxes(self,auction_id): + def sum_taxes(self, auction_id): self.cr.execute("select count(1) from auction_lots where id IN %s and auction_id=%s group by auction_id ", (tuple(self.total_obj),auction_id,)) res = self.cr.fetchone() return res[0] @@ -105,17 +105,17 @@ class auction_total_rml(report_sxw.rml_parse): res = self.cr.fetchone() return str(res[0]) or 0.0 - def sum_credit(self,auction_id): + def sum_credit(self, auction_id): self.cr.execute("select sum(buyer_price) from auction_lots where id IN %s and auction_id=%s", (tuple(self.total_obj),auction_id,)) res = self.cr.fetchone() return str(res[0]) - def sum_debit_buyer(self,auction_id): + def sum_debit_buyer(self, auction_id): self.cr.execute("select sum(buyer_price) from auction_lots where id IN %s and auction_id=%s", (tuple(self.total_obj),auction_id,)) res = self.cr.fetchone() return str(res[0] or 0) - def sum_debit(self,object_id): + def sum_debit(self, object_id): self.cr.execute("select sum(seller_price) from auction_lots where auction_id=%s", (object_id,)) res = self.cr.fetchone() return str(res[0] or 0) diff --git a/addons/auction/report/buyer_form_report.py b/addons/auction/report/buyer_form_report.py index 37b82cd872e..dea4c836f2b 100644 --- a/addons/auction/report/buyer_form_report.py +++ b/addons/auction/report/buyer_form_report.py @@ -58,7 +58,7 @@ class buyer_form_report(report_sxw.rml_parse): lots.append(object) return ret_dict.values() - def grand_buyer_total(self,o): + def grand_buyer_total(self, o): grand_total = 0 for oo in o: grand_total =grand_total + oo['obj_price'] +self.sum_taxes(oo) diff --git a/addons/auction/report/buyer_list.py b/addons/auction/report/buyer_list.py index 3829238a43f..1b088e40330 100644 --- a/addons/auction/report/buyer_list.py +++ b/addons/auction/report/buyer_list.py @@ -62,7 +62,7 @@ class buyer_list(report_sxw.rml_parse): auct_dat.append(auc_dates_fields) return auct_dat - def lines_lots_auct_lot(self,obj): + def lines_lots_auct_lot(self, obj): auc_date_ids = self.pool.get('auction.dates').search(self.cr, self.uid, ([('name','like',obj['name'])])) diff --git a/addons/auction/report/huissier.py b/addons/auction/report/huissier.py index 1d680548886..e9d7cc145da 100644 --- a/addons/auction/report/huissier.py +++ b/addons/auction/report/huissier.py @@ -30,7 +30,7 @@ class report_custom(report_rml): def __init__(self, name, table, tmpl, xsl): report_rml.__init__(self, name, table, tmpl, xsl) - def create_xml(self,cr, uid, ids, datas, context=None): + def create_xml(self, cr, uid, ids, datas, context=None): pool= pooler.get_pool(cr.dbname) lots = pool.get('auction.lots').browse(cr, uid, ids, context=context) auction = lots[0].auction_id diff --git a/addons/auction/report/photo_shadow.py b/addons/auction/report/photo_shadow.py index 919fa701e23..fb9cfe4f893 100644 --- a/addons/auction/report/photo_shadow.py +++ b/addons/auction/report/photo_shadow.py @@ -19,7 +19,7 @@ # ############################################################################## -def convert_catalog(from_file, to_file, size=220) : +def convert_catalog(from_file, to_file, size=220): return __convert(from_file, to_file, size) def convert(from_file, to_file): diff --git a/addons/auction/report/seller_form_report.py b/addons/auction/report/seller_form_report.py index 06ff021dcc1..c602cce0714 100644 --- a/addons/auction/report/seller_form_report.py +++ b/addons/auction/report/seller_form_report.py @@ -58,7 +58,7 @@ class seller_form_report(report_sxw.rml_parse): lots = partner.get('lots') lots.append(object) return ret_dict.values() - def grand_seller_total(self,o): + def grand_seller_total(self, o): grand_total = 0 for oo in o: grand_total =grand_total + oo['obj_price']+ self.sum_taxes(oo) diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py index 302d6e146bd..25ba8e1c8b6 100644 --- a/addons/audittrail/audittrail.py +++ b/addons/audittrail/audittrail.py @@ -201,7 +201,7 @@ class audittrail_objects_proxy(object_proxy): res = value return res - def create_log_line(self, cr, uid, log_id, model, lines=[]): + def create_log_line(self, cr, uid, log_id, model, lines=None): """ Creates lines for changed fields with its old and new values @@ -210,6 +210,8 @@ class audittrail_objects_proxy(object_proxy): @param model: Object which values are being changed @param lines: List of values for line is to be created """ + if lines is None: + lines = [] pool = pooler.get_pool(cr.dbname) obj_pool = pool.get(model.model) model_pool = pool.get('ir.model') @@ -348,7 +350,7 @@ class audittrail_objects_proxy(object_proxy): data[(model.id, resource_id)] = {'text':values_text, 'value': values} return data - def prepare_audittrail_log_line(self, cr, uid, pool, model, resource_id, method, old_values, new_values, field_list=[]): + def prepare_audittrail_log_line(self, cr, uid, pool, model, resource_id, method, old_values, new_values, field_list=None): """ This function compares the old data (i.e before the method was executed) and the new data (after the method was executed) and returns a structure with all the needed information to @@ -378,6 +380,8 @@ class audittrail_objects_proxy(object_proxy): record (res.partner, for example), we may have to log a change done in a x2many field (on res.partner.address, for example) """ + if field_list is None: + field_list = [] key = (model.id, resource_id) lines = { key: [] @@ -416,7 +420,7 @@ class audittrail_objects_proxy(object_proxy): lines[key].append(data) return lines - def process_data(self, cr, uid, pool, res_ids, model, method, old_values={}, new_values={}, field_list=[]): + def process_data(self, cr, uid, pool, res_ids, model, method, old_values=None, new_values=None, field_list=None): """ This function processes and iterates recursively to log the difference between the old data (i.e before the method was executed) and the new data and creates audittrail log diff --git a/addons/base_contact/base_contact.py b/addons/base_contact/base_contact.py index 59ac8a0b4df..0106ce6ae2c 100644 --- a/addons/base_contact/base_contact.py +++ b/addons/base_contact/base_contact.py @@ -175,7 +175,7 @@ class res_partner_address(osv.osv): ids = self.pool.get('res.partner.location').search(cr, uid, [('partner_id','=',context['default_partner_id'])], context=context) return ids and ids[0] or False - def onchange_location_id(self,cr, uid, ids, location_id=False, context={}): + def onchange_location_id(self, cr, uid, ids, location_id=False, context=None): if not location_id: return {} location = self.pool.get('res.partner.location').browse(cr, uid, location_id, context=context) @@ -209,7 +209,7 @@ class res_partner_address(osv.osv): 'name' : fields.related('contact_id', 'name', type='char', size=64, string="Contact Name", store=True), 'title' : fields.related('contact_id', 'title', type='many2one', relation='res.partner.title', string="Title", store=True), } - def create(self, cr, uid, data, context={}): + def create(self, cr, uid, data, context=None): if not data.get('location_id', False): loc_id = self.pool.get('res.partner.location').create(cr, uid, { 'street': data.get('street',''), @@ -241,7 +241,7 @@ class res_partner_address(osv.osv): 'location_id': _default_location_id } - def default_get(self, cr, uid, fields=[], context=None): + def default_get(self, cr, uid, fields=None, context=None): if context is None: context = {} if 'default_type' in context: diff --git a/addons/base_crypt/crypt.py b/addons/base_crypt/crypt.py index c2fd0a25ef8..82cd939a015 100644 --- a/addons/base_crypt/crypt.py +++ b/addons/base_crypt/crypt.py @@ -45,7 +45,9 @@ from service import security magic_md5 = '$1$' -def gen_salt( length=8, symbols=ascii_letters + digits ): +def gen_salt( length=8, symbols=None): + if symbols is None: + symbols = ascii_letters + digits seed() return ''.join( sample( symbols, length ) ) diff --git a/addons/base_module_doc_rst/report/ir_module_reference_print_graph.py b/addons/base_module_doc_rst/report/ir_module_reference_print_graph.py index 62848383000..e70b2da63b1 100644 --- a/addons/base_module_doc_rst/report/ir_module_reference_print_graph.py +++ b/addons/base_module_doc_rst/report/ir_module_reference_print_graph.py @@ -79,4 +79,4 @@ report_sxw.report_sxw('report.ir.module.reference.graph', 'ir.module.module', 'addons/base_module_doc_rst/report/ir_module_reference_graph.rml', parser=ir_module_reference_print_graph, header=False) -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_quality/__init__.py b/addons/base_module_quality/__init__.py index 8ff78f7c202..602710fb602 100644 --- a/addons/base_module_quality/__init__.py +++ b/addons/base_module_quality/__init__.py @@ -22,4 +22,4 @@ import base_module_quality import wizard -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_quality/base_module_quality.py b/addons/base_module_quality/base_module_quality.py index bbe20bc0b4f..349821f1081 100644 --- a/addons/base_module_quality/base_module_quality.py +++ b/addons/base_module_quality/base_module_quality.py @@ -115,7 +115,9 @@ class abstract_quality_check(object): self.log.debug('get_objects() obj_list: %s', ','.join(obj_list)) return obj_list - def get_model_ids(self, cr, uid, models=[]): + def get_model_ids(self, cr, uid, models=None): + if models is None: + models = [] # This function returns all ids of the given objects.. if not models: return [] @@ -133,7 +135,12 @@ class abstract_quality_check(object): result_ids[obj] = ids return result_ids - def format_table(self, header=[], data_list={}): #This function can work forwidget="text_wiki" + def format_table(self, header=None, data_list=None): + #This function can work forwidget="text_wiki" + if header is None: + header = [] + if data_list is None: + data_list = {} detail = "" detail += (header[0]) % tuple(header[1]) frow = '\n|-' @@ -144,7 +151,12 @@ class abstract_quality_check(object): detail = detail + '\n|}' return detail - def format_html_table(self, header=[], data_list=[]): #This function can work for widget="html_tag" + def format_html_table(self, header=None, data_list=None): + #This function can work for widget="html_tag" + if header is None: + header = [] + if data_list is None: + data_list = [] # function create html table.... detail = "" detail += (header[0]) % tuple(header[1]) diff --git a/addons/base_module_quality/method_test/method_test.py b/addons/base_module_quality/method_test/method_test.py index 2884e064b54..a708c088b80 100644 --- a/addons/base_module_quality/method_test/method_test.py +++ b/addons/base_module_quality/method_test/method_test.py @@ -85,4 +85,4 @@ This test checks if the module classes are raising exception when calling basic detail += self.format_table(header, dict_method) return detail -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_quality/object_test/object_test.py b/addons/base_module_quality/object_test/object_test.py index 0a3f8ce379d..810b0a215a8 100644 --- a/addons/base_module_quality/object_test/object_test.py +++ b/addons/base_module_quality/object_test/object_test.py @@ -208,4 +208,4 @@ Test checks for fields, views, security rules, dependancy level return res return "" -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_quality/pep8_test/pep8_test.py b/addons/base_module_quality/pep8_test/pep8_test.py index 4aaaaa7bddc..ef347cdaad4 100644 --- a/addons/base_module_quality/pep8_test/pep8_test.py +++ b/addons/base_module_quality/pep8_test/pep8_test.py @@ -278,4 +278,4 @@ PEP-8 Test , copyright of py files check, method can not call from loops return res return "" -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_quality/structure_test/structure_test.py b/addons/base_module_quality/structure_test/structure_test.py index 2238d5f3a93..f8fef4d46f4 100644 --- a/addons/base_module_quality/structure_test/structure_test.py +++ b/addons/base_module_quality/structure_test/structure_test.py @@ -176,4 +176,4 @@ This test checks if the module satisfy tiny structure return res return "" -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_quality/unit_test/unit_test.py b/addons/base_module_quality/unit_test/unit_test.py index 248f647310c..be378ced45f 100644 --- a/addons/base_module_quality/unit_test/unit_test.py +++ b/addons/base_module_quality/unit_test/unit_test.py @@ -111,4 +111,4 @@ This test checks the Unit Test(PyUnit) Cases of the module. Note that 'unit_test return detail + html +'' return '' -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_quality/wizard/module_quality_check.py b/addons/base_module_quality/wizard/module_quality_check.py index 8b6f1157a29..6d03843e8b5 100644 --- a/addons/base_module_quality/wizard/module_quality_check.py +++ b/addons/base_module_quality/wizard/module_quality_check.py @@ -49,4 +49,4 @@ class quality_check(osv.osv_memory): quality_check() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_quality/wizard/quality_save_report.py b/addons/base_module_quality/wizard/quality_save_report.py index e4286e92237..d9e7c08b424 100644 --- a/addons/base_module_quality/wizard/quality_save_report.py +++ b/addons/base_module_quality/wizard/quality_save_report.py @@ -49,4 +49,4 @@ class quality_save_report(osv.osv_memory): quality_save_report() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_quality/workflow_test/workflow_test.py b/addons/base_module_quality/workflow_test/workflow_test.py index 11f7bcf12c3..5b27689eb2f 100644 --- a/addons/base_module_quality/workflow_test/workflow_test.py +++ b/addons/base_module_quality/workflow_test/workflow_test.py @@ -155,4 +155,4 @@ class quality_test(base_module_quality.abstract_quality_check): count = self.count_button(node, count) return count -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_record/wizard/base_module_record_objects.py b/addons/base_module_record/wizard/base_module_record_objects.py index e822c68c8fe..868a377a106 100644 --- a/addons/base_module_record/wizard/base_module_record_objects.py +++ b/addons/base_module_record/wizard/base_module_record_objects.py @@ -127,7 +127,7 @@ class base_module_record_objects(osv.osv_memory): _name = 'base.module.record.objects' _description = "Base Module Record Objects" - def inter_call(self,cr,uid,data,context=None): + def inter_call(self, cr, uid, data, context=None): res=base_module_save._create_module(self, cr, uid, data, context) mod_obj = self.pool.get('ir.model.data') model_data_ids = mod_obj.search(cr, uid,[('model', '=', 'ir.ui.view'), ('name', '=', 'module_create_form_view')], context=context) diff --git a/addons/base_module_record/wizard/base_module_save.py b/addons/base_module_record/wizard/base_module_save.py index 1d54e212a28..914e5cbddac 100644 --- a/addons/base_module_record/wizard/base_module_save.py +++ b/addons/base_module_record/wizard/base_module_save.py @@ -167,4 +167,4 @@ class base_module_save(osv.osv_memory): base_module_save() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_report_designer/openerp_sxw2rml/openerp_sxw2rml.py b/addons/base_report_designer/openerp_sxw2rml/openerp_sxw2rml.py index 4819007f1d0..32c05a2c768 100644 --- a/addons/base_report_designer/openerp_sxw2rml/openerp_sxw2rml.py +++ b/addons/base_report_designer/openerp_sxw2rml/openerp_sxw2rml.py @@ -42,11 +42,11 @@ import copy class DomApiGeneral: """General DOM API utilities.""" - def __init__(self,content_string="",file=""): + def __init__(self, content_string="", file=""): self.content_string = content_string self.re_digits = re.compile(r"(.*?\d)(pt|cm|mm|inch|in)") - def _unitTuple(self,string): + def _unitTuple(self, string): """Split values and units to a tuple.""" temp = self.re_digits.findall(string) if not temp: @@ -54,13 +54,15 @@ class DomApiGeneral: else: return (temp[0]) - def stringPercentToFloat(self,string): + def stringPercentToFloat(self, string): temp = string.replace("""%""","") return float(temp)/100 - def findChildrenByName(self,parent,name,attr_dict={}): + def findChildrenByName(self, parent, name, attr_dict=None): """Helper functions. Does not work recursively. Optional: also test for certain attribute/value pairs.""" + if attr_dict is None: + attr_dict = {} children = [] for c in parent.childNodes: if c.nodeType == c.ELEMENT_NODE and c.nodeName == name: @@ -70,7 +72,7 @@ class DomApiGeneral: else: return self._selectForAttributes(nodelist=children,attr_dict=attr_dict) - def _selectForAttributes(self,nodelist,attr_dict): + def _selectForAttributes(self, nodelist, attr_dict): "Helper function.""" selected_nodes = [] for n in nodelist: @@ -83,7 +85,7 @@ class DomApiGeneral: selected_nodes.append(n) return selected_nodes - def _stringToTuple(self,s): + def _stringToTuple(self, s): """Helper function.""" try: temp = string.split(s,",") @@ -91,13 +93,13 @@ class DomApiGeneral: except: return None - def _tupleToString(self,t): + def _tupleToString(self, t): try: return self.openOfficeStringUtf8("%s,%s" % (t[0],t[1])) except: return None - def _lengthToFloat(self,value): + def _lengthToFloat(self, value): v = value if not self.re_digits.search(v): return v @@ -113,7 +115,7 @@ class DomApiGeneral: except: return v - def openOfficeStringUtf8(self,string): + def openOfficeStringUtf8(self, string): if type(string) == unicode: return string.encode("utf-8") tempstring = unicode(string,"cp1252").encode("utf-8") @@ -121,7 +123,7 @@ class DomApiGeneral: class DomApi(DomApiGeneral): """This class provides a DOM-API for XML-Files from an SXW-Archive.""" - def __init__(self,xml_content,xml_styles): + def __init__(self, xml_content, xml_styles): DomApiGeneral.__init__(self) self.content_dom = xml.dom.minidom.parseString(xml_content) self.styles_dom = xml.dom.minidom.parseString(xml_styles) @@ -145,7 +147,7 @@ class DomApi(DomApiGeneral): for s in self.style_dict.keys(): self.style_properties_dict[s] = self.getStylePropertiesDict(s) - def updateWithPercents(self,dict,updatedict): + def updateWithPercents(self, dict, updatedict): """Sometimes you find values like "115%" in the style hierarchy.""" if not updatedict: # no style hierarchies for this style? => @@ -244,7 +246,7 @@ class DomApi(DomApiGeneral): def toxml(self): return self.content_dom.toxml(encoding="utf-8") - def getStylePropertiesDict(self,style_name): + def getStylePropertiesDict(self, style_name): res = {} if self.style_dict[style_name].hasAttribute("style:parent-style-name"): @@ -265,7 +267,7 @@ class PyOpenOffice(object): self.save_pict = save_pict self.images = {} - def oo_read(self,fname): + def oo_read(self, fname): z = zipfile.ZipFile(fname,"r") content = z.read('content.xml') style = z.read('styles.xml') @@ -281,7 +283,7 @@ class PyOpenOffice(object): z.close() return content,style - def oo_replace(self,content): + def oo_replace(self, content): regex = [ (r"]*/>", ""), (r"(.*?)]*/>", "$2"), @@ -290,7 +292,7 @@ class PyOpenOffice(object): content = re.sub(key, val, content) return content - def unpackNormalize(self,sourcefile): + def unpackNormalize(self, sourcefile): c,s = self.oo_read(sourcefile) c = self.oo_replace(c) dom = DomApi(c,s) diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/About.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/About.py index 401cf88b418..43b452b82e2 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/About.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/About.py @@ -52,7 +52,7 @@ if __name__<>'package': from lib.gui import * class About(unohelper.Base, XJobExecutor): - def __init__(self,ctx): + def __init__(self, ctx): self.ctx = ctx self.module = "openerp_report" self.version = "0.1" diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/AddAttachment.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/AddAttachment.py index c65ba32e6bf..69e297ab4c0 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/AddAttachment.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/AddAttachment.py @@ -64,7 +64,7 @@ class AddAttachment(unohelper.Base, XJobExecutor ): 'PDF' : 'pdf', 'OpenOffice': 'sxw', } - def __init__(self,ctx): + def __init__(self, ctx): self.ctx = ctx self.module = "openerp_report" self.version = "0.1" @@ -132,7 +132,7 @@ class AddAttachment(unohelper.Base, XJobExecutor ): self.win.addButton('btnCancel', -2 - 27 , -5 , 30 , 15, 'Cancel' ,actionListenerProc = self.btnCancel_clicked ) self.win.doModalDialog("lstResourceType", self.Kind.keys()[0]) - def btnSearch_clicked( self, oActionEvent ): + def btnSearch_clicked(self, oActionEvent): modelSelectedItem = self.win.getListBoxSelectedItem("lstmodel") if modelSelectedItem == "": return @@ -151,7 +151,7 @@ class AddAttachment(unohelper.Base, XJobExecutor ): for result in self.aSearchResult: self.lstResource.addItem(result[1],result[0]) - def _send_attachment( self, name, data, res_model, res_id ): + def _send_attachment(self, name, data, res_model, res_id): desktop = getDesktop() oDoc2 = desktop.getCurrentComponent() docinfo = oDoc2.getDocumentInfo() @@ -166,7 +166,7 @@ class AddAttachment(unohelper.Base, XJobExecutor ): return self.sock.execute( database, uid, self.password, 'ir.attachment', 'create', params ) - def send_attachment( self, model, resource_id ): + def send_attachment(self, model, resource_id): desktop = getDesktop() oDoc2 = desktop.getCurrentComponent() docinfo = oDoc2.getDocumentInfo() @@ -187,7 +187,7 @@ class AddAttachment(unohelper.Base, XJobExecutor ): data = read_data_from_file( get_absolute_file_path( url ) ) return self._send_attachment( os.path.basename( url ), data, model, resource_id ) - def btnOkWithoutInformation_clicked( self, oActionEvent ): + def btnOkWithoutInformation_clicked(self, oActionEvent): desktop = getDesktop() oDoc2 = desktop.getCurrentComponent() docinfo = oDoc2.getDocumentInfo() @@ -199,7 +199,7 @@ class AddAttachment(unohelper.Base, XJobExecutor ): res = self.send_attachment( docinfo.getUserFieldValue(3), docinfo.getUserFieldValue(2) ) self.win.endExecute() - def btnOkWithInformation_clicked(self,oActionEvent): + def btnOkWithInformation_clicked(self, oActionEvent): if self.win.getListBoxSelectedItem("lstResourceType") == "": ErrorDialog( "Please select resource type", "", "Selection ERROR" ) return @@ -221,7 +221,7 @@ class AddAttachment(unohelper.Base, XJobExecutor ): res = self.send_attachment( self.dModel[self.win.getListBoxSelectedItem('lstmodel')], resourceid ) self.win.endExecute() - def btnCancel_clicked( self, oActionEvent ): + def btnCancel_clicked(self, oActionEvent): self.win.endExecute() def doc2pdf(self, strFile): @@ -262,7 +262,7 @@ class AddAttachment(unohelper.Base, XJobExecutor ): # Can be None if len(strFilterSubName) <= 0 return filename - def _MakePropertyValue(self, cName = "", uValue = u"" ): + def _MakePropertyValue(self, cName="", uValue=u"" ): oPropertyValue = createUnoStruct( "com.sun.star.beans.PropertyValue" ) if cName: oPropertyValue.Name = cName diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Change.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Change.py index cdc5c7553b1..3c76ac90207 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Change.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Change.py @@ -59,7 +59,7 @@ if __name__<>"package": database="test" class Change( unohelper.Base, XJobExecutor ): - def __init__(self,ctx): + def __init__(self, ctx): self.ctx = ctx self.module = "openerp_report" self.version = "0.1" @@ -107,7 +107,7 @@ class Change( unohelper.Base, XJobExecutor ): self.lstProtocol.addItem(i,self.lstProtocol.getItemCount() ) self.win.doModalDialog( "lstProtocol", protocol) - def btnNext_clicked(self,oActionEvent): + def btnNext_clicked(self, oActionEvent): global url aVal='' #aVal= Fetature used diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertBracesToField.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertBracesToField.py index bb80c3ecd61..49844b4bfe3 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertBracesToField.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertBracesToField.py @@ -63,7 +63,7 @@ if __name__<>"package": class ConvertBracesToField( unohelper.Base, XJobExecutor ): - def __init__(self,ctx): + def __init__(self, ctx): self.ctx = ctx self.module = "openerp_report" @@ -198,7 +198,7 @@ class ConvertBracesToField( unohelper.Base, XJobExecutor ): info = reduce(lambda x, y: x+y, traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback)) self.logobj.log_write('ConvertBraceToField', LOG_ERROR, info) - def getRes(self,sock,sObject,sVar): + def getRes(self, sock, sObject, sVar): desktop=getDesktop() doc =desktop.getCurrentComponent() docinfo=doc.getDocumentInfo() @@ -215,7 +215,7 @@ class ConvertBracesToField( unohelper.Base, XJobExecutor ): sObject = self.getRes(sock,res[myval]['relation'], sVar[sVar.find("/")+1:]) return sObject - def getBraces(self,aReportSyntex=[]): + def getBraces(self, aReportSyntex=None): desktop=getDesktop() doc = desktop.getCurrentComponent() aSearchString=[] diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertFieldsToBraces.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertFieldsToBraces.py index 892061c56b4..ffa88a8cd06 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertFieldsToBraces.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertFieldsToBraces.py @@ -57,7 +57,7 @@ if __name__<>"package": uid = 3 class ConvertFieldsToBraces( unohelper.Base, XJobExecutor ): - def __init__(self,ctx): + def __init__(self, ctx): self.ctx = ctx self.module = "openerp_report" self.version = "0.1" diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ExportToRML.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ExportToRML.py index dd00f1719e1..293fee7388b 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ExportToRML.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ExportToRML.py @@ -67,7 +67,7 @@ if __name__<>"package": class ExportToRML( unohelper.Base, XJobExecutor ): - def __init__(self,ctx): + def __init__(self, ctx): self.ctx = ctx self.module = "openerp_report" self.version = "0.1" diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Expression.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Expression.py index ecdf13454dc..aaedb30e8fd 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Expression.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Expression.py @@ -57,7 +57,7 @@ if __name__<>"package": uid = 3 class Expression(unohelper.Base, XJobExecutor ): - def __init__(self,sExpression="",sName="", bFromModify=False): + def __init__(self, sExpression="", sName="", bFromModify=False): LoginTest() if not loginstatus and __name__=="package": exit(1) @@ -75,7 +75,7 @@ class Expression(unohelper.Base, XJobExecutor ): self.win.doModalDialog("",None) - def btnOk_clicked( self, oActionEvent ): + def btnOk_clicked(self, oActionEvent): desktop=getDesktop() doc = desktop.getCurrentComponent() text = doc.Text @@ -105,7 +105,7 @@ class Expression(unohelper.Base, XJobExecutor ): else: ErrorDialog("Please Fill appropriate data in Name field or \nExpression field") - def btnCancel_clicked( self, oActionEvent ): + def btnCancel_clicked(self, oActionEvent): self.win.endExecute() if __name__<>"package" and __name__=="__main__": diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Fields.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Fields.py index 92044f78fe1..d480d683868 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Fields.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Fields.py @@ -64,7 +64,7 @@ if __name__<>"package": class Fields(unohelper.Base, XJobExecutor ): - def __init__(self,sVariable="",sFields="",sDisplayName="",bFromModify=False): + def __init__(self, sVariable="", sFields="", sDisplayName="", bFromModify=False): LoginTest() if not loginstatus and __name__=="package": exit(1) @@ -177,7 +177,7 @@ class Fields(unohelper.Base, XJobExecutor ): ErrorDialog("Please insert user define field Field-1 or Field-4","Just go to File->Properties->User Define \nField-1 Eg. http://localhost:8069 \nOR \nField-4 Eg. account.invoice") self.win.endExecute() - def lstbox_selected(self,oItemEvent): + def lstbox_selected(self, oItemEvent): try: desktop=getDesktop() @@ -200,7 +200,7 @@ class Fields(unohelper.Base, XJobExecutor ): if self.bModify: self.win.setEditText("txtUName",self.sGDisplayName) - def getRes(self,sock ,sObject,sVar): + def getRes(self, sock, sObject, sVar): desktop=getDesktop() doc =desktop.getCurrentComponent() docinfo=doc.getDocumentInfo() @@ -219,7 +219,7 @@ class Fields(unohelper.Base, XJobExecutor ): else: return sObject - def cmbVariable_selected(self,oItemEvent): + def cmbVariable_selected(self, oItemEvent): if self.count > 0 : try: desktop=getDesktop() @@ -246,7 +246,7 @@ class Fields(unohelper.Base, XJobExecutor ): info = reduce(lambda x, y: x+y, traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback)) self.logobj.log_write('Fields', LOG_ERROR, info) - def btnOk_clicked( self, oActionEvent ): + def btnOk_clicked(self, oActionEvent): desktop=getDesktop() doc = desktop.getCurrentComponent() cursor = doc.getCurrentController().getViewCursor() @@ -281,7 +281,7 @@ class Fields(unohelper.Base, XJobExecutor ): else: ErrorDialog("Please Fill appropriate data in Name field \nor select perticular value from the list of fields") - def btnCancel_clicked( self, oActionEvent ): + def btnCancel_clicked(self, oActionEvent): self.win.endExecute() if __name__<>"package" and __name__=="__main__": diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ModifyExistingReport.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ModifyExistingReport.py index 2ccd8358c97..d93dc3521e4 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ModifyExistingReport.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ModifyExistingReport.py @@ -66,7 +66,7 @@ if __name__<>'package': # class ModifyExistingReport(unohelper.Base, XJobExecutor): - def __init__(self,ctx): + def __init__(self, ctx): self.ctx = ctx self.module = "openerp_report" self.version = "0.1" @@ -178,10 +178,10 @@ class ModifyExistingReport(unohelper.Base, XJobExecutor): self.win.endExecute() - def btnCancel_clicked( self, oActionEvent ): + def btnCancel_clicked(self, oActionEvent): self.win.endExecute() - def btnDelete_clicked( self, oActionEvent ): + def btnDelete_clicked(self, oActionEvent): desktop=getDesktop() doc = desktop.getCurrentComponent() docinfo=doc.getDocumentInfo() diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/NewReport.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/NewReport.py index 6022e44df7a..138c68b690e 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/NewReport.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/NewReport.py @@ -66,7 +66,7 @@ if __name__<>"package": # # class NewReport(unohelper.Base, XJobExecutor): - def __init__(self,ctx): + def __init__(self, ctx): self.ctx = ctx self.module = "openerp_report" self.version = "0.1" @@ -99,7 +99,7 @@ class NewReport(unohelper.Base, XJobExecutor): self.win.addButton('btnCancel',-2 - 70 - 5 ,-5, 35,15,'Cancel' ,actionListenerProc = self.btnCancel_clicked ) self.win.doModalDialog("",None) - def btnOk_clicked(self,oActionEvent): + def btnOk_clicked(self, oActionEvent): desktop=getDesktop() doc = desktop.getCurrentComponent() docinfo=doc.getDocumentInfo() @@ -107,7 +107,7 @@ class NewReport(unohelper.Base, XJobExecutor): self.logobj.log_write('Module Name',LOG_INFO, ':Module use in creating a report %s using database %s' % (self.aModuleName[self.lstModule.getSelectedItemPos()], database)) self.win.endExecute() - def btnCancel_clicked( self, oActionEvent ): + def btnCancel_clicked(self, oActionEvent): self.win.endExecute() if __name__<>"package" and __name__=="__main__": diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Repeatln.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Repeatln.py index 0eab6d1710c..50af718849e 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Repeatln.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Repeatln.py @@ -64,7 +64,7 @@ if __name__<>"package": #class RepeatIn: class RepeatIn( unohelper.Base, XJobExecutor ): - def __init__(self,sObject="",sVariable="",sFields="",sDisplayName="",bFromModify=False): + def __init__(self, sObject="", sVariable="", sFields="", sDisplayName="", bFromModify=False): # Interface Design LoginTest() self.logobj=Logger() @@ -204,7 +204,7 @@ class RepeatIn( unohelper.Base, XJobExecutor ): ErrorDialog("Please Select Appropriate module" ,"Create new report from: \nOpenERP -> Open a New Report") self.win.endExecute() - def lstbox_selected(self,oItemEvent): + def lstbox_selected(self, oItemEvent): sItem=self.win.getListBoxSelectedItem("lstFields") sMain=self.aListRepeatIn[self.win.getListBoxSelectedItemPos("lstFields")] @@ -215,7 +215,7 @@ class RepeatIn( unohelper.Base, XJobExecutor ): self.win.setEditText("txtName",sMain[sMain.rfind("/")+1:]) self.win.setEditText("txtUName","|-."+sItem[sItem.rfind("/")+1:]+".-|") - def cmbVariable_selected(self,oItemEvent): + def cmbVariable_selected(self, oItemEvent): if self.count > 0 : @@ -290,7 +290,7 @@ class RepeatIn( unohelper.Base, XJobExecutor ): else: ErrorDialog("Please Fill appropriate data in Object Field or Name field \nor select perticular value from the list of fields") - def btnCancel_clicked( self, oActionEvent ): + def btnCancel_clicked(self, oActionEvent): self.win.endExecute() if __name__<>"package" and __name__=="__main__": diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/SendToServer.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/SendToServer.py index 3a6d799f8a5..dcc0aa6f632 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/SendToServer.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/SendToServer.py @@ -74,7 +74,7 @@ class SendtoServer(unohelper.Base, XJobExecutor): 'HTML' : 'html' } - def __init__(self,ctx): + def __init__(self, ctx): self.ctx = ctx self.module = "openerp_report" self.version = "0.1" @@ -138,10 +138,10 @@ class SendtoServer(unohelper.Base, XJobExecutor): self.win.doModalDialog("lstResourceType", self.Kind.keys()[0]) - def lstbox_selected(self,oItemEvent): + def lstbox_selected(self, oItemEvent): pass - def btnCancel_clicked( self, oActionEvent ): + def btnCancel_clicked(self, oActionEvent): self.win.endExecute() def btnOk_clicked(self, oActionEvent): @@ -223,7 +223,7 @@ class SendtoServer(unohelper.Base, XJobExecutor): id=self.sock.execute(database, uid, self.password, 'ir.actions.report.xml' ,'create', params) return id - def getInverseFieldsRecord(self,nVal): + def getInverseFieldsRecord(self, nVal): desktop=getDesktop() doc = desktop.getCurrentComponent() count=0 diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ServerParameter.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ServerParameter.py index 9b69e4a5c15..cb87d0fc5c7 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ServerParameter.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ServerParameter.py @@ -59,7 +59,7 @@ if __name__<>"package": database="test" class ServerParameter( unohelper.Base, XJobExecutor ): - def __init__(self, aVal= None, sURL=""): + def __init__(self, aVal=None, sURL=""): self.module = "openerp_report" self.version = "0.1" desktop=getDesktop() @@ -116,7 +116,7 @@ class ServerParameter( unohelper.Base, XJobExecutor ): #self.win.doModalDialog("lstDatabase",docinfo.getUserFieldValue(2)) - def btnOk_clicked(self,oActionEvent): + def btnOk_clicked(self, oActionEvent): sLogin=self.win.getEditText("txtLoginName") sPassword=self.win.getEditText("txtPassword") @@ -158,10 +158,10 @@ class ServerParameter( unohelper.Base, XJobExecutor ): self.win.endExecute() - def btnCancel_clicked( self, oActionEvent ): + def btnCancel_clicked(self, oActionEvent): self.win.endExecute() - def btnPrevious_clicked(self,oActionEvent): + def btnPrevious_clicked(self, oActionEvent): self.win.endExecute() Change(None) self.win.endExecute() diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Translation.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Translation.py index 73146f1b68a..576bc0c3134 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Translation.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/Translation.py @@ -61,7 +61,7 @@ if __name__<>"package": class AddLang(unohelper.Base, XJobExecutor ): - def __init__(self,sVariable="",sFields="",sDisplayName="",bFromModify=False): + def __init__(self, sVariable="", sFields="", sDisplayName="", bFromModify=False): LoginTest() if not loginstatus and __name__=="package": exit(1) @@ -157,7 +157,7 @@ class AddLang(unohelper.Base, XJobExecutor ): ErrorDialog("Please insert user define field Field-1 or Field-4","Just go to File->Properties->User Define \nField-1 Eg. http://localhost:8069 \nOR \nField-4 Eg. account.invoice") self.win.endExecute() - def lstbox_selected(self,oItemEvent): + def lstbox_selected(self, oItemEvent): try: desktop=getDesktop() @@ -183,7 +183,7 @@ class AddLang(unohelper.Base, XJobExecutor ): if self.bModify: self.win.setEditText("txtUName",self.sGDisplayName) - def getRes(self,sock ,sObject,sVar): + def getRes(self, sock, sObject, sVar): desktop=getDesktop() doc =desktop.getCurrentComponent() docinfo=doc.getDocumentInfo() @@ -203,7 +203,7 @@ class AddLang(unohelper.Base, XJobExecutor ): return sObject - def cmbVariable_selected(self,oItemEvent): + def cmbVariable_selected(self, oItemEvent): if self.count > 0 : try: desktop=getDesktop() @@ -229,7 +229,7 @@ class AddLang(unohelper.Base, XJobExecutor ): except: import traceback;traceback.print_exc() - def btnOk_clicked( self, oActionEvent ): + def btnOk_clicked(self, oActionEvent): self.bOkay = True desktop=getDesktop() doc = desktop.getCurrentComponent() @@ -263,7 +263,7 @@ class AddLang(unohelper.Base, XJobExecutor ): else: ErrorDialog("Please Fill appropriate data in Name field \nor select perticular value from the list of fields") - def btnCancel_clicked( self, oActionEvent ): + def btnCancel_clicked(self, oActionEvent): self.win.endExecute() diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/error.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/error.py index c0a3e5b5d63..cb86f5f429a 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/error.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/error.py @@ -48,7 +48,7 @@ if __name__<>"package": from gui import * class ErrorDialog: - def __init__(self,sErrorMsg, sErrorHelpMsg="",sTitle="Error Message"): + def __init__(self, sErrorMsg, sErrorHelpMsg="", sTitle="Error Message"): self.win = DBModalDialog(50, 50, 150, 90, sTitle) self.win.addFixedText("lblErrMsg", 5, 5, 190, 25, sErrorMsg) self.win.addFixedText("lblErrHelpMsg", 5, 30, 190, 25, sErrorHelpMsg) diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/functions.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/functions.py index 29f1cd87e46..1b614224147 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/functions.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/functions.py @@ -59,7 +59,13 @@ if __name__<>"package": database="test" uid = 1 -def genTree(object,aList,insField,host,level=3, ending=[], ending_excl=[], recur=[], root='', actualroot=""): +def genTree(object, aList, insField, host, level=3, ending=None, ending_excl=None, recur=None, root='', actualroot=""): + if ending is None: + ending = [] + if ending_excl is None: + ending_excl = [] + if recur is None: + recur = [] try: global url sock=RPCSession(url) @@ -79,7 +85,7 @@ def genTree(object,aList,insField,host,level=3, ending=[], ending_excl=[], recur info = reduce(lambda x, y: x+y, traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback)) obj.log_write('Function', LOG_ERROR, info) -def VariableScope(oTcur,insVariable,aObjectList,aComponentAdd,aItemList,sTableName=""): +def VariableScope(oTcur, insVariable, aObjectList, aComponentAdd, aItemList, sTableName=""): if sTableName.find(".") != -1: for i in range(len(aItemList)): if aComponentAdd[i]==sTableName: @@ -96,7 +102,7 @@ def VariableScope(oTcur,insVariable,aObjectList,aComponentAdd,aItemList,sTableNa if aObjectList[j][:aObjectList[j].find("(")] == sLVal and sLVal!="": insVariable.append(aObjectList[j]) -def getList(aObjectList,host,count): +def getList(aObjectList, host, count): desktop=getDesktop() doc =desktop.getCurrentComponent() docinfo=doc.getDocumentInfo() @@ -128,7 +134,7 @@ def getList(aObjectList,host,count): else: aObjectList.append("List of " + docinfo.getUserFieldValue(3)) -def getRelation(sRelName, sItem, sObjName, aObjectList, host ): +def getRelation(sRelName, sItem, sObjName, aObjectList, host): global url sock=RPCSession(url) global passwd @@ -143,7 +149,7 @@ def getRelation(sRelName, sItem, sObjName, aObjectList, host ): getRelation(res[k]['relation'], sItem[sItem.find(".")+1:], sObjName,aObjectList,host) -def getPath(sPath,sMain): +def getPath(sPath, sMain): desktop=getDesktop() doc =desktop.getCurrentComponent() oParEnum = doc.getTextFields().createEnumeration() @@ -161,7 +167,7 @@ def getPath(sPath,sMain): getPath(sPath, sMain) return sPath -def EnumDocument(aItemList,aComponentAdd): +def EnumDocument(aItemList, aComponentAdd): desktop = getDesktop() parent="" bFlag = False @@ -183,7 +189,7 @@ def EnumDocument(aItemList,aComponentAdd): aItemList.append( templist ) aComponentAdd.append( parent ) -def getChildTable(oPar,aItemList,aComponentAdd,sTableName=""): +def getChildTable(oPar, aItemList, aComponentAdd, sTableName=""): sNames = oPar.getCellNames() bEmptyTableFlag=True for val in sNames: @@ -229,7 +235,7 @@ def getChildTable(oPar,aItemList,aComponentAdd,sTableName=""): aComponentAdd.append(sTableName+"."+oPar.Name) return 0 -def getRecersiveSection(oCurrentSection,aSectionList): +def getRecersiveSection(oCurrentSection, aSectionList): desktop=getDesktop() doc =desktop.getCurrentComponent() oParEnum=doc.getText().createEnumeration() diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/logreport.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/logreport.py index 2aab8596862..b03c1360cad 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/logreport.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/logreport.py @@ -39,7 +39,7 @@ def log_detail(self): logger.setLevel(logging.INFO) class Logger(object): - def log_write(self,name,level,msg): + def log_write(self, name, level, msg): log = logging.getLogger(name) getattr(log,level)(msg) diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/rpc.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/rpc.py index f7c7f636485..5d6f8ca6dbc 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/rpc.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/rpc.py @@ -52,7 +52,7 @@ class RPCGateway(object): class RPCSession(object): - def __init__(self,url): + def __init__(self, url): m = re.match('^(http[s]?://|socket://)([\w.\-]+):(\d{1,5})$', url or '') @@ -152,7 +152,7 @@ class XMLRPCGateway(RPCGateway): return res - def execute(self, sDatabase,UID,sPassword,obj, method, *args): + def execute(self, sDatabase, UID, sPassword, obj, method, *args): global rpc_url sock = xmlrpclib.ServerProxy(rpc_url + 'object') diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/tools.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/tools.py index ef22a3a0d51..53dc81f5bc3 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/tools.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/lib/tools.py @@ -21,19 +21,19 @@ ############################################################################## import urllib -def get_absolute_file_path( url ): +def get_absolute_file_path(url): url_unquoted = urllib.unquote(url) return os.name == 'nt' and url_unquoted[1:] or url_unquoted # This function reads the content of a file and return it to the caller -def read_data_from_file( filename ): +def read_data_from_file(filename): fp = file( filename, "rb" ) data = fp.read() fp.close() return data # This function writes the content to a file -def write_data_to_file( filename, data ): +def write_data_to_file(filename, data): fp = file( filename, 'wb' ) fp.write( data ) fp.close() diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/modify.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/modify.py index fc3d6672b79..41f00de7183 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/modify.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/modify.py @@ -61,7 +61,7 @@ if __name__<>"package": uid = 3 class modify(unohelper.Base, XJobExecutor ): - def __init__( self, ctx ): + def __init__(self, ctx): self.ctx = ctx self.module = "openerp_report" self.version = "0.1" diff --git a/addons/base_report_designer/plugin/openerp_report_designer/test/test_fields.py b/addons/base_report_designer/plugin/openerp_report_designer/test/test_fields.py index 8954aa8d7a8..ac2b2fb2881 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/test/test_fields.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/test/test_fields.py @@ -10,7 +10,11 @@ import time sock = xmlrpclib.ServerProxy('http://localhost:8069/xmlrpc/object') -def get(object, level=3, ending=[], ending_excl=[], recur=[], root=''): +def get(object, level=3, ending=None, ending_excl=None, recur=None, root=''): + if ending is None: + ending = [] + if ending_excl is None: + ending_excl = [] res = sock.execute('terp', 3, 'admin', 'account.invoice', 'fields_get') key = res.keys() key.sort() diff --git a/addons/base_setup/base_setup.py b/addons/base_setup/base_setup.py index c10dee7b14b..3d624e9f33a 100644 --- a/addons/base_setup/base_setup.py +++ b/addons/base_setup/base_setup.py @@ -84,7 +84,7 @@ def _lang_get(self, cr, uid, context=None): res = [(r['code'], r['name']) for r in res] return res -def _tz_get(self,cr,uid, context=None): +def _tz_get(self, cr, uid, context=None): return [(x, x) for x in pytz.all_timezones] class user_preferences_config(osv.osv_memory): diff --git a/addons/base_synchro/base_synchro_obj.py b/addons/base_synchro/base_synchro_obj.py index 78df80591bc..f35275b3c44 100644 --- a/addons/base_synchro/base_synchro_obj.py +++ b/addons/base_synchro/base_synchro_obj.py @@ -65,10 +65,12 @@ class base_synchro_obj(osv.osv): # Return a list of changes: [ (date, id) ] # - def get_ids(self, cr, uid, object, dt, domain=[], context=None): - return self._get_ids(cr, uid, object, dt, domain, context=context) + def get_ids(self, cr, uid, object, dt, domain=None, context=None): + return self._get_ids(cr, uid, object, dt, domain=domain, context=context) - def _get_ids(self, cr, uid, object, dt, domain=[], context=None): + def _get_ids(self, cr, uid, object, dt, domain=None, context=None): + if domain is None: + domain = [] result = [] if dt: domain2 = domain+[('write_date','>=',dt)] diff --git a/addons/base_vat/__init__.py b/addons/base_vat/__init__.py index 1d7c143b7dc..2331d5661c1 100644 --- a/addons/base_vat/__init__.py +++ b/addons/base_vat/__init__.py @@ -22,4 +22,4 @@ import res_company import base_vat -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_vat/res_company.py b/addons/base_vat/res_company.py index e7641db9c68..1c63aa20f07 100644 --- a/addons/base_vat/res_company.py +++ b/addons/base_vat/res_company.py @@ -29,4 +29,4 @@ class res_company_vat (osv.osv): "rather than via a simple format validation (checksum)."), } - \ No newline at end of file + diff --git a/addons/caldav/caldav_node.py b/addons/caldav/caldav_node.py index 71e9bdc2468..211fcd3da95 100644 --- a/addons/caldav/caldav_node.py +++ b/addons/caldav/caldav_node.py @@ -42,7 +42,7 @@ class node_calendar_collection(nodes.node_dir): DAV_M_NS = dict_merge2(nodes.node_dir.DAV_M_NS, { "http://calendarserver.org/ns/" : '_get_dav', } ) - def _file_get(self,cr, nodename=False): + def _file_get(self, cr, nodename=False): return [] def _child_get(self, cr, name=False, parent_id=False, domain=None): @@ -99,7 +99,7 @@ class node_calendar_res_col(nodes.node_res_obj): DAV_M_NS = dict_merge2(nodes.node_res_obj.DAV_M_NS, { "http://calendarserver.org/ns/" : '_get_dav', } ) - def _file_get(self,cr, nodename=False): + def _file_get(self, cr, nodename=False): return [] def _child_get(self, cr, name=False, parent_id=False, domain=None): @@ -180,7 +180,7 @@ class node_calendar(nodes.node_class): http_options = { 'DAV': ['calendar-access'] } - def __init__(self,path, parent, context, calendar): + def __init__(self, path, parent, context, calendar): super(node_calendar,self).__init__(path, parent,context) self.calendar_id = calendar.id self.mimetype = 'application/x-directory' @@ -271,7 +271,7 @@ class node_calendar(nodes.node_class): def children(self, cr, domain=None): return self._child_get(cr, domain=domain) - def child(self,cr, name, domain=None): + def child(self, cr, name, domain=None): res = self._child_get(cr, name, domain=domain) if res: return res[0] @@ -353,16 +353,16 @@ class node_calendar(nodes.node_class): return None - def set_data(self, cr, data, fil_obj = None): + def set_data(self, cr, data, fil_obj=None): uid = self.context.uid calendar_obj = self.context._dirobj.pool.get('basic.calendar') res = calendar_obj.import_cal(cr, uid, data, self.calendar_id) return res - def get_data_len(self, cr, fil_obj = None): + def get_data_len(self, cr, fil_obj=None): return self.content_length - def _get_ttag(self,cr): + def _get_ttag(self, cr): return 'calendar-%d' % (self.calendar_id,) def rmcol(self, cr): @@ -441,7 +441,7 @@ class res_node_calendar(nodes.node_class): http_options = { 'DAV': ['calendar-access'] } - def __init__(self,path, parent, context, res_obj, res_model=None, res_id=None): + def __init__(self, path, parent, context, res_obj, res_model=None, res_id=None): super(res_node_calendar,self).__init__(path, parent, context) self.mimetype = 'text/calendar' self.create_date = parent.create_date @@ -474,10 +474,10 @@ class res_node_calendar(nodes.node_class): def _get_caldav_calendar_data(self, cr): return self.get_data(cr) - def get_data_len(self, cr, fil_obj = None): + def get_data_len(self, cr, fil_obj=None): return self.content_length - def set_data(self, cr, data, fil_obj = None): + def set_data(self, cr, data, fil_obj=None): uid = self.context.uid context = self.context.context.copy() context.update(self.dctx) @@ -486,7 +486,7 @@ class res_node_calendar(nodes.node_class): res = calendar_obj.import_cal(cr, uid, data, self.calendar_id, context=context) return res - def _get_ttag(self,cr): + def _get_ttag(self, cr): res = False if self.model and self.res_id: res = '%s_%d' % (self.model, self.res_id) diff --git a/addons/crm/crm.py b/addons/crm/crm.py index 4ebb0b4796d..a12c1662c0f 100644 --- a/addons/crm/crm.py +++ b/addons/crm/crm.py @@ -331,7 +331,9 @@ class crm_case(crm_base): And object that inherit (orm inheritance) from a class the overwrite copy """ - def stage_find(self, cr, uid, section_id, domain=[], order='sequence'): + def stage_find(self, cr, uid, section_id, domain=None, order='sequence'): + if domain is None: + domain = [] domain = list(domain) if section_id: domain.append(('section_ids', '=', section_id)) diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index b17fa31ac91..a93ae8b4de2 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -239,7 +239,7 @@ class crm_lead(crm_case, osv.osv): def on_change_optout(self, cr, uid, ids, optout): return {'value':{'optout':optout,'optin':False}} - def onchange_stage_id(self, cr, uid, ids, stage_id, context={}): + def onchange_stage_id(self, cr, uid, ids, stage_id, context=None): if not stage_id: return {'value':{}} stage = self.pool.get('crm.case.stage').browse(cr, uid, stage_id, context) diff --git a/addons/crm_claim/crm_claim.py b/addons/crm_claim/crm_claim.py index fb6b8f90bda..1ee431cd77a 100644 --- a/addons/crm_claim/crm_claim.py +++ b/addons/crm_claim/crm_claim.py @@ -157,7 +157,7 @@ class crm_claim(crm.crm_case, osv.osv): self.write(cr, uid, [res_id], vals, context=context) return res_id - def message_update(self, cr, uid, ids, msg, vals={}, default_act='pending', context=None): + def message_update(self, cr, uid, ids, msg, vals=None, default_act='pending', context=None): if isinstance(ids, (str, int, long)): ids = [ids] diff --git a/addons/crm_helpdesk/crm_helpdesk.py b/addons/crm_helpdesk/crm_helpdesk.py index 97ed007f456..f60e0e112b3 100644 --- a/addons/crm_helpdesk/crm_helpdesk.py +++ b/addons/crm_helpdesk/crm_helpdesk.py @@ -112,7 +112,7 @@ class crm_helpdesk(crm.crm_case, osv.osv): self.write(cr, uid, [res_id], vals, context) return res_id - def message_update(self, cr, uid, ids, msg, vals={}, default_act='pending', context=None): + def message_update(self, cr, uid, ids, msg, vals=None, default_act='pending', context=None): if isinstance(ids, (str, int, long)): ids = [ids] diff --git a/addons/crm_profiling/crm_profiling.py b/addons/crm_profiling/crm_profiling.py index 587ddbe0b52..83d19b14d97 100644 --- a/addons/crm_profiling/crm_profiling.py +++ b/addons/crm_profiling/crm_profiling.py @@ -77,7 +77,7 @@ def _get_parents(cr, uid, ids): return ids_to_check -def test_prof(cr, uid, seg_id, pid, answers_ids = []): +def test_prof(cr, uid, seg_id, pid, answers_ids=None): """ return True if the partner pid fetch the segmentation rule seg_id @param cr: the current row, from the database cursor, diff --git a/addons/delivery/wizard/delivery_sale_order.py b/addons/delivery/wizard/delivery_sale_order.py index 80b3431f2a7..a8339ce800a 100644 --- a/addons/delivery/wizard/delivery_sale_order.py +++ b/addons/delivery/wizard/delivery_sale_order.py @@ -44,7 +44,7 @@ class make_delivery(osv.osv_memory): return res - def view_init(self, cr , uid , fields, context=None): + def view_init(self, cr, uid, fields, context=None): if context is None: context = {} order_obj = self.pool.get('sale.order') diff --git a/addons/document/content_index.py b/addons/document/content_index.py index 64b480ee736..88767f7fed9 100644 --- a/addons/document/content_index.py +++ b/addons/document/content_index.py @@ -51,7 +51,7 @@ class indexer(object): return mts[0] return None - def indexContent(self, content, filename=None, realfile = None): + def indexContent(self, content, filename=None, realfile=None): """ Use either content or the real file, to index. Some parsers will work better with the actual content, others parse a file easier. Try the @@ -95,10 +95,10 @@ class indexer(object): raise NhException('No appropriate method to index file') - def _doIndexContent(self,content): + def _doIndexContent(self, content): raise NhException("Content not handled here") - def _doIndexFile(self,fpath): + def _doIndexFile(self, fpath): raise NhException("Content not handled here") def __repr__(self): @@ -136,7 +136,7 @@ class contentIndex(object): if not f: raise Exception("Your indexer should at least suport a mimetype or extension") - def doIndex(self, content, filename=None, content_type=None, realfname = None, debug=False): + def doIndex(self, content, filename=None, content_type=None, realfname=None, debug=False): fobj = None fname = None mime = None diff --git a/addons/document/document.py b/addons/document/document.py index 9ea7f97a321..5e95eee241c 100644 --- a/addons/document/document.py +++ b/addons/document/document.py @@ -146,7 +146,7 @@ class document_file(osv.osv): _sql_constraints = [ # filename_uniq is not possible in pure SQL ] - def _check_duplication(self, cr, uid, vals, ids=[], op='create'): + def _check_duplication(self, cr, uid, vals, ids=None, op='create'): name = vals.get('name', False) parent_id = vals.get('parent_id', False) res_model = vals.get('res_model', False) diff --git a/addons/document/document_directory.py b/addons/document/document_directory.py index d09d2cc86d5..33f1da1125b 100644 --- a/addons/document/document_directory.py +++ b/addons/document/document_directory.py @@ -69,7 +69,7 @@ class document_directory(osv.osv): } - def _get_root_directory(self, cr,uid, context=None): + def _get_root_directory(self, cr, uid, context=None): objid=self.pool.get('ir.model.data') try: mid = objid._get_id(cr, uid, 'document', 'dir_root') @@ -224,7 +224,7 @@ class document_directory(osv.osv): pass return res - def _locate_child(self, cr, uid, root_id, uri,nparent, ncontext): + def _locate_child(self, cr, uid, root_id, uri, nparent, ncontext): """ try to locate the node in uri, Return a tuple (node_dir, remaining_path) """ @@ -237,7 +237,7 @@ class document_directory(osv.osv): default.update({'name': name+ " (copy)"}) return super(document_directory,self).copy(cr, uid, id, default, context=context) - def _check_duplication(self, cr, uid, vals, ids=[], op='create'): + def _check_duplication(self, cr, uid, vals, ids=None, op='create'): name=vals.get('name',False) parent_id=vals.get('parent_id',False) ressource_parent_type_id=vals.get('ressource_parent_type_id',False) diff --git a/addons/document/nodes.py b/addons/document/nodes.py index ee89f3d4c6c..21e5029bd39 100644 --- a/addons/document/nodes.py +++ b/addons/document/nodes.py @@ -104,7 +104,7 @@ class node_context(object): def get(self, name, default=None): return self.context.get(name, default) - def get_uri(self, cr, uri): + def get_uri(self, cr, uri): """ Although this fn passes back to doc.dir, it is needed since it is a potential caching point. """ @@ -253,7 +253,7 @@ class node_class(object): print "node_class.children()" return [] #stub - def child(self,cr, name, domain=None): + def child(self, cr, name, domain=None): print "node_class.child()" return None @@ -271,7 +271,7 @@ class node_class(object): print "node_class.path_get()" return False - def get_data(self,cr): + def get_data(self, cr): raise TypeError('no data for %s'% self.type) def open_data(self, cr, mode): @@ -288,10 +288,10 @@ class node_class(object): """ raise TypeError('no data for %s' % self.type) - def _get_storage(self,cr): + def _get_storage(self, cr): raise RuntimeError("no storage for base class") - def get_etag(self,cr): + def get_etag(self, cr): """ Get a tag, unique per object + modification. see. http://tools.ietf.org/html/rfc2616#section-13.3.3 """ @@ -435,7 +435,9 @@ class node_database(node_class): """ our_type = 'database' - def __init__(self, path=[], parent=False, context=None): + def __init__(self, path=None, parent=False, context=None): + if path is None: + path = [] super(node_database,self).__init__(path, parent, context) self.unixperms = 040750 self.uidperms = 5 @@ -478,11 +480,11 @@ class node_database(node_class): return res - def _file_get(self,cr, nodename=False): + def _file_get(self, cr, nodename=False): res = [] return res - def _get_ttag(self,cr): + def _get_ttag(self, cr): return 'db-%s' % cr.dbname def mkdosname(company_name, default='noname'): @@ -694,7 +696,7 @@ class node_dir(node_database): fnode.set_data(cr, data, fil) return fnode - def _get_ttag(self,cr): + def _get_ttag(self, cr): return 'dir-%d' % self.dir_id def move_to(self, cr, ndir_node, new_name=False, fil_obj=None, ndir_obj=None, in_write=False): @@ -803,7 +805,7 @@ class node_res_dir(node_class): def children(self, cr, domain=None): return self._child_get(cr, domain=domain) - def child(self,cr, name, domain=None): + def child(self, cr, name, domain=None): res = self._child_get(cr, name, domain=domain) if res: return res[0] @@ -879,7 +881,7 @@ class node_res_dir(node_class): res.append(self.res_obj_class(res_name, self.dir_id, self, self.context, self.res_model, bo)) return res - def _get_ttag(self,cr): + def _get_ttag(self, cr): return 'rdir-%d' % self.dir_id class node_res_obj(node_class): @@ -890,7 +892,7 @@ class node_res_obj(node_class): node_dirs (with limited domain). """ our_type = 'collection' - def __init__(self, path, dir_id, parent, context, res_model, res_bo, res_id = None): + def __init__(self, path, dir_id, parent, context, res_model, res_bo, res_id=None): super(node_res_obj,self).__init__(path, parent,context) assert parent #todo: more info from dirr @@ -959,7 +961,7 @@ class node_res_obj(node_class): return res[0] return None - def _file_get(self,cr, nodename=False): + def _file_get(self, cr, nodename=False): res = [] is_allowed = self.check_perms((nodename and 1) or 5) if not is_allowed: @@ -1161,7 +1163,7 @@ class node_res_obj(node_class): fnode.set_data(cr, data, fil) return fnode - def _get_ttag(self,cr): + def _get_ttag(self, cr): return 'rodir-%d-%d' % (self.dir_id, self.res_id) node_res_dir.res_obj_class = node_res_obj @@ -1263,7 +1265,7 @@ class node_file(node_class): else: self.path = dirpath[0] - def get_data(self, cr, fil_obj = None): + def get_data(self, cr, fil_obj=None): """ Retrieve the data for some file. fil_obj may optionally be specified, and should be a browse object for the file. This is useful when the caller has already initiated @@ -1279,14 +1281,14 @@ class node_file(node_class): stobj = self.context._dirobj.pool.get('document.storage') return stobj.get_data(cr, self.context.uid,stor, self,self.context.context, fil_obj) - def get_data_len(self, cr, fil_obj = None): + def get_data_len(self, cr, fil_obj=None): # TODO: verify with the storage object! bin_size = self.context.context.get('bin_size', False) if bin_size and not self.content_length: self.content_length = fil_obj.db_datas return self.content_length - def set_data(self, cr, data, fil_obj = None): + def set_data(self, cr, data, fil_obj=None): """ Store data at some file. fil_obj may optionally be specified, and should be a browse object for the file. This is useful when the caller has already initiated @@ -1300,7 +1302,7 @@ class node_file(node_class): stobj = self.context._dirobj.pool.get('document.storage') return stobj.set_data(cr, self.context.uid,stor, self, data, self.context.context, fil_obj) - def _get_ttag(self,cr): + def _get_ttag(self, cr): return 'file-%d' % self.file_id def move_to(self, cr, ndir_node, new_name=False, fil_obj=None, ndir_obj=None, in_write=False): @@ -1363,7 +1365,7 @@ class node_file(node_class): class node_content(node_class): our_type = 'content' - def __init__(self, path, parent, context, cnt, dctx = None, act_id=None): + def __init__(self, path, parent, context, cnt, dctx=None, act_id=None): super(node_content,self).__init__(path, parent,context) self.cnt_id = cnt.id self.create_date = False @@ -1383,7 +1385,7 @@ class node_content(node_class): self.dctx.update(dctx) self.act_id = act_id - def fill_fields(self, cr, dctx = None): + def fill_fields(self, cr, dctx=None): """ Try to read the object and fill missing fields, like mimetype, dates etc. This function must be different from the constructor, because @@ -1397,7 +1399,7 @@ class node_content(node_class): self.mimetype = str(res[0][0]) - def get_data(self, cr, fil_obj = None): + def get_data(self, cr, fil_obj=None): cntobj = self.context._dirobj.pool.get('document.directory.content') if not self.check_perms(4): raise IOError(errno.EPERM, "Permission denied") @@ -1427,7 +1429,7 @@ class node_content(node_class): return nodefd_content(self, cr, mode, ctx) - def get_data_len(self, cr, fil_obj = None): + def get_data_len(self, cr, fil_obj=None): # FIXME : here, we actually generate the content twice!! # we should have cached the generated content, but it is # not advisable to do keep it in memory, until we have a cache @@ -1436,7 +1438,7 @@ class node_content(node_class): self.get_data(cr,fil_obj) return self.content_length - def set_data(self, cr, data, fil_obj = None): + def set_data(self, cr, data, fil_obj=None): cntobj = self.context._dirobj.pool.get('document.directory.content') if not self.check_perms(2): raise IOError(errno.EPERM, "Permission denied") @@ -1445,7 +1447,7 @@ class node_content(node_class): ctx.update(self.dctx) return cntobj.process_write(cr, self.context.uid, self, data, ctx) - def _get_ttag(self,cr): + def _get_ttag(self, cr): return 'cnt-%d%s' % (self.cnt_id,(self.act_id and ('-' + str(self.act_id))) or '') def get_dav_resourcetype(self, cr): diff --git a/addons/document/odt2txt.py b/addons/document/odt2txt.py old mode 100755 new mode 100644 index 9ca9b6e596f..8a3dc59d9ed --- a/addons/document/odt2txt.py +++ b/addons/document/odt2txt.py @@ -24,11 +24,11 @@ import sys, zipfile, xml.dom.minidom import StringIO class OpenDocumentTextFile : - def __init__ (self, filepath) : + def __init__ (self, filepath): zip = zipfile.ZipFile(filepath) self.content = xml.dom.minidom.parseString(zip.read("content.xml")) - def toString (self) : + def toString (self): """ Converts the document to a string. """ buffer = u"" for val in ["text:p", "text:h", "text:list"]: @@ -36,7 +36,7 @@ class OpenDocumentTextFile : buffer += self.textToString(paragraph) + "\n" return buffer - def textToString(self, element) : + def textToString(self, element): buffer = u"" for node in element.childNodes : if node.nodeType == xml.dom.Node.TEXT_NODE : diff --git a/addons/document/std_index.py b/addons/document/std_index.py index e153d018bf0..eb1da1a86e9 100644 --- a/addons/document/std_index.py +++ b/addons/document/std_index.py @@ -38,7 +38,7 @@ def _to_unicode(s): except UnicodeError: return s -def textToString(element) : +def textToString(element): buffer = u"" for node in element.childNodes : if node.nodeType == xml.dom.Node.TEXT_NODE : @@ -55,7 +55,7 @@ class TxtIndex(indexer): def _getExtensions(self): return ['.txt', '.py'] - def _doIndexContent(self,content): + def _doIndexContent(self, content): return content cntIndex.register(TxtIndex()) @@ -67,7 +67,7 @@ class PptxIndex(indexer): def _getExtensions(self): return ['.pptx'] - def _doIndexFile(self,fname): + def _doIndexFile(self, fname): def toString () : """ Converts the document to a string. """ buffer = u"" @@ -95,7 +95,7 @@ class DocIndex(indexer): def _getExtensions(self): return ['.doc'] - def _doIndexFile(self,fname): + def _doIndexFile(self, fname): try: pop = Popen(['antiword', fname], shell=False, stdout=PIPE) (data, _) = pop.communicate() @@ -115,7 +115,7 @@ class DocxIndex(indexer): def _getExtensions(self): return ['.docx'] - def _doIndexFile(self,fname): + def _doIndexFile(self, fname): zip = zipfile.ZipFile(fname) content = xml.dom.minidom.parseString(zip.read("word/document.xml")) def toString () : @@ -140,7 +140,7 @@ class XlsxIndex(indexer): def _getExtensions(self): return ['.xlsx'] - def _doIndexFile(self,fname): + def _doIndexFile(self, fname): zip = zipfile.ZipFile(fname) content = xml.dom.minidom.parseString(zip.read("xl/sharedStrings.xml")) def toString () : @@ -164,7 +164,7 @@ class PdfIndex(indexer): def _getExtensions(self): return ['.pdf'] - def _doIndexFile(self,fname): + def _doIndexFile(self, fname): pop = Popen(['pdftotext', '-enc', 'UTF-8', '-nopgbrk', fname, '-'], shell=False, stdout=PIPE) (data, _) = pop.communicate() return _to_unicode(data) @@ -180,7 +180,7 @@ class ImageNoIndex(indexer): return [] #return ['.png','.jpg','.gif','.jpeg','.bmp','.tiff'] - def _doIndexContent(self,content): + def _doIndexContent(self, content): return 'image' diff --git a/addons/document_webdav/document_webdav.py b/addons/document_webdav/document_webdav.py index da463c9eb1b..0cc4c919ff2 100644 --- a/addons/document_webdav/document_webdav.py +++ b/addons/document_webdav/document_webdav.py @@ -57,7 +57,7 @@ class document_davdir(osv.osv): # TODO group return - def _locate_child(self, cr, uid, root_id, uri,nparent, ncontext): + def _locate_child(self, cr, uid, root_id, uri, nparent, ncontext): """ try to locate the node in uri, Return a tuple (node_dir, remaining_path) """ diff --git a/addons/document_webdav/redirect.py b/addons/document_webdav/redirect.py index 7bc0883f9e8..7f419fadf52 100644 --- a/addons/document_webdav/redirect.py +++ b/addons/document_webdav/redirect.py @@ -30,7 +30,7 @@ class RedirectHTTPHandler(HttpLogHandler, FixSendError, HttpOptions, HTTPHandler _HTTP_OPTIONS = { 'Allow': ['OPTIONS', 'GET', 'HEAD', 'PROPFIND'] } redirect_paths = {} - def __init__(self,request, client_address, server): + def __init__(self, request, client_address, server): HTTPHandler.__init__(self,request,client_address,server) def send_head(self): diff --git a/addons/document_webdav/test_davclient.py b/addons/document_webdav/test_davclient.py old mode 100755 new mode 100644 index 3c20cfed5b8..306a058c574 --- a/addons/document_webdav/test_davclient.py +++ b/addons/document_webdav/test_davclient.py @@ -682,7 +682,7 @@ class DAVClient(object): assert d2 == d, "Data does not match" return ctype, rrange, d - def gd_put(self, path, body=None, srcpath=None, mime=None, noclobber=False, ): + def gd_put(self, path, body=None, srcpath=None, mime=None, noclobber=False): """ HTTP PUT @param noclobber will prevent overwritting a resource (If-None-Match) @param mime will set the content-type diff --git a/addons/document_webdav/webdav.py b/addons/document_webdav/webdav.py index baa394e94a1..8ad1932a317 100644 --- a/addons/document_webdav/webdav.py +++ b/addons/document_webdav/webdav.py @@ -236,7 +236,7 @@ def mk_prop_response(self, uri, good_props, bad_props, doc): return re -def mk_propname_response(self,uri,propnames,doc): +def mk_propname_response(self, uri, propnames, doc): """ make a new result element for a PROPNAME request This will simply format the propnames list. diff --git a/addons/document_webdav/webdav_server.py b/addons/document_webdav/webdav_server.py index ae75d0b80fc..5218f55b396 100644 --- a/addons/document_webdav/webdav_server.py +++ b/addons/document_webdav/webdav_server.py @@ -81,7 +81,7 @@ class DAVHandler(HttpOptions, FixSendError, DAVRequestHandler): 'DELETE', 'TRACE', 'REPORT', ] } - def get_userinfo(self,user,pw): + def get_userinfo(self, user, pw): return False def _log(self, message): @@ -167,7 +167,7 @@ class DAVHandler(HttpOptions, FixSendError, DAVRequestHandler): self.close_connection = 1 DAVRequestHandler.send_header(self, key, value) - def send_body(self, DATA, code = None, msg = None, desc = None, ctype='application/octet-stream', headers=None): + def send_body(self, DATA, code=None, msg=None, desc=None, ctype='application/octet-stream', headers=None): if headers and 'Connection' in headers: pass elif self.request_version in ('HTTP/1.0', 'HTTP/0.9'): @@ -441,10 +441,10 @@ class dummy_dav_interface(object): def __init__(self, parent): self.parent = parent - def get_propnames(self,uri): + def get_propnames(self, uri): return self.PROPS - def get_prop(self,uri,ns,propname): + def get_prop(self, uri, ns, propname): if self.M_NS.has_key(ns): prefix=self.M_NS[ns] else: @@ -460,10 +460,10 @@ class dummy_dav_interface(object): def get_data(self, uri, range=None): raise DAV_NotFound - def _get_dav_creationdate(self,uri): + def _get_dav_creationdate(self, uri): return time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()) - def _get_dav_getlastmodified(self,uri): + def _get_dav_getlastmodified(self, uri): return time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime()) def _get_dav_displayname(self, uri): diff --git a/addons/email_template/html2text.py b/addons/email_template/html2text.py old mode 100755 new mode 100644 index 745381850e3..9cb3a3fe5ac --- a/addons/email_template/html2text.py +++ b/addons/email_template/html2text.py @@ -158,7 +158,7 @@ class _html2text(sgmllib.SGMLParser): self.abbr_list = {} # stack of abbreviations to write later self.baseurl = baseurl - def outtextf(self, s): + def outtextf(self, s): self.outtext += s def close(self): @@ -338,7 +338,7 @@ class _html2text(sgmllib.SGMLParser): def pbr(self): if self.p_p == 0: self.p_p = 1 - def p(self): self.p_p = 2 + def p(self): def o(self, data, puredata=0, force=0): if self.abbr_data is not None: self.abbr_data += data @@ -411,7 +411,8 @@ class _html2text(sgmllib.SGMLParser): if r'\/script>' in data: self.quiet -= 1 self.o(data, 1) - def unknown_decl(self, data): pass + def unknown_decl(self, data): + pass def wrapwrite(text): sys.stdout.write(text.encode('utf8')) diff --git a/addons/email_template/wizard/mail_compose_message.py b/addons/email_template/wizard/mail_compose_message.py index ef4572429a1..0338c22870c 100644 --- a/addons/email_template/wizard/mail_compose_message.py +++ b/addons/email_template/wizard/mail_compose_message.py @@ -27,7 +27,7 @@ from tools.translate import _ import tools -def _reopen(self,res_id,model): +def _reopen(self, res_id, model): return {'type': 'ir.actions.act_window', 'view_mode': 'form', 'view_type': 'form', diff --git a/addons/event/event.py b/addons/event/event.py index 133d29281f1..a66c73dc909 100644 --- a/addons/event/event.py +++ b/addons/event/event.py @@ -66,7 +66,7 @@ class event_event(osv.osv): res.append((record['id'], name)) return res - def _name_get_fnc(self, cr, uid, ids,prop,unknow, context=None): + def _name_get_fnc(self, cr, uid, ids, prop, unknow, context=None): res = self.name_get(cr, uid, ids, context=context) return dict(res) diff --git a/addons/event/report/__init__.py b/addons/event/report/__init__.py index 1c60e2715df..4f2516e5615 100644 --- a/addons/event/report/__init__.py +++ b/addons/event/report/__init__.py @@ -21,4 +21,4 @@ import report_event_registration -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/event/res_partner.py b/addons/event/res_partner.py index 1d5582f7929..3952f2f82b6 100644 --- a/addons/event/res_partner.py +++ b/addons/event/res_partner.py @@ -32,4 +32,4 @@ class res_partner(osv.osv): res_partner() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/event/wizard/event_confirm.py b/addons/event/wizard/event_confirm.py index e21d523bb12..e001aac9937 100644 --- a/addons/event/wizard/event_confirm.py +++ b/addons/event/wizard/event_confirm.py @@ -34,4 +34,4 @@ class event_confirm(osv.osv_memory): event_confirm() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/event_moodle/event_moodle.py b/addons/event_moodle/event_moodle.py index 59d3e530b44..8ae59ae8faa 100644 --- a/addons/event_moodle/event_moodle.py +++ b/addons/event_moodle/event_moodle.py @@ -125,7 +125,7 @@ class event_moodle(osv.osv): passwd = passwd + '+' return passwd - def check_email(self,email): + def check_email(self, email): """ check if email is correct diff --git a/addons/event_project/event_project.py b/addons/event_project/event_project.py index 8590b84c4ad..34892b56f39 100644 --- a/addons/event_project/event_project.py +++ b/addons/event_project/event_project.py @@ -55,4 +55,4 @@ class event(osv.osv): event() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/event_project/wizard/event_project_retro.py b/addons/event_project/wizard/event_project_retro.py index c7eba5e0ec1..a794749701b 100644 --- a/addons/event_project/wizard/event_project_retro.py +++ b/addons/event_project/wizard/event_project_retro.py @@ -80,4 +80,4 @@ class event_project(osv.osv_memory): event_project() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_attendance/wizard/__init__.py b/addons/hr_attendance/wizard/__init__.py index a414c9a8798..98944cc9fff 100644 --- a/addons/hr_attendance/wizard/__init__.py +++ b/addons/hr_attendance/wizard/__init__.py @@ -24,4 +24,4 @@ import hr_attendance_error import hr_attendance_byweek import hr_attendance_bymonth -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_attendance/wizard/hr_attendance_bymonth.py b/addons/hr_attendance/wizard/hr_attendance_bymonth.py index 40dca536d7d..03e1db5dc3a 100644 --- a/addons/hr_attendance/wizard/hr_attendance_bymonth.py +++ b/addons/hr_attendance/wizard/hr_attendance_bymonth.py @@ -50,4 +50,4 @@ class hr_attendance_bymonth(osv.osv_memory): hr_attendance_bymonth() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_attendance/wizard/hr_attendance_byweek.py b/addons/hr_attendance/wizard/hr_attendance_byweek.py index 139ff94cd5a..9ee69a937d1 100644 --- a/addons/hr_attendance/wizard/hr_attendance_byweek.py +++ b/addons/hr_attendance/wizard/hr_attendance_byweek.py @@ -48,4 +48,4 @@ class hr_attendance_byweek(osv.osv_memory): hr_attendance_byweek() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_attendance/wizard/hr_attendance_error.py b/addons/hr_attendance/wizard/hr_attendance_error.py index bb181268195..a3e3f63aa27 100644 --- a/addons/hr_attendance/wizard/hr_attendance_error.py +++ b/addons/hr_attendance/wizard/hr_attendance_error.py @@ -66,4 +66,4 @@ class hr_attendance_error(osv.osv_memory): hr_attendance_error() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_evaluation/hr_evaluation.py b/addons/hr_evaluation/hr_evaluation.py index 6e1983d7a11..ecca6714cbd 100644 --- a/addons/hr_evaluation/hr_evaluation.py +++ b/addons/hr_evaluation/hr_evaluation.py @@ -244,7 +244,7 @@ class hr_evaluation(osv.osv): raise osv.except_osv(_('Warning !'),_("You cannot change state, because some appraisal in waiting answer or draft state")) return True - def button_done(self,cr, uid, ids, context=None): + def button_done(self, cr, uid, ids, context=None): self.write(cr, uid, ids,{'progress': 1 * 100}, context=context) self.write(cr, uid, ids,{'state':'done', 'date_close': time.strftime('%Y-%m-%d')}, context=context) return True diff --git a/addons/hr_payroll/report/report_contribution_register.py b/addons/hr_payroll/report/report_contribution_register.py index e32e93532b5..c0285f3de50 100644 --- a/addons/hr_payroll/report/report_contribution_register.py +++ b/addons/hr_payroll/report/report_contribution_register.py @@ -72,4 +72,4 @@ class contribution_register_report(report_sxw.rml_parse): report_sxw.report_sxw('report.contribution.register.lines', 'hr.contribution.register', 'hr_payroll/report/report_contribution_register.rml', parser=contribution_register_report) -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_payroll/report/report_payslip.py b/addons/hr_payroll/report/report_payslip.py index e2ef7dab974..df4c729b298 100644 --- a/addons/hr_payroll/report/report_payslip.py +++ b/addons/hr_payroll/report/report_payslip.py @@ -46,4 +46,4 @@ class payslip_report(report_sxw.rml_parse): report_sxw.report_sxw('report.payslip', 'hr.payslip', 'hr_payroll/report/report_payslip.rml', parser=payslip_report) -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_payroll/report/report_payslip_details.py b/addons/hr_payroll/report/report_payslip_details.py index 1e9839eaa6f..5a110cbfdcd 100644 --- a/addons/hr_payroll/report/report_payslip_details.py +++ b/addons/hr_payroll/report/report_payslip_details.py @@ -116,4 +116,4 @@ class payslip_details_report(report_sxw.rml_parse): report_sxw.report_sxw('report.paylip.details', 'hr.payslip', 'hr_payroll/report/report_payslip_details.rml', parser=payslip_details_report) -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_payroll_account/__init__.py b/addons/hr_payroll_account/__init__.py index ffe4b707ac0..ceb8531473b 100644 --- a/addons/hr_payroll_account/__init__.py +++ b/addons/hr_payroll_account/__init__.py @@ -23,4 +23,4 @@ import hr_payroll_account import wizard -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_payroll_account/wizard/__init__.py b/addons/hr_payroll_account/wizard/__init__.py index 27128f05597..ee460faefb8 100644 --- a/addons/hr_payroll_account/wizard/__init__.py +++ b/addons/hr_payroll_account/wizard/__init__.py @@ -22,4 +22,4 @@ import hr_payroll_payslips_by_employees -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_payroll_account/wizard/hr_payroll_payslips_by_employees.py b/addons/hr_payroll_account/wizard/hr_payroll_payslips_by_employees.py index a00ff97ef6b..f608b88fece 100644 --- a/addons/hr_payroll_account/wizard/hr_payroll_payslips_by_employees.py +++ b/addons/hr_payroll_account/wizard/hr_payroll_payslips_by_employees.py @@ -37,4 +37,4 @@ class hr_payslip_employees(osv.osv_memory): hr_payslip_employees() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index 68855b79d7d..e4328589676 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -213,7 +213,7 @@ class hr_applicant(crm.crm_case, osv.osv): } - def onchange_job(self,cr, uid, ids, job, context=None): + def onchange_job(self, cr, uid, ids, job, context=None): result = {} if job: diff --git a/addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py b/addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py index dd1667aecef..0015de25aee 100644 --- a/addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py +++ b/addons/hr_recruitment/wizard/hr_recruitment_create_partner_job.py @@ -29,7 +29,7 @@ class hr_recruitment_partner_create(osv.osv_memory): 'close': fields.boolean('Close job request'), } - def view_init(self, cr , uid , fields_list, context=None): + def view_init(self, cr, uid, fields_list, context=None): case_obj = self.pool.get('hr.applicant') if context is None: context = {} @@ -88,4 +88,4 @@ class hr_recruitment_partner_create(osv.osv_memory): hr_recruitment_partner_create() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_recruitment/wizard/hr_recruitment_employee_hired.py b/addons/hr_recruitment/wizard/hr_recruitment_employee_hired.py index 291c16a7644..0b57082c019 100644 --- a/addons/hr_recruitment/wizard/hr_recruitment_employee_hired.py +++ b/addons/hr_recruitment/wizard/hr_recruitment_employee_hired.py @@ -26,7 +26,7 @@ class hired_employee(osv.osv_memory): _name = 'hired.employee' _description = 'Create Employee' - def case_close(self, cr, uid,ids, context=None): + def case_close(self, cr, uid, ids, context=None): """ @param self: The object pointer @param cr: the current row, from the database cursor, @@ -39,7 +39,7 @@ class hired_employee(osv.osv_memory): self.pool.get('hr.applicant').case_close(cr, uid,context.get('active_ids',[])) return {} - def case_close_with_emp(self, cr, uid,ids, context=None): + def case_close_with_emp(self, cr, uid, ids, context=None): """ @param self: The object pointer @param cr: the current row, from the database cursor, diff --git a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py index 11b7bb771fa..74b4375da6f 100644 --- a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py +++ b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py @@ -77,7 +77,7 @@ class account_analytic_account(osv.osv): _defaults = { 'pricelist_id': lambda self, cr, uid, ctx: ctx.get('pricelist_id', False), } - def on_change_partner_id(self, cr, uid, id, partner_id, context={}): + def on_change_partner_id(self, cr, uid, id, partner_id, context=None): res = super(account_analytic_account, self).on_change_partner_id(cr, uid, id, partner_id, context) if (not res.get('value', False)) or not partner_id: return res diff --git a/addons/hr_timesheet_invoice/report/account_analytic_profit.py b/addons/hr_timesheet_invoice/report/account_analytic_profit.py index 8b6cd7f9fbd..fc44089bf9e 100644 --- a/addons/hr_timesheet_invoice/report/account_analytic_profit.py +++ b/addons/hr_timesheet_invoice/report/account_analytic_profit.py @@ -120,4 +120,4 @@ class account_analytic_profit(report_sxw.rml_parse): report_sxw.report_sxw('report.account.analytic.profit', 'account.analytic.line', 'addons/hr_timesheet_invoice/report/account_analytic_profit.rml', parser=account_analytic_profit) -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py index 134bde8a872..b5b31b7b74c 100644 --- a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py +++ b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py @@ -38,7 +38,7 @@ class account_analytic_line(osv.osv): # 'price': boolean # 'product': many2one id # } - def invoice_cost_create(self, cr, uid, ids, data={}, context=None): + def invoice_cost_create(self, cr, uid, ids, data=None, context=None): analytic_account_obj = self.pool.get('account.analytic.account') res_partner_obj = self.pool.get('res.partner') account_payment_term_obj = self.pool.get('account.payment.term') diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py index f18adbadbf8..fc4133dec87 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py @@ -374,7 +374,7 @@ class hr_timesheet_sheet(osv.osv): 'department_id':fields.many2one('hr.department','Department'), } - def _default_date_from(self,cr, uid, context=None): + def _default_date_from(self, cr, uid, context=None): user = self.pool.get('res.users').browse(cr, uid, uid, context=context) r = user.company_id and user.company_id.timesheet_range or 'month' if r=='month': @@ -385,7 +385,7 @@ class hr_timesheet_sheet(osv.osv): return time.strftime('%Y-01-01') return time.strftime('%Y-%m-%d') - def _default_date_to(self,cr, uid, context=None): + def _default_date_to(self, cr, uid, context=None): user = self.pool.get('res.users').browse(cr, uid, uid, context=context) r = user.company_id and user.company_id.timesheet_range or 'month' if r=='month': diff --git a/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py b/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py index 5a8fa2c59b3..69e38f90fc5 100644 --- a/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py +++ b/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py @@ -61,4 +61,4 @@ class hr_timesheet_current_open(osv.osv_memory): hr_timesheet_current_open() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/idea/idea.py b/addons/idea/idea.py index 57b7c84351c..3c9b70c1a8d 100644 --- a/addons/idea/idea.py +++ b/addons/idea/idea.py @@ -234,7 +234,7 @@ class idea_idea(osv.osv): res_id = super(idea_idea, self).create(cr, user, vals, context=context) return res_id - def copy(self, cr, uid, id, default={}, context=None): + def copy(self, cr, uid, id, default=None, context=None): """ Create the new record in idea_idea model from existing one @param cr: A database cursor diff --git a/addons/import_base/import_framework.py b/addons/import_base/import_framework.py index 44243aa952c..c4038b6c582 100644 --- a/addons/import_base/import_framework.py +++ b/addons/import_base/import_framework.py @@ -228,7 +228,7 @@ class import_framework(Thread): return map - def _fields_mapp(self,dict_sugar, openerp_dict, table): + def _fields_mapp(self, dict_sugar, openerp_dict, table): """ call all the mapper and transform data to be compatible with import_data diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py index d6e43866bf2..af5ea6d9b62 100644 --- a/addons/import_sugarcrm/import_sugarcrm.py +++ b/addons/import_sugarcrm/import_sugarcrm.py @@ -253,7 +253,7 @@ class sugar_import(import_framework): val['datas_fname'] = Filename return val - def get_history_mapping(self): + def get_history_mapping(self): return { 'model' : 'ir.attachment', 'dependencies' : [self.TABLE_USER, self.TABLE_ACCOUNT, self.TABLE_CONTACT, self.TABLE_LEAD, self.TABLE_OPPORTUNITY, self.TABLE_MEETING, self.TABLE_CALL, self.TABLE_EMAIL], @@ -301,7 +301,7 @@ class sugar_import(import_framework): val['email_from'] = partner_email return val - def get_crm_claim_mapping(self): + def get_crm_claim_mapping(self): return { 'model' : 'crm.claim', 'dependencies' : [self.TABLE_USER, self.TABLE_ACCOUNT, self.TABLE_CONTACT, self.TABLE_LEAD], @@ -604,7 +604,7 @@ class sugar_import(import_framework): partner_contact_email = address.email return partner_contact_id, partner_contact_email - def import_opp(self, val): + def import_opp(self, val): partner_contact_id, partner_contact_email = self.import_opportunity_contact(val) val['partner_address_id/id'] = partner_contact_id val['email_from'] = partner_contact_email diff --git a/addons/l10n_be/__init__.py b/addons/l10n_be/__init__.py index 1b2677d295e..0aeeb2be23b 100644 --- a/addons/l10n_be/__init__.py +++ b/addons/l10n_be/__init__.py @@ -22,4 +22,4 @@ import company import wizard -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/l10n_be_invoice_bba/invoice.py b/addons/l10n_be_invoice_bba/invoice.py index 997036c0cec..da2545669ad 100644 --- a/addons/l10n_be_invoice_bba/invoice.py +++ b/addons/l10n_be_invoice_bba/invoice.py @@ -35,7 +35,7 @@ account.invoice object: class account_invoice(osv.osv): _inherit = 'account.invoice' - def _get_reference_type(self, cursor, user, context=None): + def _get_reference_type(self, cursor, user, context=None): """Add BBA Structured Communication Type and change labels from 'reference' into 'communication' """ res = super(account_invoice, self)._get_reference_type(cursor, user, context=context) @@ -44,7 +44,7 @@ class account_invoice(osv.osv): #logger.notifyChannel('addons.'+self._name, netsvc.LOG_WARNING, 'reference_type = %s' %res ) return res - def check_bbacomm(self, val): + def check_bbacomm(self, val): supported_chars = '0-9+*/ ' pattern = re.compile('[^' + supported_chars + ']') if pattern.findall(val or ''): @@ -57,7 +57,7 @@ class account_invoice(osv.osv): return True return False - def _check_communication(self, cr, uid, ids): + def _check_communication(self, cr, uid, ids): for inv in self.browse(cr, uid, ids): if inv.reference_type == 'bba': return self.check_bbacomm(inv.reference) @@ -86,7 +86,7 @@ class account_invoice(osv.osv): result['value'].update(res_update) return result - def generate_bbacomm(self, cr, uid, ids, type, reference_type, algorithm, partner_id, reference): + def generate_bbacomm(self, cr, uid, ids, type, reference_type, algorithm, partner_id, reference): partner_obj = self.pool.get('res.partner') reference = reference or '' if (type == 'out_invoice'): @@ -157,7 +157,7 @@ class account_invoice(osv.osv): "\nPlease contact your OpenERP support channel.") % algorithm) return {'value': {'reference': reference}} - def create(self, cr, uid, vals, context=None): + def create(self, cr, uid, vals, context=None): if vals.has_key('reference_type'): reference_type = vals['reference_type'] if reference_type == 'bba': @@ -179,7 +179,7 @@ class account_invoice(osv.osv): '\nPlease create manually a unique BBA Structured Communication.')) return super(account_invoice, self).create(cr, uid, vals, context=context) - def write(self, cr, uid, ids, vals, context={}): + def write(self, cr, uid, ids, vals, context=None): if isinstance(ids, (int, long)): ids = [ids] for inv in self.browse(cr, uid, ids, context): diff --git a/addons/l10n_br/l10n_br.py b/addons/l10n_br/l10n_br.py index af387334cd1..f35ced7ea09 100644 --- a/addons/l10n_br/l10n_br.py +++ b/addons/l10n_br/l10n_br.py @@ -81,4 +81,4 @@ class l10n_br_account_cst(osv.osv): l10n_br_account_cst() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/l10n_ch/partner.py b/addons/l10n_ch/partner.py index 9301c564227..aba9ea7b204 100644 --- a/addons/l10n_ch/partner.py +++ b/addons/l10n_ch/partner.py @@ -30,4 +30,4 @@ class res_partner(osv.osv): } res_partner() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/l10n_ch/payment.py b/addons/l10n_ch/payment.py index aba757502b0..a681daf569d 100644 --- a/addons/l10n_ch/payment.py +++ b/addons/l10n_ch/payment.py @@ -24,7 +24,7 @@ from osv import osv class payment_order(osv.osv): _inherit = 'payment.order' - def get_wizard(self,mode): + def get_wizard(self, mode): if mode == 'dta': return 'l10n_ch', 'action_dta_create' diff --git a/addons/l10n_ch/report/report_webkit_html.py b/addons/l10n_ch/report/report_webkit_html.py index d930258f4a7..7f6bc739e6b 100644 --- a/addons/l10n_ch/report/report_webkit_html.py +++ b/addons/l10n_ch/report/report_webkit_html.py @@ -67,7 +67,7 @@ class l10n_ch_report_webkit_html(report_sxw.rml_parse): self._check(ids) return super(l10n_ch_report_webkit_html, self).set_context(objects, data, ids, report_type=report_type) - def police_absolute_path(self, inner_path) : + def police_absolute_path(self, inner_path): """Will get the ocrb police absolute path""" path = addons.get_module_resource(os.path.join('l10n_ch', 'report', inner_path)) return path diff --git a/addons/l10n_ch/wizard/create_dta.py b/addons/l10n_ch/wizard/create_dta.py index e9b0585d4c8..a94ac70afde 100644 --- a/addons/l10n_ch/wizard/create_dta.py +++ b/addons/l10n_ch/wizard/create_dta.py @@ -41,7 +41,7 @@ TRANS=[ (u'ä','a'), ] -def _u2a(text) : +def _u2a(text): """Tries to convert unicode charactere to asci equivalence""" if not text : return "" txt = "" diff --git a/addons/l10n_fr/l10n_fr.py b/addons/l10n_fr/l10n_fr.py index 573f4f7519e..8cf237d03f0 100644 --- a/addons/l10n_fr/l10n_fr.py +++ b/addons/l10n_fr/l10n_fr.py @@ -51,4 +51,4 @@ class l10n_fr_line(osv.osv): l10n_fr_line() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/l10n_fr/report/base_report.py b/addons/l10n_fr/report/base_report.py index 2c44b062f45..c93d5308901 100644 --- a/addons/l10n_fr/report/base_report.py +++ b/addons/l10n_fr/report/base_report.py @@ -117,4 +117,4 @@ class base_report(report_sxw.rml_parse): break self._set_variable(code, sum) -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/l10n_fr/wizard/fr_report_bilan.py b/addons/l10n_fr/wizard/fr_report_bilan.py index cec2e513a6a..1ed2389671d 100644 --- a/addons/l10n_fr/wizard/fr_report_bilan.py +++ b/addons/l10n_fr/wizard/fr_report_bilan.py @@ -54,4 +54,4 @@ class account_bilan_report(osv.osv_memory): account_bilan_report() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/l10n_fr/wizard/fr_report_compute_resultant.py b/addons/l10n_fr/wizard/fr_report_compute_resultant.py index d90466ea6c4..b29789bdd04 100644 --- a/addons/l10n_fr/wizard/fr_report_compute_resultant.py +++ b/addons/l10n_fr/wizard/fr_report_compute_resultant.py @@ -54,4 +54,4 @@ class account_cdr_report(osv.osv_memory): account_cdr_report() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/l10n_lu/wizard/pdf_ext.py b/addons/l10n_lu/wizard/pdf_ext.py index 3b58fab5b68..e90cf0527d2 100644 --- a/addons/l10n_lu/wizard/pdf_ext.py +++ b/addons/l10n_lu/wizard/pdf_ext.py @@ -57,7 +57,7 @@ trailer %%EOF """ -def output_field( f ): +def output_field(f): return "\xfe\xff" + "".join( [ "\x00"+c for c in f ] ) def extract_keys(lines): diff --git a/addons/lunch/report/order.py b/addons/lunch/report/order.py index 11ca7f79dbc..b1745f7d5f5 100644 --- a/addons/lunch/report/order.py +++ b/addons/lunch/report/order.py @@ -26,14 +26,14 @@ from osv import osv class order(report_sxw.rml_parse): - def get_lines(self, user,objects): + def get_lines(self, user, objects): lines=[] for obj in objects: if user.id==obj.user_id.id: lines.append(obj) return lines - def get_total(self, user,objects): + def get_total(self, user, objects): lines=[] for obj in objects: if user.id==obj.user_id.id: diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 70b536296bf..cbd165a772d 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -134,7 +134,7 @@ class mail_thread(osv.osv): self.message_append_dict(cr, uid, [res_id], msg_dict, context=context) return res_id - def message_update(self, cr, uid, ids, msg_dict, vals={}, default_act=None, context=None): + def message_update(self, cr, uid, ids, msg_dict, vals=None, default_act=None, context=None): """Called by ``message_process`` when a new message is received for an existing thread. The default behavior is to create a new mail.message in the given thread (by calling diff --git a/addons/mail/static/scripts/openerp_mailgate.py b/addons/mail/static/scripts/openerp_mailgate.py old mode 100755 new mode 100644 diff --git a/addons/membership/report/__init__.py b/addons/membership/report/__init__.py index 05c893ae400..84dc92c63f0 100644 --- a/addons/membership/report/__init__.py +++ b/addons/membership/report/__init__.py @@ -20,4 +20,4 @@ ############################################################################## import report_membership -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/membership/report/report_membership.py b/addons/membership/report/report_membership.py index 631acab46b1..ef7b790aeca 100644 --- a/addons/membership/report/report_membership.py +++ b/addons/membership/report/report_membership.py @@ -141,4 +141,4 @@ class report_membership(osv.osv): report_membership() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/membership/wizard/__init__.py b/addons/membership/wizard/__init__.py index 7ad7cc32008..a15a0a7329f 100644 --- a/addons/membership/wizard/__init__.py +++ b/addons/membership/wizard/__init__.py @@ -20,4 +20,4 @@ ############################################################################## import membership_invoice -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index 8a25af01e7b..a6f58833df0 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -271,13 +271,15 @@ class mrp_bom(osv.osv): return {'value': {'name': prod.name, 'product_uom': prod.uom_id.id}} return {} - def _bom_find(self, cr, uid, product_id, product_uom, properties=[]): + def _bom_find(self, cr, uid, product_id, product_uom, properties=None): """ Finds BoM for particular product and product uom. @param product_id: Selected product. @param product_uom: Unit of measure of a product. @param properties: List of related properties. @return: False or BoM id. """ + if properties is None: + properties = [] cr.execute('select id from mrp_bom where product_id=%s and bom_id is null order by sequence', (product_id,)) ids = map(lambda x: x[0], cr.fetchall()) max_prop = 0 @@ -292,7 +294,7 @@ class mrp_bom(osv.osv): max_prop = prop return result - def _bom_explode(self, cr, uid, bom, factor, properties=[], addthis=False, level=0, routing_id=False): + def _bom_explode(self, cr, uid, bom, factor, properties=None, addthis=False, level=0, routing_id=False): """ Finds Products and Work Centers for related BoM for manufacturing order. @param bom: BoM of particular product. @param factor: Factor of product UoM. @@ -577,7 +579,7 @@ class mrp_production(osv.osv): self.write(cr, uid, ids, {'state': 'picking_except'}) return True - def action_compute(self, cr, uid, ids, properties=[], context=None): + def action_compute(self, cr, uid, ids, properties=None, context=None): """ Computes bills of material of a product. @param properties: List containing dictionaries of properties. @return: No. of products. diff --git a/addons/mrp/procurement.py b/addons/mrp/procurement.py index 4086a401f56..6e523f7592b 100644 --- a/addons/mrp/procurement.py +++ b/addons/mrp/procurement.py @@ -33,7 +33,7 @@ class procurement_order(osv.osv): 'property_ids': fields.many2many('mrp.property', 'procurement_property_rel', 'procurement_id','property_id', 'Properties'), } - def check_produce_product(self, cr, uid, procurement, context=[]): + def check_produce_product(self, cr, uid, procurement, context=None): """ Finds the bill of material for the product from procurement order. @return: True or False """ diff --git a/addons/mrp/report/bom_structure.py b/addons/mrp/report/bom_structure.py index a5b43c19f01..458a0c19649 100644 --- a/addons/mrp/report/bom_structure.py +++ b/addons/mrp/report/bom_structure.py @@ -35,7 +35,7 @@ class bom_structure(report_sxw.rml_parse): def get_children(self, object, level=0): result = [] - def _get_rec(object,level): + def _get_rec(object, level): for l in object: res = {} res['name'] = l.name @@ -61,4 +61,4 @@ class bom_structure(report_sxw.rml_parse): report_sxw.report_sxw('report.bom.structure','mrp.bom','mrp/report/bom_structure.rml',parser=bom_structure,header='internal') -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/mrp/stock.py b/addons/mrp/stock.py index d5ddc7f0280..fdfe09f35b4 100644 --- a/addons/mrp/stock.py +++ b/addons/mrp/stock.py @@ -102,7 +102,7 @@ class StockMove(osv.osv): wf_service.trg_validate(uid, 'procurement.order', m, 'button_wait_done', cr) return processed_ids - def action_consume(self, cr, uid, ids, product_qty, location_id=False, context=None): + def action_consume(self, cr, uid, ids, product_qty, location_id=False, context=None): """ Consumed product with specific quatity from specific source location. @param product_qty: Consumed product quantity @param location_id: Source location diff --git a/addons/mrp_operations/mrp_operations.py b/addons/mrp_operations/mrp_operations.py index fbf307e860e..28610d89a5b 100644 --- a/addons/mrp_operations/mrp_operations.py +++ b/addons/mrp_operations/mrp_operations.py @@ -372,7 +372,7 @@ class mrp_production(osv.osv): pass return result - def action_compute(self, cr, uid, ids, properties=[], context=None): + def action_compute(self, cr, uid, ids, properties=None, context=None): """ Computes bills of material of a product and planned date of work order. @param properties: List containing dictionaries of properties. @return: No. of products. diff --git a/addons/plugin/plugin_handler.py b/addons/plugin/plugin_handler.py index ef990170e64..3c81edae2fa 100644 --- a/addons/plugin/plugin_handler.py +++ b/addons/plugin/plugin_handler.py @@ -132,7 +132,7 @@ class plugin_handler(osv.osv_memory): return ('res.partner', partner_id, url) # Specific to outlook rfc822 is not available so we split in arguments headerd,body,attachemnts - def push_message_outlook(self, cr, uid, model, headers,res_id=0 ,body_text=False, body_html=False, attachments=False): + def push_message_outlook(self, cr, uid, model, headers, res_id=0 , body_text=False, body_html=False, attachments=False): # ---------------------------------------- # solution 1 # construct a fake rfc822 from the separated arguement diff --git a/addons/point_of_sale/report/account_statement.py b/addons/point_of_sale/report/account_statement.py index be5d4b3a330..c1fc73a35d7 100644 --- a/addons/point_of_sale/report/account_statement.py +++ b/addons/point_of_sale/report/account_statement.py @@ -48,4 +48,4 @@ class account_statement(report_sxw.rml_parse): report_sxw.report_sxw('report.account.statement', 'account.bank.statement', 'addons/statement/report/account_statement.rml', parser=account_statement,header='internal') -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/report/all_closed_cashbox_of_the_day.py b/addons/point_of_sale/report/all_closed_cashbox_of_the_day.py index 4f342099a59..0e75e7f7ae1 100644 --- a/addons/point_of_sale/report/all_closed_cashbox_of_the_day.py +++ b/addons/point_of_sale/report/all_closed_cashbox_of_the_day.py @@ -38,13 +38,13 @@ class all_closed_cashbox_of_the_day(report_sxw.rml_parse): 'get_net_total_starting':self._get_net_total_starting, }) - def _get_user(self,line_ids): + def _get_user(self, line_ids): sql = "select name from res_users where id = %d"%(line_ids['create_uid']) self.cr.execute(sql) user = self.cr.fetchone() return user[0] - def _get_data(self,user): + def _get_data(self, user): data = {} sql = """ SELECT abs.journal_id,abs.id,abs.date,abs.closing_date,abs.name as statement,aj.name as journal,ap.name as period,ru.name as user,rc.name as company, abs.state,abs.balance_end_real FROM account_bank_statement as abs @@ -57,7 +57,7 @@ class all_closed_cashbox_of_the_day(report_sxw.rml_parse): data = self.cr.dictfetchall() return data - def _get_lines(self,statement): + def _get_lines(self, statement): data = {} sql = """ select absl.* from account_bank_statement_line as absl, account_bank_statement as abs where absl.statement_id = abs.id and abs.id = %d"""%(statement['id']) @@ -65,7 +65,7 @@ class all_closed_cashbox_of_the_day(report_sxw.rml_parse): data = self.cr.dictfetchall() return data - def _get_bal(self,data): + def _get_bal(self, data): res = {} sql =""" select sum(pieces*number) as bal from account_cashbox_line where starting_id = %d """%(data['id']) self.cr.execute(sql) @@ -75,7 +75,7 @@ class all_closed_cashbox_of_the_day(report_sxw.rml_parse): else: return False - def _get_sub_total(self,user,data,date): + def _get_sub_total(self, user, data, date): res={} self.cr.execute(""" select sum(absl.amount) from account_bank_statement as abs LEFT JOIN account_bank_statement_line as absl ON abs.id = absl.statement_id @@ -90,7 +90,7 @@ class all_closed_cashbox_of_the_day(report_sxw.rml_parse): else: return False - def _get_partner(self,statement): + def _get_partner(self, statement): res = {} if statement['pos_statement_id']: sql =""" select rp.name from account_bank_statement_line as absl,res_partner as rp @@ -102,7 +102,7 @@ class all_closed_cashbox_of_the_day(report_sxw.rml_parse): else: return 0.00 - def _get_net_total_starting(self,user): + def _get_net_total_starting(self, user): lst = [] res={} total_ending_bal = 0.0 @@ -124,7 +124,7 @@ class all_closed_cashbox_of_the_day(report_sxw.rml_parse): lst.append(total_starting_bal) return lst - def _get_net_total(self,user): + def _get_net_total(self, user): res={} sql = """select sum(absl.amount) as net_total from account_bank_statement as abs LEFT JOIN account_bank_statement_line as absl ON abs.id = absl.statement_id @@ -137,4 +137,4 @@ class all_closed_cashbox_of_the_day(report_sxw.rml_parse): report_sxw.report_sxw('report.all.closed.cashbox.of.the.day', 'account.bank.statement', 'addons/point_of_sale/report/all_closed_cashbox_of_the_day.rml', parser=all_closed_cashbox_of_the_day,header='internal') -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/report/pos_details.py b/addons/point_of_sale/report/pos_details.py index d13c127165e..f8565a8776a 100644 --- a/addons/point_of_sale/report/pos_details.py +++ b/addons/point_of_sale/report/pos_details.py @@ -24,7 +24,7 @@ from report import report_sxw class pos_details(report_sxw.rml_parse): - def _get_invoice(self,inv_id): + def _get_invoice(self, inv_id): res={} if inv_id: self.cr.execute("select number from account_invoice as ac where id = %s", (inv_id,)) @@ -37,7 +37,7 @@ class pos_details(report_sxw.rml_parse): user_obj = self.pool.get('res.users') return user_obj.search(self.cr, self.uid, []) - def _pos_sales_details(self,form): + def _pos_sales_details(self, form): pos_obj = self.pool.get('pos.order') user_obj = self.pool.get('res.users') data = [] @@ -74,7 +74,7 @@ class pos_details(report_sxw.rml_parse): def _get_sales_total_2(self): return self.total - def _get_sum_invoice_2(self,form): + def _get_sum_invoice_2(self, form): pos_obj = self.pool.get('pos.order') user_obj = self.pool.get('res.users') user_ids = form['user_ids'] or self._get_all_users() diff --git a/addons/point_of_sale/report/pos_details_summary.py b/addons/point_of_sale/report/pos_details_summary.py index 2801dcf43f3..c811d6543ba 100644 --- a/addons/point_of_sale/report/pos_details_summary.py +++ b/addons/point_of_sale/report/pos_details_summary.py @@ -42,7 +42,7 @@ class pos_details_summary(report_sxw.rml_parse): 'getcompany':self.get_company }) - def get_company(self,objects): + def get_company(self, objects): comp=[obj.company_id.name for obj in objects] return '%s' % (comp[0]) @@ -136,4 +136,4 @@ report_sxw.report_sxw('report.pos.details_summary', parser=pos_details_summary, header='internal') -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/report/pos_lines.py b/addons/point_of_sale/report/pos_lines.py index 66b52d6ce01..6c48d9e9733 100644 --- a/addons/point_of_sale/report/pos_lines.py +++ b/addons/point_of_sale/report/pos_lines.py @@ -41,7 +41,7 @@ class pos_lines(report_sxw.rml_parse): self.total = tot return self.total - def __taxes__(self,obj): + def __taxes__(self, obj): self.cr.execute ( " Select acct.name from pos_order as po " \ " LEFT JOIN pos_order_line as pol ON po.id = pol.order_id " \ " LEFT JOIN product_taxes_rel as ptr ON pol.product_id = ptr.prod_id " \ @@ -52,4 +52,4 @@ class pos_lines(report_sxw.rml_parse): report_sxw.report_sxw('report.pos.lines', 'pos.order', 'addons/point_of_sale/report/pos_lines.rml', parser=pos_lines,header='internal') -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/report/pos_payment_report.py b/addons/point_of_sale/report/pos_payment_report.py index beadd2d5cb6..1fed98a4852 100644 --- a/addons/point_of_sale/report/pos_payment_report.py +++ b/addons/point_of_sale/report/pos_payment_report.py @@ -33,7 +33,7 @@ class pos_payment_report(report_sxw.rml_parse): 'pos_payment_total':self._pos_payment_total, }) - def _pos_payment(self,obj): + def _pos_payment(self, obj): data={} sql = """ select id from pos_order where id = %d"""%(obj.id) self.cr.execute(sql) @@ -56,9 +56,9 @@ class pos_payment_report(report_sxw.rml_parse): self.total += d['price_unit'] * d['qty'] return data - def _pos_payment_total(self,o): + def _pos_payment_total(self, o): return self.total report_sxw.report_sxw('report.pos.payment.report', 'pos.order', 'addons/point_of_sale/report/pos_payment_report.rml', parser=pos_payment_report,header='internal') -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/report/pos_payment_report_user.py b/addons/point_of_sale/report/pos_payment_report_user.py index c90387e4f7a..b347c86da2a 100644 --- a/addons/point_of_sale/report/pos_payment_report_user.py +++ b/addons/point_of_sale/report/pos_payment_report_user.py @@ -33,7 +33,7 @@ class pos_payment_report_user(report_sxw.rml_parse): 'pos_payment_user_total':self.__pos_payment_user__total__, }) - def __pos_payment_user__(self,form): + def __pos_payment_user__(self, form): data={} ids = form['user_id'] sql = "select pt.name,pp.default_code as code,pol.qty,pu.name as uom,pol.discount,pol.price_unit, " \ @@ -61,4 +61,4 @@ class pos_payment_report_user(report_sxw.rml_parse): report_sxw.report_sxw('report.pos.payment.report.user', 'pos.order', 'addons/point_of_sale/report/pos_payment_report_user.rml', parser=pos_payment_report_user,header='internal') -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/report/pos_receipt.py b/addons/point_of_sale/report/pos_receipt.py index 721f4bc86e2..966bdd42259 100644 --- a/addons/point_of_sale/report/pos_receipt.py +++ b/addons/point_of_sale/report/pos_receipt.py @@ -74,4 +74,4 @@ class order(report_sxw.rml_parse): report_sxw.report_sxw('report.pos.receipt', 'pos.order', 'addons/point_of_sale/report/pos_receipt.rml', parser=order, header=False) -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/report/pos_sales_user.py b/addons/point_of_sale/report/pos_sales_user.py index e49528441b9..f40b9f1c630 100644 --- a/addons/point_of_sale/report/pos_sales_user.py +++ b/addons/point_of_sale/report/pos_sales_user.py @@ -33,7 +33,7 @@ class pos_sales_user(report_sxw.rml_parse): }) - def _get_data(self,form): + def _get_data(self, form): dt1 = form['date_start'] + ' 00:00:00' dt2 = form['date_end'] + ' 23:59:59' data={} @@ -47,4 +47,4 @@ class pos_sales_user(report_sxw.rml_parse): report_sxw.report_sxw('report.pos.sales.user', 'pos.order', 'addons/point_of_sale/report/pos_sales_user.rml', parser=pos_sales_user,header='internal') -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/report/pos_sales_user_today.py b/addons/point_of_sale/report/pos_sales_user_today.py index 9696d036959..35bc61efea8 100644 --- a/addons/point_of_sale/report/pos_sales_user_today.py +++ b/addons/point_of_sale/report/pos_sales_user_today.py @@ -33,7 +33,7 @@ class pos_sales_user_today(report_sxw.rml_parse): }) - def _get_data(self,form): + def _get_data(self, form): data={} ids = form['user_id'] @@ -47,4 +47,4 @@ class pos_sales_user_today(report_sxw.rml_parse): report_sxw.report_sxw('report.pos.sales.user.today', 'pos.order', 'addons/point_of_sale/report/pos_sales_user_today.rml', parser=pos_sales_user_today,header='internal') -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/report/pos_users_product.py b/addons/point_of_sale/report/pos_users_product.py index 87cf306990a..032a25043e8 100644 --- a/addons/point_of_sale/report/pos_users_product.py +++ b/addons/point_of_sale/report/pos_users_product.py @@ -60,9 +60,9 @@ class pos_user_product(report_sxw.rml_parse): data = self.cr.fetchone() return data[0] - def _get_total(self,o): + def _get_total(self, o): return self.total report_sxw.report_sxw('report.pos.user.product', 'account.bank.statement', 'addons/statement/report/pos_users_product.rml', parser=pos_user_product,header='internal') -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/report/report_cash_register.py b/addons/point_of_sale/report/report_cash_register.py index c86c40bb32f..ff3823a4386 100644 --- a/addons/point_of_sale/report/report_cash_register.py +++ b/addons/point_of_sale/report/report_cash_register.py @@ -65,4 +65,4 @@ class report_cash_register(osv.osv): report_cash_register() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/procurement/company.py b/addons/procurement/company.py index d544181a6e8..23a0214f1c6 100644 --- a/addons/procurement/company.py +++ b/addons/procurement/company.py @@ -35,4 +35,4 @@ class company(osv.osv): company() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/product/product.py b/addons/product/product.py index 0d5fa31ac11..42f587a91a4 100644 --- a/addons/product/product.py +++ b/addons/product/product.py @@ -349,7 +349,7 @@ class product_template(osv.osv): res = False return res - def onchange_uom(self, cursor, user, ids, uom_id,uom_po_id): + def onchange_uom(self, cursor, user, ids, uom_id, uom_po_id): if uom_id: return {'value': {'uom_po_id': uom_id}} return {} @@ -540,7 +540,7 @@ class product_product(osv.osv): self.pool.get('product.template').unlink(cr, uid, unlink_product_tmpl_ids, context=context) return super(product_product, self).unlink(cr, uid, unlink_ids, context=context) - def onchange_uom(self, cursor, user, ids, uom_id,uom_po_id): + def onchange_uom(self, cursor, user, ids, uom_id, uom_po_id): if uom_id and uom_po_id: uom_obj=self.pool.get('product.uom') uom=uom_obj.browse(cursor,user,[uom_id])[0] diff --git a/addons/product/report/product_pricelist.py b/addons/product/report/product_pricelist.py index 7e9748c2523..f2b5a57f472 100644 --- a/addons/product/report/product_pricelist.py +++ b/addons/product/report/product_pricelist.py @@ -39,7 +39,7 @@ class product_pricelist(report_sxw.rml_parse): 'get_titles': self._get_titles, }) - def _get_titles(self,form): + def _get_titles(self, form): lst = [] vals = {} qtys = 1 @@ -51,7 +51,7 @@ class product_pricelist(report_sxw.rml_parse): lst.append(vals) return lst - def _set_quantity(self,form): + def _set_quantity(self, form): for i in range(1,6): q = 'qty%d'%i if form[q] >0 and form[q] not in self.quantity: @@ -76,7 +76,7 @@ class product_pricelist(report_sxw.rml_parse): symbol = pool.get('res.currency').read(self.cr, self.uid, [pricelist['currency_id'][0]], ['symbol'], context=self.localcontext)[0] return symbol['symbol'] or '' - def _get_categories(self, products,form): + def _get_categories(self, products, form): cat_ids=[] res=[] self.pricelist = form['price_list'] @@ -111,7 +111,7 @@ class product_pricelist(report_sxw.rml_parse): res.append({'name':cat[1],'products': products}) return res - def _get_price(self,pricelist_id, product_id,qty): + def _get_price(self, pricelist_id, product_id, qty): sale_price_digits = self.get_digits(dp='Sale Price') pool = pooler.get_pool(self.cr.dbname) price_dict = pool.get('product.pricelist').price_get(self.cr, self.uid, [pricelist_id], product_id, qty, context=self.localcontext) diff --git a/addons/product_manufacturer/product_manufacturer.py b/addons/product_manufacturer/product_manufacturer.py index 93f4a6f1a8e..1aeff8d4f78 100644 --- a/addons/product_manufacturer/product_manufacturer.py +++ b/addons/product_manufacturer/product_manufacturer.py @@ -40,4 +40,4 @@ class product_attribute(osv.osv): } product_attribute() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/product_visible_discount/__init__.py b/addons/product_visible_discount/__init__.py index 4abaf54aa85..b1dda0c009e 100644 --- a/addons/product_visible_discount/__init__.py +++ b/addons/product_visible_discount/__init__.py @@ -20,4 +20,4 @@ import product_visible_discount -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project/project.py b/addons/project/project.py index 9966ad02ee8..bdc5338b802 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -265,7 +265,7 @@ class project(osv.osv): task_obj.duplicate_task(cr, uid, map_task_id, context=context) return True - def copy(self, cr, uid, id, default={}, context=None): + def copy(self, cr, uid, id, default=None, context=None): if context is None: context = {} @@ -545,12 +545,12 @@ class task(osv.osv): return res - def onchange_remaining(self, cr, uid, ids, remaining=0.0, planned = 0.0): + def onchange_remaining(self, cr, uid, ids, remaining=0.0, planned=0.0): if remaining and not planned: return {'value':{'planned_hours': remaining}} return {} - def onchange_planned(self, cr, uid, ids, planned = 0.0, effective = 0.0): + def onchange_planned(self, cr, uid, ids, planned=0.0, effective=0.0): return {'value':{'remaining_hours': planned - effective}} def onchange_project(self, cr, uid, id, project_id): @@ -581,7 +581,9 @@ class task(osv.osv): #FIXME why there is already the copy and the old one self.write(cr, uid, new, {'parent_ids':[(6,0,set(parent_ids))], 'child_ids':[(6,0, set(child_ids))]}) - def copy_data(self, cr, uid, id, default={}, context=None): + def copy_data(self, cr, uid, id, default=None, context=None): + if default is None: + default = {} default = default or {} default.update({'work_ids':[], 'date_start': False, 'date_end': False, 'date_deadline': False}) if not default.get('remaining_hours', False): @@ -810,7 +812,7 @@ class task(osv.osv): } return res - def do_close(self, cr, uid, ids, context={}): + def do_close(self, cr, uid, ids, context=None): """ Close Task """ @@ -868,7 +870,7 @@ class task(osv.osv): self.write(cr, uid, [task.id], {'state': 'open'}, context=context) return True - def do_cancel(self, cr, uid, ids, context={}): + def do_cancel(self, cr, uid, ids, context=None): request = self.pool.get('res.request') tasks = self.browse(cr, uid, ids, context=context) self._check_child_task(cr, uid, ids, context=context) @@ -889,7 +891,7 @@ class task(osv.osv): self.write(cr, uid, [task.id], {'state': 'cancelled', 'remaining_hours':0.0}, context=context) return True - def do_open(self, cr, uid, ids, context={}): + def do_open(self, cr, uid, ids, context=None): if not isinstance(ids,list): ids = [ids] tasks= self.browse(cr, uid, ids, context=context) for t in tasks: @@ -901,7 +903,7 @@ class task(osv.osv): self.log(cr, uid, t.id, message) return True - def do_draft(self, cr, uid, ids, context={}): + def do_draft(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state': 'draft'}, context=context) return True @@ -915,10 +917,12 @@ class task(osv.osv): return new_attachment_ids - def do_delegate(self, cr, uid, ids, delegate_data={}, context=None): + def do_delegate(self, cr, uid, ids, delegate_data=None, context=None): """ Delegate Task to another users. """ + if delegate_data is None: + delegate_data = {} assert delegate_data['user_id'], _("Delegated User should be specified") delegated_tasks = {} for task in self.browse(cr, uid, ids, context=context): @@ -950,7 +954,7 @@ class task(osv.osv): delegated_tasks[task.id] = delegated_task_id return delegated_tasks - def do_pending(self, cr, uid, ids, context={}): + def do_pending(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state': 'pending'}, context=context) for (id, name) in self.name_get(cr, uid, ids): message = _("The task '%s' is pending.") % name diff --git a/addons/project/wizard/project_task_reevaluate.py b/addons/project/wizard/project_task_reevaluate.py index 382c9d64361..b00c531717f 100644 --- a/addons/project/wizard/project_task_reevaluate.py +++ b/addons/project/wizard/project_task_reevaluate.py @@ -26,7 +26,7 @@ from tools.translate import _ class project_task_reevaluate(osv.osv_memory): _name = 'project.task.reevaluate' - def _get_remaining(self,cr, uid, context=None): + def _get_remaining(self, cr, uid, context=None): if context is None: context = {} active_id = context.get('active_id', False) diff --git a/addons/project_gtd/project_gtd.py b/addons/project_gtd/project_gtd.py index bec70779551..e11ce1339de 100644 --- a/addons/project_gtd/project_gtd.py +++ b/addons/project_gtd/project_gtd.py @@ -67,7 +67,7 @@ class project_task(osv.osv): default['context_id'] = False return super(project_task,self).copy_data(cr, uid, id, default, context) - def _get_context(self,cr, uid, context=None): + def _get_context(self, cr, uid, context=None): ids = self.pool.get('project.gtd.context').search(cr, uid, [], context=context) return ids and ids[0] or False diff --git a/addons/project_gtd/wizard/project_gtd_empty.py b/addons/project_gtd/wizard/project_gtd_empty.py index 373c8425a8c..268dfd26917 100644 --- a/addons/project_gtd/wizard/project_gtd_empty.py +++ b/addons/project_gtd/wizard/project_gtd_empty.py @@ -30,7 +30,7 @@ class project_timebox_empty(osv.osv_memory): 'name': fields.char('Name', size=32) } - def view_init(self, cr , uid , fields_list, context=None): + def view_init(self, cr, uid, fields_list, context=None): if context is None: context = {} self._empty(cr, uid, context=context) diff --git a/addons/project_mailgate/project_mailgate.py b/addons/project_mailgate/project_mailgate.py index 9715a32c151..1243d8f759d 100644 --- a/addons/project_mailgate/project_mailgate.py +++ b/addons/project_mailgate/project_mailgate.py @@ -47,7 +47,9 @@ class project_tasks(osv.osv): self.write(cr, uid, [res_id], data, context) return res_id - def message_update(self, cr, uid, ids, msg, data={}, default_act='pending'): + def message_update(self, cr, uid, ids, msg, data=None, default_act='pending'): + if data is None: + data = {} data.update({ 'description': msg['body_text'], }) diff --git a/addons/project_mrp/project_procurement.py b/addons/project_mrp/project_procurement.py index 7d3045aede0..ab545adfe48 100644 --- a/addons/project_mrp/project_procurement.py +++ b/addons/project_mrp/project_procurement.py @@ -40,7 +40,7 @@ class procurement_order(osv.osv): return all(proc.product_id.type != 'service' or (proc.task_id and proc.task_id.state in ('done', 'cancelled')) \ for proc in self.browse(cr, uid, ids, context=context)) - def check_produce_service(self, cr, uid, procurement, context=None): + def check_produce_service(self, cr, uid, procurement, context=None): return True def _convert_qty_company_hours(self, cr, uid, procurement, context=None): diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py index db7066505e1..c38b6b6258e 100644 --- a/addons/project_timesheet/project_timesheet.py +++ b/addons/project_timesheet/project_timesheet.py @@ -197,7 +197,7 @@ class task(osv.osv): return super(task,self).unlink(cr, uid, ids, *args, **kwargs) - def write(self, cr, uid, ids,vals,context=None): + def write(self, cr, uid, ids, vals, context=None): if context is None: context = {} if vals.get('project_id',False) or vals.get('name',False): diff --git a/addons/project_timesheet/report/task_report.py b/addons/project_timesheet/report/task_report.py index 3c223ab6b07..a181c4a12d2 100644 --- a/addons/project_timesheet/report/task_report.py +++ b/addons/project_timesheet/report/task_report.py @@ -29,7 +29,7 @@ class report_timesheet_task_user(osv.osv): _auto = False _order = "name" - def _get_task_hours(self, cr, uid, ids, name,args,context): + def _get_task_hours(self, cr, uid, ids, name, args, context): result = {} for record in self.browse(cr, uid, ids,context): last_date = datetime.strptime(record.name, '%Y-%m-%d') + relativedelta(months=1) - relativedelta(days=1) @@ -42,7 +42,7 @@ class report_timesheet_task_user(osv.osv): result[record.id] = total return result - def get_hrs_timesheet(self, cr, uid, ids, name,args,context): + def get_hrs_timesheet(self, cr, uid, ids, name, args, context): result = {} sum = 0.0 for record in self.browse(cr, uid, ids, context): diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 3d909c1085e..cb485ebc26c 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -395,7 +395,7 @@ class purchase_order(osv.osv): res = inv_id return res - def has_stockable_product(self,cr, uid, ids, *args): + def has_stockable_product(self, cr, uid, ids, *args): for order in self.browse(cr, uid, ids): for order_line in order.order_line: if order_line.product_id and order_line.product_id.product_tmpl_id.type in ('product', 'consu'): @@ -498,7 +498,7 @@ class purchase_order(osv.osv): wf_service.trg_validate(uid, 'stock.picking', picking_id, 'button_confirm', cr) return [picking_id] - def action_picking_create(self,cr, uid, ids, context=None): + def action_picking_create(self, cr, uid, ids, context=None): picking_ids = [] for order in self.browse(cr, uid, ids): picking_ids.extend(self._create_pickings(cr, uid, order, order.order_line, None, context=context)) diff --git a/addons/purchase/wizard/purchase_order_group.py b/addons/purchase/wizard/purchase_order_group.py index 427c9c165fc..e5c0eb81bb4 100644 --- a/addons/purchase/wizard/purchase_order_group.py +++ b/addons/purchase/wizard/purchase_order_group.py @@ -88,4 +88,4 @@ class purchase_order_group(osv.osv_memory): purchase_order_group() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/purchase_requisition/purchase_requisition.py b/addons/purchase_requisition/purchase_requisition.py index c43bd524090..a753f5d7e1a 100644 --- a/addons/purchase_requisition/purchase_requisition.py +++ b/addons/purchase_requisition/purchase_requisition.py @@ -183,7 +183,7 @@ class purchase_requisition_line(osv.osv): 'company_id': fields.related('requisition_id','company_id',type='many2one',relation='res.company',string='Company', store=True, readonly=True), } - def onchange_product_id(self, cr, uid, ids, product_id,product_uom_id, context=None): + def onchange_product_id(self, cr, uid, ids, product_id, product_uom_id, context=None): """ Changes UoM and name if product_id changes. @param name: Name of the field @param product_id: Changed product_id diff --git a/addons/report_webkit/ir_report.py b/addons/report_webkit/ir_report.py index d2709ea6fc2..68e129d021d 100644 --- a/addons/report_webkit/ir_report.py +++ b/addons/report_webkit/ir_report.py @@ -35,7 +35,7 @@ from webkit_report import WebKitParser from report.report_sxw import rml_parse def register_report(name, model, tmpl_path, parser=rml_parse): - "Register the report into the services" + """Register the report into the services""" name = 'report.%s' % name if netsvc.Service._services.get(name, False): service = netsvc.Service._services[name] diff --git a/addons/report_webkit/report_helper.py b/addons/report_webkit/report_helper.py index 12651f308dc..8d0a27998b0 100644 --- a/addons/report_webkit/report_helper.py +++ b/addons/report_webkit/report_helper.py @@ -75,7 +75,7 @@ class WebKitHelper(object): head = header_obj.browse(self.cursor, self.uid, header_img_id) return (head.img, head.type) - def embed_logo_by_name(self, name, width=0, height=0) : + def embed_logo_by_name(self, name, width=0, height=0): """Return HTML embedded logo by name""" img, type = self.get_logo_by_name(name) return self.embed_image(type, img, width, height) diff --git a/addons/resource/faces/task.py b/addons/resource/faces/task.py index f5240112277..53360fa047b 100644 --- a/addons/resource/faces/task.py +++ b/addons/resource/faces/task.py @@ -567,7 +567,8 @@ class _ValueWrapper(object): return result #@-node:_cmp #@+node:__getattr__ - def __getattr__(self, name): return getattr(self._value, name) + def __getattr__(self, name): + return getattr(self._value, name) #@-node:__getattr__ #@+node:__getitem__ def __getitem__(self, slice): diff --git a/addons/resource/resource.py b/addons/resource/resource.py index fb3d8c0980e..7a9ca30c68b 100644 --- a/addons/resource/resource.py +++ b/addons/resource/resource.py @@ -438,7 +438,7 @@ class resource_calendar_leaves(osv.osv): (check_dates, 'Error! leave start-date must be lower then leave end-date.', ['date_from', 'date_to']) ] - def onchange_resource(self,cr, uid, ids, resource, context=None): + def onchange_resource(self, cr, uid, ids, resource, context=None): result = {} if resource: resource_pool = self.pool.get('resource.resource') diff --git a/addons/sale/edi/sale_order.py b/addons/sale/edi/sale_order.py index d40d0b613ed..327d7602c4f 100644 --- a/addons/sale/edi/sale_order.py +++ b/addons/sale/edi/sale_order.py @@ -219,4 +219,4 @@ class sale_order_line(osv.osv, EDIMixin): edi_doc_list.append(edi_doc) return edi_doc_list -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale/report/__init__.py b/addons/sale/report/__init__.py index 0248595f4da..6986639d942 100644 --- a/addons/sale/report/__init__.py +++ b/addons/sale/report/__init__.py @@ -22,4 +22,4 @@ import sale_order import sale_report -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale/wizard/__init__.py b/addons/sale/wizard/__init__.py index 6cf076164d8..bfc8679de16 100644 --- a/addons/sale/wizard/__init__.py +++ b/addons/sale/wizard/__init__.py @@ -23,4 +23,4 @@ import sale_make_invoice import sale_line_invoice import sale_make_invoice_advance -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale/wizard/sale_make_invoice.py b/addons/sale/wizard/sale_make_invoice.py index 5265afb9bff..b4b3772a91a 100644 --- a/addons/sale/wizard/sale_make_invoice.py +++ b/addons/sale/wizard/sale_make_invoice.py @@ -68,4 +68,4 @@ class sale_make_invoice(osv.osv_memory): sale_make_invoice() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale_crm/__init__.py b/addons/sale_crm/__init__.py index f5db3f4333b..ac44586e7db 100644 --- a/addons/sale_crm/__init__.py +++ b/addons/sale_crm/__init__.py @@ -22,4 +22,4 @@ import wizard import sale_crm -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale_layout/sale_layout.py b/addons/sale_layout/sale_layout.py index 15531e76e1d..f369cc0ef6c 100644 --- a/addons/sale_layout/sale_layout.py +++ b/addons/sale_layout/sale_layout.py @@ -53,7 +53,7 @@ class sale_order_line(osv.osv): seq += 1 return invoice_line_ids - def onchange_sale_order_line_view(self, cr, uid, id, type, context={}, *args): + def onchange_sale_order_line_view(self, cr, uid, id, type, context=None, *args): temp = {} temp['value'] = {} if (not type): diff --git a/addons/sale_order_dates/sale_order_dates.py b/addons/sale_order_dates/sale_order_dates.py index ceb6d48755c..1b069cb2bed 100644 --- a/addons/sale_order_dates/sale_order_dates.py +++ b/addons/sale_order_dates/sale_order_dates.py @@ -61,4 +61,4 @@ class sale_order_dates(osv.osv): sale_order_dates() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/stock/report/lot_overview.py b/addons/stock/report/lot_overview.py index 89974fa122b..bf2fd32e32c 100644 --- a/addons/stock/report/lot_overview.py +++ b/addons/stock/report/lot_overview.py @@ -34,7 +34,7 @@ class lot_overview(report_sxw.rml_parse): 'grand_total_price':self._grand_total, }) - def process(self,location_id): + def process(self, location_id): location_obj = pooler.get_pool(self.cr.dbname).get('stock.location') data = location_obj._product_get_report(self.cr,self.uid, [location_id]) diff --git a/addons/stock/report/lot_overview_all.py b/addons/stock/report/lot_overview_all.py index 0b4edcaecf4..552949ec4b2 100644 --- a/addons/stock/report/lot_overview_all.py +++ b/addons/stock/report/lot_overview_all.py @@ -34,7 +34,7 @@ class lot_overview_all(report_sxw.rml_parse): 'grand_total_price':self._grand_total, }) - def process(self,location_id): + def process(self, location_id): location_obj = pooler.get_pool(self.cr.dbname).get('stock.location') data = location_obj._product_get_all_report(self.cr,self.uid, [location_id]) data['location_name'] = location_obj.read(self.cr, self.uid, [location_id],['complete_name'])[0]['complete_name'] diff --git a/addons/stock/report/stock_inventory_move_report.py b/addons/stock/report/stock_inventory_move_report.py index e8c0d44bcc1..762373f1250 100644 --- a/addons/stock/report/stock_inventory_move_report.py +++ b/addons/stock/report/stock_inventory_move_report.py @@ -30,7 +30,7 @@ class stock_inventory_move(report_sxw.rml_parse): 'qty_total':self._qty_total }) - def _qty_total(self,objects): + def _qty_total(self, objects): total = 0.0 uom = objects[0].product_uom.name for obj in objects: diff --git a/addons/stock_invoice_directly/wizard/stock_invoice.py b/addons/stock_invoice_directly/wizard/stock_invoice.py index 3725d9b6d7f..4bb0ab41d88 100644 --- a/addons/stock_invoice_directly/wizard/stock_invoice.py +++ b/addons/stock_invoice_directly/wizard/stock_invoice.py @@ -47,4 +47,4 @@ class invoice_directly(osv.osv_memory): invoice_directly() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/stock_location/procurement_pull.py b/addons/stock_location/procurement_pull.py index 0846fe067eb..93531596688 100644 --- a/addons/stock_location/procurement_pull.py +++ b/addons/stock_location/procurement_pull.py @@ -45,7 +45,7 @@ class procurement_order(osv.osv): return (line.type_proc=='move') and (line.location_src_id) return False - def action_move_create(self, cr, uid, ids,context=None): + def action_move_create(self, cr, uid, ids, context=None): proc_obj = self.pool.get('procurement.order') move_obj = self.pool.get('stock.move') picking_obj=self.pool.get('stock.picking') diff --git a/addons/stock_planning/stock_planning.py b/addons/stock_planning/stock_planning.py index d104d57c62b..05a8cb50486 100644 --- a/addons/stock_planning/stock_planning.py +++ b/addons/stock_planning/stock_planning.py @@ -406,7 +406,7 @@ class stock_planning(osv.osv): res[val.id] = 'Future' return res - def _get_op(self, cr, uid, ids, field_names, arg, context=None): # op = OrderPoint + def _get_op(self, cr, uid, ids, field_names, arg, context=None): res = {} for val in self.browse(cr, uid, ids, context=context): res[val.id]={} diff --git a/addons/stock_planning/wizard/stock_planning_createlines.py b/addons/stock_planning/wizard/stock_planning_createlines.py index a6e12ad4bc7..24b6fd4a8ab 100644 --- a/addons/stock_planning/wizard/stock_planning_createlines.py +++ b/addons/stock_planning/wizard/stock_planning_createlines.py @@ -49,7 +49,7 @@ class stock_planning_createlines(osv.osv_memory): 'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.planning', context=c), } - def create_planning(self,cr, uid, ids, context=None): + def create_planning(self, cr, uid, ids, context=None): if context is None: context = {} product_obj = self.pool.get('product.product') diff --git a/addons/survey/survey.py b/addons/survey/survey.py index 0101cef17b8..7d1d9801ada 100644 --- a/addons/survey/survey.py +++ b/addons/survey/survey.py @@ -514,7 +514,7 @@ class survey_question_column_heading(osv.osv): _description = 'Survey Question Column Heading' _rec_name = 'title' - def _get_in_visible_rating_weight(self,cr, uid, context=None): + def _get_in_visible_rating_weight(self, cr, uid, context=None): if context is None: context = {} if context.get('in_visible_rating_weight', False): @@ -567,7 +567,7 @@ class survey_answer(osv.osv): } return val - def _get_in_visible_answer_type(self,cr, uid, context=None): + def _get_in_visible_answer_type(self, cr, uid, context=None): if context is None: context = {} return context.get('in_visible_answer_type', False) diff --git a/addons/survey/wizard/__init__.py b/addons/survey/wizard/__init__.py index aa1270da751..0ea0e5cd424 100644 --- a/addons/survey/wizard/__init__.py +++ b/addons/survey/wizard/__init__.py @@ -27,4 +27,4 @@ import survey_selection import survey_answer import survey_print -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/survey/wizard/survey_answer.py b/addons/survey/wizard/survey_answer.py index 86380e98037..ec40cc9b8d2 100644 --- a/addons/survey/wizard/survey_answer.py +++ b/addons/survey/wizard/survey_answer.py @@ -997,7 +997,7 @@ class survey_question_wiz(osv.osv_memory): return survey_question_wiz_id - def action_new_question(self,cr, uid, ids, context=None): + def action_new_question(self, cr, uid, ids, context=None): """ New survey.Question form. """ @@ -1039,7 +1039,7 @@ class survey_question_wiz(osv.osv_memory): 'context': context } - def action_edit_page(self,cr, uid, ids, context=None): + def action_edit_page(self, cr, uid, ids, context=None): """ Edit survey.page. """ @@ -1061,7 +1061,7 @@ class survey_question_wiz(osv.osv_memory): 'context': context } - def action_delete_page(self,cr, uid, ids, context=None): + def action_delete_page(self, cr, uid, ids, context=None): """ Delete survey.page. """ @@ -1087,7 +1087,7 @@ class survey_question_wiz(osv.osv_memory): 'context': context } - def action_edit_question(self,cr, uid, ids, context=None): + def action_edit_question(self, cr, uid, ids, context=None): """ Edit survey.question. """ @@ -1109,7 +1109,7 @@ class survey_question_wiz(osv.osv_memory): 'context': context } - def action_delete_question(self,cr, uid, ids, context=None): + def action_delete_question(self, cr, uid, ids, context=None): """ Delete survey.question. """ diff --git a/addons/wiki/web/widgets/rss/feedparser.py b/addons/wiki/web/widgets/rss/feedparser.py old mode 100755 new mode 100644 index 885050d49f8..ad1265a7043 --- a/addons/wiki/web/widgets/rss/feedparser.py +++ b/addons/wiki/web/widgets/rss/feedparser.py @@ -2446,8 +2446,10 @@ def _stripDoctype(data): data = doctype_pattern.sub('', data) return version, data -def parse(url_file_stream_or_string, etag=None, modified=None, agent=None, referrer=None, handlers=[]): +def parse(url_file_stream_or_string, etag=None, modified=None, agent=None, referrer=None, handlers=None): '''Parse a feed from a URL, file, stream, or string''' + if handlers is None: + handlers = [] result = FeedParserDict() result['feed'] = FeedParserDict() result['entries'] = [] diff --git a/addons/wiki/web/widgets/wikimarkup/__init__.py b/addons/wiki/web/widgets/wikimarkup/__init__.py index f5fe67fada1..d62b7ae42bb 100644 --- a/addons/wiki/web/widgets/wikimarkup/__init__.py +++ b/addons/wiki/web/widgets/wikimarkup/__init__.py @@ -489,7 +489,7 @@ class BaseParser(object): return text.encode("utf-8") return text - def strip(self, text, stripcomments=False, dontstrip=[]): + def strip(self, text, stripcomments=False, dontstrip=None): render = True commentState = {} @@ -2087,7 +2087,9 @@ mTagHooks = {} # quote from cgi import escape -def hook_quote(env, body, attributes={}): +def hook_quote(env, body, attributes=None): + if attributes is None: + attributes = {} text = [u'
'] if 'cite' in attributes: text.append(u"%s wrote:\n" % escape(attributes['cite'])) From 42742a440d5425c5da7945688de668787c78f902 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Thu, 8 Mar 2012 09:31:39 +0100 Subject: [PATCH 019/581] [REF] clearer variable names bzr revid: ls@numerigraphe.fr-20120308083139-hv80tnovazjrps14 --- addons/procurement/procurement.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py index 164314c4573..7dca3a8a9e4 100644 --- a/addons/procurement/procurement.py +++ b/addons/procurement/procurement.py @@ -409,23 +409,24 @@ class procurement_order(osv.osv): return 0 def action_cancel(self, cr, uid, ids): - """ Cancels procurement and writes move state to Assigned. + """Cancel Procurements and either cancel or assign the related Stock Moves, depending on the procurement configuration. + @return: True """ - todo = [] - todo2 = [] + to_assign = [] + to_cancel = [] move_obj = self.pool.get('stock.move') for proc in self.browse(cr, uid, ids): if proc.close_move and proc.move_id: if proc.move_id.state not in ('done', 'cancel'): - todo2.append(proc.move_id.id) + to_cancel.append(proc.move_id.id) else: if proc.move_id and proc.move_id.state == 'waiting': - todo.append(proc.move_id.id) - if len(todo2): - move_obj.action_cancel(cr, uid, todo2) - if len(todo): - move_obj.write(cr, uid, todo, {'state': 'assigned'}) + to_assign.append(proc.move_id.id) + if len(to_cancel): + move_obj.action_cancel(cr, uid, to_cancel) + if len(to_assign): + move_obj.write(cr, uid, to_assign, {'state': 'assigned'}) self.write(cr, uid, ids, {'state': 'cancel'}) wf_service = netsvc.LocalService("workflow") for id in ids: From 65dbf53f5505fb18321d3412b19b15eb41008c52 Mon Sep 17 00:00:00 2001 From: Numerigraphe - Lionel Sausin Date: Thu, 8 Mar 2012 09:58:29 +0100 Subject: [PATCH 020/581] [REF] Add an XXX comment about context bzr revid: ls@numerigraphe.fr-20120308085829-7r1pjipa986xsyz6 --- addons/procurement/procurement.py | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py index 7dca3a8a9e4..83437cc3657 100644 --- a/addons/procurement/procurement.py +++ b/addons/procurement/procurement.py @@ -408,6 +408,7 @@ class procurement_order(osv.osv): """ return 0 + # XXX action_cancel() should accept a context argument def action_cancel(self, cr, uid, ids): """Cancel Procurements and either cancel or assign the related Stock Moves, depending on the procurement configuration. From d930f23ece879bca7480caee2ec6fb372c2bf48b Mon Sep 17 00:00:00 2001 From: "Divyesh Makwana (Open ERP)" Date: Mon, 12 Mar 2012 15:34:29 +0530 Subject: [PATCH 021/581] [FIX] sale : 6.1RC1 report Sales Analysis bug lp bug: https://launchpad.net/bugs/938866 fixed bzr revid: mdi@tinyerp.com-20120312100429-a718zljp31bs7tv3 --- addons/sale/report/sale_report.py | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/sale/report/sale_report.py b/addons/sale/report/sale_report.py index 42e090d54e5..23ce41f7d58 100644 --- a/addons/sale/report/sale_report.py +++ b/addons/sale/report/sale_report.py @@ -97,6 +97,7 @@ class sale_report(osv.osv): left join product_template t on (p.product_tmpl_id=t.id) left join product_uom u on (u.id=l.product_uom) left join product_uom u2 on (u2.id=t.uom_id) + where l.product_id is not null group by l.product_id, l.product_uom_qty, From 799c70694c40100919f98c2c4bdaec6455e3d537 Mon Sep 17 00:00:00 2001 From: ana <> Date: Tue, 20 Mar 2012 12:14:57 +0530 Subject: [PATCH 022/581] [FIX] account_asset : Assets Date should be taken form invoice date rather than current date lp bug: https://launchpad.net/bugs/935564 fixed bzr revid: amp@tinyerp.com-20120320064457-o6zc3khmkrh0q4bh --- addons/account_asset/account_asset_invoice.py | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/account_asset/account_asset_invoice.py b/addons/account_asset/account_asset_invoice.py index 700832881c4..4b38834bdc3 100644 --- a/addons/account_asset/account_asset_invoice.py +++ b/addons/account_asset/account_asset_invoice.py @@ -57,6 +57,7 @@ class account_invoice_line(osv.osv): 'partner_id': line.invoice_id.partner_id.id, 'company_id': line.invoice_id.company_id.id, 'currency_id': line.invoice_id.currency_id.id, + 'purchase_date' : line.invoice_id.date_invoice, } changed_vals = asset_obj.onchange_category_id(cr, uid, [], vals['category_id'], context=context) vals.update(changed_vals['value']) From c2e3dca73fcee2215c5f58d4c5d135b3d86b44c2 Mon Sep 17 00:00:00 2001 From: "Dmitrijs Ledkovs (credativ)" Date: Wed, 21 Mar 2012 10:47:40 +0000 Subject: [PATCH 023/581] [FIX] corrected unreconciled domain on Paybles & Receivables window action lp bug: https://launchpad.net/bugs/961051 fixed bzr revid: dmitrijs.ledkovs@credativ.co.uk-20120321104740-6x0ehabi3pbz2i5j --- addons/account/account_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 3d782c2b4c4..8e123bb5c33 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -2042,7 +2042,7 @@ src_model="account.journal"/> Date: Wed, 21 Mar 2012 16:59:28 +0530 Subject: [PATCH 024/581] [FIX] stock : Need to improve stock partial pciking object with _rec_name lp bug: https://launchpad.net/bugs/960982 fixed bzr revid: amp@tinyerp.com-20120321112928-gbc4skdkeuy4oo53 --- addons/stock/wizard/stock_partial_picking.py | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/stock/wizard/stock_partial_picking.py b/addons/stock/wizard/stock_partial_picking.py index 6f815413497..5ff2f862398 100644 --- a/addons/stock/wizard/stock_partial_picking.py +++ b/addons/stock/wizard/stock_partial_picking.py @@ -57,6 +57,7 @@ class stock_partial_picking_line(osv.TransientModel): class stock_partial_picking(osv.osv_memory): _name = "stock.partial.picking" + _rec_name = 'picking_id' _description = "Partial Picking Processing Wizard" def _hide_tracking(self, cursor, user, ids, name, arg, context=None): From 4bcd1573367234dc1cca003bae3ad03cd3bafb34 Mon Sep 17 00:00:00 2001 From: "Amit Bhavsar (Open ERP)" Date: Thu, 22 Mar 2012 16:04:34 +0530 Subject: [PATCH 025/581] [FIX] purchase : Fixes the context argument problem lp bug: https://launchpad.net/bugs/960308 fixed bzr revid: amb@tinyerp.com-20120322103434-v0l6247f3z54qo2d --- addons/purchase/purchase.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 3d909c1085e..80955d0b9e4 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -773,7 +773,7 @@ class purchase_order_line(osv.osv): # - determine product_qty and date_planned based on seller info if not date_order: - date_order = fields.date.context_today(cr,uid,context=context) + date_order = fields.date.context_today(self,cr,uid,context=context) qty = qty or 1.0 supplierinfo = False From 8c23e9f488fa3133c97164fe295ebf3b5204556a Mon Sep 17 00:00:00 2001 From: jir Date: Fri, 23 Mar 2012 16:19:55 +0530 Subject: [PATCH 026/581] [FIX] base_calender : Fixes the infinite created meeting problem lp bug: https://launchpad.net/bugs/961094 fixed bzr revid: jir@jir-desktop-20120323104955-bmnp2j4b9xiuf70w --- addons/base_calendar/base_calendar.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py index 1545c6c920c..e475a793610 100644 --- a/addons/base_calendar/base_calendar.py +++ b/addons/base_calendar/base_calendar.py @@ -1002,8 +1002,8 @@ class calendar_event(osv.osv): event = datas['id'] if datas.get('interval', 0) < 0: raise osv.except_osv(_('Warning!'), _('Interval cannot be negative')) - if datas.get('count', 0) < 0: - raise osv.except_osv(_('Warning!'), _('Count cannot be negative')) + if datas.get('count', 0) <= 0: + raise osv.except_osv(_('Warning!'), _('Count cannot be negative or 0')) if datas['recurrency']: result[event] = self.compute_rule_string(datas) else: From d9b5884bff4c98ab73e23ca079eb081fdb42eb25 Mon Sep 17 00:00:00 2001 From: "Amit Bhavsar (Open ERP)" Date: Tue, 27 Mar 2012 16:49:14 +0530 Subject: [PATCH 027/581] [FIX] stock : Fixes the sorce location problem lp bug: https://launchpad.net/bugs/963750 fixed bzr revid: amb@tinyerp.com-20120327111914-mns594vtmtcr1fu7 --- addons/stock/stock.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index d26ca8f0da3..0e9fcfb3f50 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -2355,7 +2355,7 @@ class stock_move(osv.osv): 'prodlot_id': move.prodlot_id.id, } if move.location_id.usage <> 'internal': - default_val.update({'location_id': move.location_dest_id.id}) + default_val.update({'location_id': move.location_id.id}) new_move = self.copy(cr, uid, move.id, default_val) res += [new_move] From 0ef89eb059c246d23c41a4fadb3e8f4c789065b0 Mon Sep 17 00:00:00 2001 From: "marta(pexego)" <> Date: Wed, 28 Mar 2012 09:46:34 +0530 Subject: [PATCH 028/581] [FIX] account : Improved the description size for spanish localization taxes lp bug: https://launchpad.net/bugs/929688 fixed bzr revid: amp@tinyerp.com-20120328041634-04rk39u8fp27r7ry --- addons/account/account.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index c165a7f3b42..0c371bd8211 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -1889,7 +1889,7 @@ class account_tax(osv.osv): 'ref_tax_sign': fields.float('Tax Code Sign', help="Usually 1 or -1."), 'include_base_amount': fields.boolean('Included in base amount', help="Indicates if the amount of tax must be included in the base amount for the computation of the next taxes"), 'company_id': fields.many2one('res.company', 'Company', required=True), - 'description': fields.char('Tax Code',size=32), + 'description': fields.char('Tax Code',size=128), 'price_include': fields.boolean('Tax Included in Price', help="Check this if the price you use on the product and invoices includes this tax."), 'type_tax_use': fields.selection([('sale','Sale'),('purchase','Purchase'),('all','All')], 'Tax Application', required=True) @@ -2785,7 +2785,7 @@ class account_tax_template(osv.osv): 'ref_base_sign': fields.float('Base Code Sign', help="Usually 1 or -1."), 'ref_tax_sign': fields.float('Tax Code Sign', help="Usually 1 or -1."), 'include_base_amount': fields.boolean('Include in Base Amount', help="Set if the amount of tax must be included in the base amount before computing the next taxes."), - 'description': fields.char('Internal Name', size=32), + 'description': fields.char('Internal Name', size=128), 'type_tax_use': fields.selection([('sale','Sale'),('purchase','Purchase'),('all','All')], 'Tax Use In', required=True,), 'price_include': fields.boolean('Tax Included in Price', help="Check this if the price you use on the product and invoices includes this tax."), } From 908ac62ab6b9399490c168d12715dfdf9604fa53 Mon Sep 17 00:00:00 2001 From: "Amit (OpenERP)" Date: Wed, 28 Mar 2012 11:19:45 +0530 Subject: [PATCH 029/581] [FIX] account : Fixes the translation problem lp bug: https://launchpad.net/bugs/943980 fixed bzr revid: amp@tinyerp.com-20120328054945-klkxmxsf3b12iuv8 --- addons/account/account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/account/account.py b/addons/account/account.py index c165a7f3b42..6e17ca30275 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -678,7 +678,7 @@ class account_journal_view(osv.osv): _name = "account.journal.view" _description = "Journal View" _columns = { - 'name': fields.char('Journal View', size=64, required=True), + 'name': fields.char('Journal View', size=64, required=True, translate=True), 'columns_id': fields.one2many('account.journal.column', 'view_id', 'Columns') } _order = "name" From c26d11c6ecd4443837192a1f22034a4239e2fee9 Mon Sep 17 00:00:00 2001 From: "Amit (OpenERP)" Date: Wed, 28 Mar 2012 14:56:48 +0530 Subject: [PATCH 030/581] [FIX] account_asset : Fixes the field type problem lp bug: https://launchpad.net/bugs/935469 fixed bzr revid: amp@tinyerp.com-20120328092648-gx3nfuv0bqmg13bt --- addons/account_asset/account_asset.py | 2 +- addons/account_asset/report/account_asset_report.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/account_asset/account_asset.py b/addons/account_asset/account_asset.py index 97aec1d8487..8b589a7c6df 100644 --- a/addons/account_asset/account_asset.py +++ b/addons/account_asset/account_asset.py @@ -337,7 +337,7 @@ class account_asset_depreciation_line(osv.osv): 'amount': fields.float('Depreciation Amount', required=True), 'remaining_value': fields.float('Amount to Depreciate', required=True), 'depreciated_value': fields.float('Amount Already Depreciated', required=True), - 'depreciation_date': fields.char('Depreciation Date', size=64, select=1), + 'depreciation_date': fields.date('Depreciation Date', select=1), 'move_id': fields.many2one('account.move', 'Depreciation Entry'), 'move_check': fields.function(_get_move_check, method=True, type='boolean', string='Posted', store=True) } diff --git a/addons/account_asset/report/account_asset_report.py b/addons/account_asset/report/account_asset_report.py index a7d9adf00f9..6c183c4c037 100644 --- a/addons/account_asset/report/account_asset_report.py +++ b/addons/account_asset/report/account_asset_report.py @@ -50,7 +50,7 @@ class asset_asset_report(osv.osv): select min(dl.id) as id, dl.name as name, - to_date(dl.depreciation_date, 'YYYY-MM-DD') as depreciation_date, + dl.depreciation_date as depreciation_date, a.purchase_date as purchase_date, (CASE WHEN (select min(d.id) from account_asset_depreciation_line as d left join account_asset_asset as ac ON (ac.id=d.asset_id) @@ -77,7 +77,7 @@ class asset_asset_report(osv.osv): from account_asset_depreciation_line dl left join account_asset_asset a on (dl.asset_id=a.id) group by - dl.amount,dl.asset_id,to_date(dl.depreciation_date, 'YYYY-MM-DD'),dl.name, + dl.amount,dl.asset_id,dl.depreciation_date,dl.name, a.purchase_date, dl.move_check, a.state, a.category_id, a.partner_id, a.company_id, a.purchase_value, a.id, a.salvage_value )""") From 014e243e7fad08f53543d50d851372f1670b08b9 Mon Sep 17 00:00:00 2001 From: "Amit (OpenERP)" Date: Wed, 28 Mar 2012 15:51:45 +0530 Subject: [PATCH 031/581] [FIX] account : Add decimal precision for credit, debit and write-off field on account reconcile wizard lp bug: https://launchpad.net/bugs/944017 fixed bzr revid: amp@tinyerp.com-20120328102145-li145mzcmtphc2pw --- addons/account/wizard/account_reconcile.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/addons/account/wizard/account_reconcile.py b/addons/account/wizard/account_reconcile.py index 729792e2222..a5020570926 100644 --- a/addons/account/wizard/account_reconcile.py +++ b/addons/account/wizard/account_reconcile.py @@ -23,6 +23,7 @@ import time from osv import fields, osv from tools.translate import _ +import decimal_precision as dp class account_move_line_reconcile(osv.osv_memory): """ @@ -32,9 +33,9 @@ class account_move_line_reconcile(osv.osv_memory): _description = 'Account move line reconcile' _columns = { 'trans_nbr': fields.integer('# of Transaction', readonly=True), - 'credit': fields.float('Credit amount', readonly=True), - 'debit': fields.float('Debit amount', readonly=True), - 'writeoff': fields.float('Write-Off amount', readonly=True), + 'credit': fields.float('Credit amount', readonly=True, digits_compute=dp.get_precision('Account')), + 'debit': fields.float('Debit amount', readonly=True, digits_compute=dp.get_precision('Account')), + 'writeoff': fields.float('Write-Off amount', readonly=True, digits_compute=dp.get_precision('Account')), } def default_get(self, cr, uid, fields, context=None): @@ -173,4 +174,4 @@ class account_move_line_reconcile_writeoff(osv.osv_memory): account_move_line_reconcile_writeoff() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From 488e7a881736bf95e37dafa05cc8661e0ddbfc12 Mon Sep 17 00:00:00 2001 From: "Amit (OpenERP)" Date: Wed, 28 Mar 2012 18:06:34 +0530 Subject: [PATCH 032/581] [FIX] account_voucher : Usability improvement lp bug: https://launchpad.net/bugs/926041 fixed bzr revid: amp@tinyerp.com-20120328123634-c42tqj487otbh43o --- addons/account_voucher/account_voucher.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 54226166508..b884fc86193 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -32,11 +32,11 @@ class res_company(osv.osv): _columns = { 'income_currency_exchange_account_id': fields.many2one( 'account.account', - string="Income Currency Rate", + string="Gain Exchange Rate Account", domain="[('type', '=', 'other')]",), 'expense_currency_exchange_account_id': fields.many2one( 'account.account', - string="Expense Currency Rate", + string="Loss Exchange Rate Account", domain="[('type', '=', 'other')]",), } From d3fb28b0ad8a0e9986e54455304f84aec134c17b Mon Sep 17 00:00:00 2001 From: jir Date: Thu, 29 Mar 2012 12:30:42 +0530 Subject: [PATCH 033/581] [FIX] Fixes the infinity when give a blank value in recurrence termination lp bug: https://launchpad.net/bugs/961094 fixed bzr revid: jir@jir-desktop-20120329070042-tm4lvczvq6frc3yq --- addons/crm/crm_meeting_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/crm/crm_meeting_view.xml b/addons/crm/crm_meeting_view.xml index 527f5814be4..3d2538b67ff 100644 --- a/addons/crm/crm_meeting_view.xml +++ b/addons/crm/crm_meeting_view.xml @@ -171,7 +171,7 @@ - +
From 1338046cf0f7d37f724a09899695b7e02a5b873c Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Mon, 27 Aug 2012 10:59:33 +0530 Subject: [PATCH 125/581] [IMP]added access to mail_message_subtype bzr revid: sgo@tinyerp.com-20120827052933-6ajhaete5vuzqhiv --- addons/mail/security/ir.model.access.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/mail/security/ir.model.access.csv b/addons/mail/security/ir.model.access.csv index 1979e2fec05..61106fbf234 100644 --- a/addons/mail/security/ir.model.access.csv +++ b/addons/mail/security/ir.model.access.csv @@ -7,3 +7,4 @@ access_mail_notification_all,mail.notification.all,model_mail_notification,,1,1, access_mail_group,mail.group,model_mail_group,base.group_user,1,1,1,1 access_mail_alias_user,mail.alias,model_mail_alias,base.group_user,1,1,1,0 access_mail_alias_system,mail.alias,model_mail_alias,base.group_system,1,1,1,1 +access_mail_message_subtype,mail.message.subtype,model_mail_message_subtype,,1,1,1,1 \ No newline at end of file From 5a8bdae6d684cc4e4c9140ff971aaa5c552e7925 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Mon, 27 Aug 2012 11:25:39 +0530 Subject: [PATCH 126/581] [IMP]:improved view bzr revid: apa@tinyerp.com-20120827055539-kqybbq2sqhx9tax9 --- addons/mail/static/src/js/mail_followers.js | 12 ++++++------ addons/mail/static/src/xml/mail_followers.xml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js index c6a83817af9..f81919de1c7 100644 --- a/addons/mail/static/src/js/mail_followers.js +++ b/addons/mail/static/src/js/mail_followers.js @@ -43,7 +43,7 @@ openerp_mail_followers = function(session, mail) { this.view.on("change:actual_mode", this, this._check_visibility); this._check_visibility(); this.fetch_subtype(); - this.$el.find('ul.oe_mail_recthread_subtype').click(function () { + this.$el.find('div.oe_mail_recthread_subtype').click(function () { var subtypelist = new Array(); _($(this).find('.oe_msg_subtype_check')).each(function (record){ if($(record).is(':checked')) { @@ -55,7 +55,7 @@ openerp_mail_followers = function(session, mail) { if (! this.params.display_control) { this.$el.find('button.oe_mail_button_followers').hide(); - this.$el.find('ul.oe_mail_recthread_subtype').hide() + this.$el.find('div.oe_mail_recthread_subtype').hide() } this.$el.find('button.oe_mail_button_follow').click(function () { self.do_follow(); @@ -85,7 +85,7 @@ openerp_mail_followers = function(session, mail) { this.$el.find('button.oe_mail_button_followers').html('Hide followers') this.$el.find('button.oe_mail_button_follow').hide(); this.$el.find('button.oe_mail_button_unfollow').hide(); - this.$el.find('ul.oe_mail_recthread_subtype').hide() + this.$el.find('div.oe_mail_recthread_subtype').hide() }, set_value: function(value_) { @@ -118,17 +118,17 @@ openerp_mail_followers = function(session, mail) { if (this.is_subscriber) { this.$el.find('button.oe_mail_button_follow').hide(); this.$el.find('button.oe_mail_button_unfollow').show(); - this.$el.find('ul.oe_mail_recthread_subtype').show(); } + this.$el.find('div.oe_mail_recthread_subtype').show(); } else { this.$el.find('button.oe_mail_button_follow').show(); this.$el.find('button.oe_mail_button_unfollow').hide(); - this.$el.find('ul.oe_mail_recthread_subtype').hide() } + this.$el.find('div.oe_mail_recthread_subtype').hide() } }, // Display the subtypes of each records. display_subtype: function(records) { var self = this - var subtype_list = this.$el.find('ul.oe_mail_recthread_subtype').empty(); + var subtype_list = this.$el.find('div.oe_mail_recthread_subtype').empty(); var follower_ids = this.follower_model.call('search',[[['res_model','=',this.ds_model.model],['res_id','=',this.view.datarecord.id],['user_id','=',this.session.uid]]]) follower_ids.then(function (record){ var follower_read = self.follower_model.call('read', [record,['subtype_ids']]); diff --git a/addons/mail/static/src/xml/mail_followers.xml b/addons/mail/static/src/xml/mail_followers.xml index 1a93d860b53..2f7f5e6cde8 100644 --- a/addons/mail/static/src/xml/mail_followers.xml +++ b/addons/mail/static/src/xml/mail_followers.xml @@ -11,7 +11,7 @@ -
    +

    From dd6e836c61ea20fc28cafbab96909fa88bbd2115 Mon Sep 17 00:00:00 2001 From: Yann papouin <> Date: Mon, 27 Aug 2012 15:32:46 +0530 Subject: [PATCH 127/581] [FIX] project_mrp : Fixes the problem of procurement for service product. lp bug: https://launchpad.net/bugs/997642 fixed bzr revid: amb@tinyerp.com-20120827100246-y9d38makz4iumlk0 --- addons/project_mrp/project_procurement.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/project_mrp/project_procurement.py b/addons/project_mrp/project_procurement.py index 299a74f52aa..a8c0ed6ab21 100644 --- a/addons/project_mrp/project_procurement.py +++ b/addons/project_mrp/project_procurement.py @@ -37,8 +37,9 @@ class procurement_order(osv.osv): """ Checks if task is done or not. @return: True or False. """ - return all(proc.product_id.type != 'service' or (proc.task_id and proc.task_id.state in ('done', 'cancelled')) \ + res = all((proc.product_id.type != 'service') or ((proc.product_id.type == 'service') and (proc.product_id.procure_method == 'make_to_stock')) or (proc.task_id and proc.task_id.state in ('done', 'cancelled')) \ for proc in self.browse(cr, uid, ids, context=context)) + return res def check_produce_service(self, cr, uid, procurement, context=None): return True @@ -80,7 +81,7 @@ class procurement_order(osv.osv): 'project_id': project and project.id or False, 'company_id': procurement.company_id.id, },context=context) - self.write(cr, uid, [procurement.id], {'task_id': task_id, 'state': 'running'}, context=context) + self.write(cr, uid, [procurement.id], {'task_id': task_id, 'state': 'running', 'message':'from project: task created.'}, context=context) self.running_send_note(cr, uid, ids, context=None) return task_id From cf8c1611d5d55d0410af91cfb86e335943f81a8b Mon Sep 17 00:00:00 2001 From: "Ferdinand @ Camptocamp" <> Date: Mon, 27 Aug 2012 17:11:23 +0530 Subject: [PATCH 128/581] [FIX] allows to add lots to planned quantity lp bug: https://launchpad.net/bugs/1009245 fixed bzr revid: rmu@tinyerp.com-20120827114123-dpxrkfgeh28b1x3t --- addons/mrp/mrp_view.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml index c394544574d..194f8ddd768 100644 --- a/addons/mrp/mrp_view.xml +++ b/addons/mrp/mrp_view.xml @@ -694,6 +694,7 @@ +
    +

      -
          From 5eed2be266d4dd2d12280ba06b467f3fd54387be Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Fri, 31 Aug 2012 14:40:43 +0530 Subject: [PATCH 155/581] [IMP]minor changes bzr revid: sgo@tinyerp.com-20120831091043-4rix3ozakssbxrgn --- addons/mail/mail_thread.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index abe5c296218..972227e120f 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -577,7 +577,7 @@ class mail_thread(osv.Model): self.message_post(cr, uid, [id], message, context=context) def message_post(self, cr, uid, thread_id, body='', subject=False, - msg_type='notification', parent_id=False, attachments=None, context=None, **kwargs): + msg_type='notification', parent_id=False, attachments=None, subtype='other', context=None, **kwargs): """ Post a new message in an existing message thread, returning the new mail.message ID. Extra keyword arguments will be used as default column values for the new mail.message record. From ca22d79a2107d943f1484728cdda7b6d37f43826 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 31 Aug 2012 14:42:06 +0530 Subject: [PATCH 156/581] [IMP] Add data of subtype in procurement bzr revid: fka@tinyerp.com-20120831091206-196wzqlatj7lryi0 --- addons/procurement/procurement.py | 12 ++++----- addons/procurement/procurement_data.xml | 34 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py index db50ebd94fd..4c60316ffb6 100644 --- a/addons/procurement/procurement.py +++ b/addons/procurement/procurement.py @@ -496,22 +496,22 @@ class procurement_order(osv.osv): return obj_id def create_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Procurement has been created."), context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been created."), subtype="new", context=context) def confirm_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Procurement has been confirmed."), context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been confirmed."), subtype="confirmed", context=context) def running_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Procurement has been set to running."), context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been set to running."), subtype="running", context=context) def ready_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Procurement has been set to ready."), context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been set to ready."), subtype="ready", context=context) def cancel_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Procurement has been cancelled."), context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been cancelled."), subtype="cancel", context=context) def done_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Procurement has been done."), context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been done."), subtype="close", context=context) procurement_order() diff --git a/addons/procurement/procurement_data.xml b/addons/procurement/procurement_data.xml index 6a83d525c68..bbcaa33d2a1 100644 --- a/addons/procurement/procurement_data.xml +++ b/addons/procurement/procurement_data.xml @@ -28,5 +28,39 @@ 1 1 + + + + + + + confirmed + + + + ready + + + + running + + + + + + + + + + + + + + + + + \ No newline at end of file From 17ef40f428cbe12358e5bd54efa3c66ecf8e1b0c Mon Sep 17 00:00:00 2001 From: "Randhir Mayatra (OpenERP)" Date: Fri, 31 Aug 2012 15:30:12 +0530 Subject: [PATCH 157/581] [IMP]add the data into event for subtype bzr revid: rma@tinyerp.com-20120831100012-mlzik593orznp9aj --- addons/event/__openerp__.py | 1 + addons/event/event.py | 20 ++++++++++---------- addons/event/event_data.xml | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/addons/event/__openerp__.py b/addons/event/__openerp__.py index 1e548f68991..428ebb4cb06 100644 --- a/addons/event/__openerp__.py +++ b/addons/event/__openerp__.py @@ -46,6 +46,7 @@ Note that: 'data': [ 'security/event_security.xml', 'security/ir.model.access.csv', + 'event_data.xml', 'wizard/event_confirm_view.xml', 'event_view.xml', 'report/report_event_registration_view.xml', diff --git a/addons/event/event.py b/addons/event/event.py index 763aa423378..c3284695ab9 100644 --- a/addons/event/event.py +++ b/addons/event/event.py @@ -264,27 +264,27 @@ class event_event(osv.osv): def create_send_note(self, cr, uid, ids, context=None): message = _("Event has been created.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="new", context=context) return True def button_cancel_send_note(self, cr, uid, ids, context=None): message = _("Event has been cancelled.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="cancel", context=context) return True def button_draft_send_note(self, cr, uid, ids, context=None): message = _("Event has been set to draft.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="new", context=context) return True def button_done_send_note(self, cr, uid, ids, context=None): message = _("Event has been done.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="close", context=context) return True def button_confirm_send_note(self, cr, uid, ids, context=None): message = _("Event has been confirmed.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="confirm", context=context) return True event_event() @@ -331,7 +331,7 @@ class event_registration(osv.osv): def confirm_registration(self, cr, uid, ids, context=None): self.message_post(cr, uid, ids, body=_('State set to open'), context=context) - return self.write(cr, uid, ids, {'state': 'open'}, context=context) + return self.write(cr, uid, ids, {'state': 'open'}, subtype="open", context=context) def create(self, cr, uid, vals, context=None): obj_id = super(event_registration, self).create(cr, uid, vals, context) @@ -360,13 +360,13 @@ class event_registration(osv.osv): if today >= registration.event_id.date_begin: values = {'state': 'done', 'date_closed': today} self.write(cr, uid, ids, values) - self.message_post(cr, uid, ids, body=_('State set to Done'), context=context) + self.message_post(cr, uid, ids, body=_('State set to Done'), subtype="close", context=context) else: raise osv.except_osv(_('Error!'),_("You must wait for the starting day of the event to do this action.") ) return True def button_reg_cancel(self, cr, uid, ids, context=None, *args): - self.message_post(cr, uid, ids, body=_('State set to Cancel'), context=context) + self.message_post(cr, uid, ids, body=_('State set to Cancel'), subtype="cancel", context=context) return self.write(cr, uid, ids, {'state': 'cancel'}) def mail_user(self, cr, uid, ids, context=None): @@ -436,12 +436,12 @@ class event_registration(osv.osv): def create_send_note(self, cr, uid, ids, context=None): message = _("Registration has been created.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="new", context=context) return True def do_draft_send_note(self, cr, uid, ids, context=None): message = _("Registration has been set as draft.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="new", context=context) return True event_registration() diff --git a/addons/event/event_data.xml b/addons/event/event_data.xml index 83af2f35cfb..0498d3e490b 100644 --- a/addons/event/event_data.xml +++ b/addons/event/event_data.xml @@ -12,6 +12,38 @@ automatic 100 + + new + + + + + close + + + + cancel + + + + + confirm + + + + + open + + + + + + + + + + + @@ -20,5 +52,6 @@ From the top menu Events, you can organize events, manage registrations, automate communication around your event and sell events through your quotations. Module Events Organisation has been installed + From 90e55a5337694a15131bfac9a3d705ee25723052 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Fri, 31 Aug 2012 15:33:18 +0530 Subject: [PATCH 158/581] [IMP]remove unused method and improve code bzr revid: sgo@tinyerp.com-20120831100318-t2e2wv81trwfpc7u --- addons/mail/mail_thread.py | 6 +++--- addons/mail/static/src/js/mail_followers.js | 6 +----- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 972227e120f..2d31a9ad3ba 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -711,8 +711,8 @@ class mail_thread(osv.Model): return True def message_subscribe_udpate_subtypes(self, cr, uid, ids, user_id, subtype_ids,context=None): - subscription_obj = self.pool.get('mail.followers') - subscription_ids = subscription_obj.search(cr, uid, [('res_model', '=', self._name), ('res_id', 'in', ids)]) - return subscription_obj.write(cr, uid, subscription_ids, {'subtype_ids': [(6, 0 , subtype_ids)]}, context = context) #overright or add new one + followers_obj = self.pool.get('mail.followers') + followers_ids = followers_obj.search(cr, uid, [('res_model', '=', self._name), ('res_id', 'in', ids)]) + return followers_obj.write(cr, uid, followers_ids, {'subtype_ids': [(6, 0 , subtype_ids)]}, context = context) #overright or add new one # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js index 1601f3aaf46..fc9223b3657 100644 --- a/addons/mail/static/src/js/mail_followers.js +++ b/addons/mail/static/src/js/mail_followers.js @@ -40,11 +40,7 @@ openerp_mail_followers = function(session, mail) { this._check_visibility(); this.fetch_subtype(); this.$el.find('ul.oe_mail_recthread_subtype').click(function () {self.update_subtype();}) - this.$el.find('button.oe_mail_button_follow').click(function () { - self.do_follow(); - self.fetch_subtype(); - }) - this.$el.find('button.oe_mail_button_follow').click(function () { self.do_follow(); }) + this.$el.find('button.oe_mail_button_follow').click(function () { self.do_follow(); self.fetch_subtype();}) .mouseover(function () { $(this).html('Follow').removeClass('oe_mail_button_mouseout').addClass('oe_mail_button_mouseover'); }) .mouseleave(function () { $(this).html('Not following').removeClass('oe_mail_button_mouseover').addClass('oe_mail_button_mouseout'); }); this.$el.find('button.oe_mail_button_unfollow').click(function () { self.do_unfollow(); }) From a6a3d4eda6427fc1470e1bfd8408ba90581ad9e9 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 31 Aug 2012 16:10:32 +0530 Subject: [PATCH 159/581] [IMP] set indentation in purchase_requisition.xml bzr revid: fka@tinyerp.com-20120831104032-yfuugotohlgfvz75 --- .../purchase_requisition_data.xml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/addons/purchase_requisition/purchase_requisition_data.xml b/addons/purchase_requisition/purchase_requisition_data.xml index 211f51374dd..11ac73a6dd2 100644 --- a/addons/purchase_requisition/purchase_requisition_data.xml +++ b/addons/purchase_requisition/purchase_requisition_data.xml @@ -6,17 +6,18 @@ id="purchase_default_set" model="ir.values" name="set"/> - + + close - - - - - - - + + + + + + + From 31064b1855a60bf211c4a6f0abcb304865ee692e Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 31 Aug 2012 16:11:43 +0530 Subject: [PATCH 160/581] fix data bzr revid: apa@tinyerp.com-20120831104143-1ymb932kpng3bu3z --- addons/sale/sale_data.xml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/addons/sale/sale_data.xml b/addons/sale/sale_data.xml index a9c0e18a415..fceb806b3a2 100644 --- a/addons/sale/sale_data.xml +++ b/addons/sale/sale_data.xml @@ -41,14 +41,13 @@ - - mail.group - - notification - Sales Management application installed! - This application lets you create and send quotations and process your sales orders; from delivery to invoicing. -If you need to manage your sales pipeline (leads, opportunities, phonecalls), you can install the module <i>CRM</i> from the top menu Settings. + + + The Sales Management application has been installed. + This modules allows you to create and send easily quotations and process your sales orders; from the delivery to the invoicing. + +If you need to manage your sales pipeline (leads, opportunities, phonecalls), you can install the module <i>CRM</i> from the top menu Settings. From 139ee97562ec45549e35ac747bd6c2ae53360c58 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 31 Aug 2012 16:15:40 +0530 Subject: [PATCH 161/581] typo bzr revid: apa@tinyerp.com-20120831104540-oixjx4jpknk5hlcc --- addons/sale/sale_data.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sale/sale_data.xml b/addons/sale/sale_data.xml index fceb806b3a2..a23ab401dbd 100644 --- a/addons/sale/sale_data.xml +++ b/addons/sale/sale_data.xml @@ -56,7 +56,7 @@ If you need to manage your sales pipeline (leads, opportunities, phonecalls), yo - cancel + cancelled From 1100d6b1cceb2cf74edf3b68f19d1a74b1c35c0c Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 31 Aug 2012 16:21:17 +0530 Subject: [PATCH 162/581] typo bzr revid: apa@tinyerp.com-20120831105117-mjm99cs7ko8pmkfq --- addons/sale/sale.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sale/sale.py b/addons/sale/sale.py index 9628c4fdc91..a407be80c99 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -1035,7 +1035,7 @@ class sale_order(osv.osv): def cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("Sale Order for %s cancelled.") % (obj.partner_id.name), subtype="cancel", context=context) + self.message_post(cr, uid, [obj.id], body=_("Sale Order for %s cancelled.") % (obj.partner_id.name), subtype="cancelled", context=context) def delivery_send_note(self, cr, uid, ids, picking_id, context=None): for order in self.browse(cr, uid, ids, context=context): From d621d8fae3ca98ccd0cfffd56413459421069655 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 31 Aug 2012 16:24:22 +0530 Subject: [PATCH 163/581] [IMP] improve code bzr revid: fka@tinyerp.com-20120831105422-m2unzh8mezt4oan4 --- addons/stock/stock.py | 2 +- addons/stock/stock_data.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 5e8b5dfaf5d..3011fc6c6c2 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -1398,7 +1398,7 @@ class stock_picking(osv.osv): def ship_cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("%s has been cancelled.") % (self._get_document_type(obj.type)), subtype="cancel", context=context) + self.message_post(cr, uid, [obj.id], body=_("%s has been cancelled.") % (self._get_document_type(obj.type)), subtype="cancelled", context=context) stock_picking() diff --git a/addons/stock/stock_data.xml b/addons/stock/stock_data.xml index a24502ab361..976c89ad06f 100644 --- a/addons/stock/stock_data.xml +++ b/addons/stock/stock_data.xml @@ -181,7 +181,7 @@ watch your stock valuation, and track production lots upstream and downstream (b close - + From 6c04925c0f3521a5a99586f688727f2be5f6340b Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 31 Aug 2012 16:28:55 +0530 Subject: [PATCH 164/581] [IMP] improve code bzr revid: fka@tinyerp.com-20120831105855-crs13rnqi2uztgha --- addons/purchase/purchase.py | 2 +- addons/purchase/purchase_data.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 81b851eb2a2..16b827c1323 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -766,7 +766,7 @@ class purchase_order(osv.osv): def cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("Purchase Order for %s cancelled.") % (obj.partner_id.name), subtype="cancel", context=context) + self.message_post(cr, uid, [obj.id], body=_("Purchase Order for %s cancelled.") % (obj.partner_id.name), subtype="cancelled", context=context) purchase_order() diff --git a/addons/purchase/purchase_data.xml b/addons/purchase/purchase_data.xml index 1cc3b3b014b..a84564b2360 100644 --- a/addons/purchase/purchase_data.xml +++ b/addons/purchase/purchase_data.xml @@ -67,8 +67,8 @@ You can also manage purchase requisitions, see also the Purchase Settings.received - - cancel + + cancelled From d32908a359dcba66b032ee4dcfca7dd2142b94d6 Mon Sep 17 00:00:00 2001 From: "Randhir Mayatra (OpenERP)" Date: Fri, 31 Aug 2012 16:30:00 +0530 Subject: [PATCH 165/581] [IMP]make changes for the calcelled state into event bzr revid: rma@tinyerp.com-20120831110000-cd022yy58aken0iw --- addons/event/event.py | 4 ++-- addons/event/event_data.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/event/event.py b/addons/event/event.py index c3284695ab9..feb0aed9d46 100644 --- a/addons/event/event.py +++ b/addons/event/event.py @@ -269,7 +269,7 @@ class event_event(osv.osv): def button_cancel_send_note(self, cr, uid, ids, context=None): message = _("Event has been cancelled.") - self.message_post(cr, uid, ids, body=message, subtype="cancel", context=context) + self.message_post(cr, uid, ids, body=message, subtype="cancelled", context=context) return True def button_draft_send_note(self, cr, uid, ids, context=None): @@ -366,7 +366,7 @@ class event_registration(osv.osv): return True def button_reg_cancel(self, cr, uid, ids, context=None, *args): - self.message_post(cr, uid, ids, body=_('State set to Cancel'), subtype="cancel", context=context) + self.message_post(cr, uid, ids, body=_('State set to Cancel'), subtype="cancelled", context=context) return self.write(cr, uid, ids, {'state': 'cancel'}) def mail_user(self, cr, uid, ids, context=None): diff --git a/addons/event/event_data.xml b/addons/event/event_data.xml index 65713628de9..bc16fc08aee 100644 --- a/addons/event/event_data.xml +++ b/addons/event/event_data.xml @@ -21,8 +21,8 @@ close - - cancel + + cancelled From 6c56f95e869f21d5eaecb3c3eda1de831e1d5499 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 31 Aug 2012 16:34:43 +0530 Subject: [PATCH 166/581] [IMP] improve code bzr revid: fka@tinyerp.com-20120831110443-55nxhelq1dfl073j --- addons/idea/idea.py | 2 +- addons/idea/idea_data.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/idea/idea.py b/addons/idea/idea.py index a20ddf51414..ff55e6afbc3 100644 --- a/addons/idea/idea.py +++ b/addons/idea/idea.py @@ -67,7 +67,7 @@ class idea_idea(osv.osv): def idea_cancel(self, cr, uid, ids, context={}): self.write(cr, uid, ids, { 'state': 'cancel' }) - self.message_post(cr, uid, ids, body=_('Idea canceled.'), subtype="cancel", context=context) + self.message_post(cr, uid, ids, body=_('Idea canceled.'), subtype="cancelled", context=context) return True def idea_open(self, cr, uid, ids, context={}): diff --git a/addons/idea/idea_data.xml b/addons/idea/idea_data.xml index a4cd4970511..17401f72f98 100644 --- a/addons/idea/idea_data.xml +++ b/addons/idea/idea_data.xml @@ -26,8 +26,8 @@ open - - cancel + + cancelled From 5ec28dcd8933cb8ef42d3349d7651e66b02d46f5 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 31 Aug 2012 16:41:15 +0530 Subject: [PATCH 167/581] [IMP] improve code bzr revid: fka@tinyerp.com-20120831111115-fqoapz8uroxsdddm --- addons/procurement/procurement.py | 2 +- addons/procurement/procurement_data.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py index 4c60316ffb6..d59a894bc2b 100644 --- a/addons/procurement/procurement.py +++ b/addons/procurement/procurement.py @@ -508,7 +508,7 @@ class procurement_order(osv.osv): self.message_post(cr, uid, ids, body=_("Procurement has been set to ready."), subtype="ready", context=context) def cancel_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Procurement has been cancelled."), subtype="cancel", context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been cancelled."), subtype="cancelled", context=context) def done_send_note(self, cr, uid, ids, context=None): self.message_post(cr, uid, ids, body=_("Procurement has been done."), subtype="close", context=context) diff --git a/addons/procurement/procurement_data.xml b/addons/procurement/procurement_data.xml index bbcaa33d2a1..8f4e945a7de 100644 --- a/addons/procurement/procurement_data.xml +++ b/addons/procurement/procurement_data.xml @@ -47,7 +47,7 @@ running - + From e5b99dca25aea687272e0e09d73d9ac034acd14c Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 31 Aug 2012 18:11:23 +0530 Subject: [PATCH 168/581] [IMP] change close bzr revid: fka@tinyerp.com-20120831124123-3fq363k7b5bcnuix --- addons/procurement/procurement.py | 2 +- addons/procurement/procurement_data.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py index d59a894bc2b..94d83675df1 100644 --- a/addons/procurement/procurement.py +++ b/addons/procurement/procurement.py @@ -511,7 +511,7 @@ class procurement_order(osv.osv): self.message_post(cr, uid, ids, body=_("Procurement has been cancelled."), subtype="cancelled", context=context) def done_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Procurement has been done."), subtype="close", context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been done."), subtype="closed", context=context) procurement_order() diff --git a/addons/procurement/procurement_data.xml b/addons/procurement/procurement_data.xml index 8f4e945a7de..bd44f0caee5 100644 --- a/addons/procurement/procurement_data.xml +++ b/addons/procurement/procurement_data.xml @@ -50,7 +50,7 @@ - + From 596debf67e4792755c72b629cd481d7cdb653292 Mon Sep 17 00:00:00 2001 From: "Randhir Mayatra (OpenERP)" Date: Fri, 31 Aug 2012 18:17:22 +0530 Subject: [PATCH 169/581] [IMP]make changes into account data for subtype bzr revid: rma@tinyerp.com-20120831124722-2u9fcx10gnrcfsl5 --- addons/account/data/account_data.xml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/addons/account/data/account_data.xml b/addons/account/data/account_data.xml index 589683055d8..fe0c864e72f 100644 --- a/addons/account/data/account_data.xml +++ b/addons/account/data/account_data.xml @@ -518,7 +518,6 @@ - Account Reconcile account.reconcile @@ -554,8 +553,6 @@ - - @@ -563,7 +560,7 @@ Invoice account.invoice - + new From 84fd3b3a35767140a0fcbc0aebb5a4439fcd4e79 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 31 Aug 2012 18:17:44 +0530 Subject: [PATCH 170/581] [IMP] change subtype close bzr revid: fka@tinyerp.com-20120831124744-uup75dwshj5nmf2n --- addons/purchase_requisition/purchase_requisition.py | 2 +- addons/purchase_requisition/purchase_requisition_data.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/purchase_requisition/purchase_requisition.py b/addons/purchase_requisition/purchase_requisition.py index 67905f35922..5a5f669b1a1 100644 --- a/addons/purchase_requisition/purchase_requisition.py +++ b/addons/purchase_requisition/purchase_requisition.py @@ -97,7 +97,7 @@ class purchase_requisition(osv.osv): self.message_post(cr, uid, ids, body=_("Purchase Requisition has been set to draft."), subtype="new", context=context) def done_to_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Purchase Requisition has been done."), subtype="close", context=context) + self.message_post(cr, uid, ids, body=_("Purchase Requisition has been done."), subtype="closed", context=context) def cancel_send_note(self, cr, uid, ids, context=None): self.message_post(cr, uid, ids, body=_("Purchase Requisition has been cancelled."), subtype="cancel", context=context) diff --git a/addons/purchase_requisition/purchase_requisition_data.xml b/addons/purchase_requisition/purchase_requisition_data.xml index 11ac73a6dd2..11dd5f45170 100644 --- a/addons/purchase_requisition/purchase_requisition_data.xml +++ b/addons/purchase_requisition/purchase_requisition_data.xml @@ -7,8 +7,8 @@ model="ir.values" name="set"/> - - close + + closed From de9f0c9777800cb398afddc8466c6a5c9ea3056e Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 31 Aug 2012 18:22:01 +0530 Subject: [PATCH 171/581] [IMP] change subtype close bzr revid: fka@tinyerp.com-20120831125201-gomz1f0hy8wid1rh --- addons/stock/stock.py | 2 +- addons/stock/stock_data.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 3011fc6c6c2..0bc455a149c 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -1394,7 +1394,7 @@ class stock_picking(osv.osv): 'internal': 'moved', } for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("Products have been %s.") % (type_dict.get(obj.type, 'move done')), subtype="close", context=context) + self.message_post(cr, uid, [obj.id], body=_("Products have been %s.") % (type_dict.get(obj.type, 'move done')), subtype="closed", context=context) def ship_cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): diff --git a/addons/stock/stock_data.xml b/addons/stock/stock_data.xml index 976c89ad06f..a7e2ffdd562 100644 --- a/addons/stock/stock_data.xml +++ b/addons/stock/stock_data.xml @@ -177,8 +177,8 @@ watch your stock valuation, and track production lots upstream and downstream (b moved - - close + + closed From e44d125479d9208d3d2d9b0b64b655b530a07eae Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 31 Aug 2012 18:47:12 +0530 Subject: [PATCH 172/581] [IMP] Add data of subtype in mrp, mrp_repair & mrp_operations bzr revid: fka@tinyerp.com-20120831131712-dz5b5isq797v5xfc --- addons/mrp/mrp.py | 10 ++-- addons/mrp/mrp_data.xml | 33 ++++++++++++++ addons/mrp_operations/mrp_operation_data.xml | 34 ++++++++++++++ addons/mrp_operations/mrp_operations.py | 10 ++-- addons/mrp_repair/__openerp__.py | 1 + addons/mrp_repair/mrp_repair.py | 14 +++--- addons/mrp_repair/mrp_repair_data.xml | 48 ++++++++++++++++++++ 7 files changed, 133 insertions(+), 17 deletions(-) create mode 100644 addons/mrp_repair/mrp_repair_data.xml diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index c667daadbec..a9f6290c58a 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -1047,27 +1047,27 @@ class mrp_production(osv.osv): # --------------------------------------------------- def create_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Manufacturing order has been created."), context=context) + self.message_post(cr, uid, ids, body=_("Manufacturing order has been created."), subtype="new", context=context) return True def action_cancel_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order has been canceled.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="cancelled", context=context) return True def action_ready_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order is ready to produce.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="ready", context=context) return True def action_in_production_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order is in production.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="production", context=context) return True def action_done_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order has been done.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="closed", context=context) return True def action_confirm_send_note(self, cr, uid, ids, context=None): diff --git a/addons/mrp/mrp_data.xml b/addons/mrp/mrp_data.xml index 0bbf2d3b64c..6ee7cc82dd2 100644 --- a/addons/mrp/mrp_data.xml +++ b/addons/mrp/mrp_data.xml @@ -27,5 +27,38 @@ From the Manufacturing Settings, you can choose to compute production schedules 1 + + new + + + + + ready + + + + + production + + + + cancelled + + + + + closed + + + + + + + + + + + + diff --git a/addons/mrp_operations/mrp_operation_data.xml b/addons/mrp_operations/mrp_operation_data.xml index ff83fdc7e8b..e2d7f9f0a56 100644 --- a/addons/mrp_operations/mrp_operation_data.xml +++ b/addons/mrp_operations/mrp_operation_data.xml @@ -30,5 +30,39 @@ done + + + new + + + + + started + + + + + pending + + + + cancelled + + + + + closed + + + + + + + + + + + + diff --git a/addons/mrp_operations/mrp_operations.py b/addons/mrp_operations/mrp_operations.py index ee2547bc7df..a18eb4141ba 100644 --- a/addons/mrp_operations/mrp_operations.py +++ b/addons/mrp_operations/mrp_operations.py @@ -224,7 +224,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been created for production order %s.") % (prod.id.name) - self.message_post(cr, uid, [workorder.id], body=message, context=context) + self.message_post(cr, uid, [workorder.id], body=message, subtype="new", context=context) return True def action_start_send_note(self, cr, uid, ids, context=None): @@ -232,7 +232,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been started for production order %s.") % (prod.id.name) - self.message_post(cr, uid, [workorder.id], body=message, context=context) + self.message_post(cr, uid, [workorder.id], body=message, subtype="started", context=context) return True def action_done_send_note(self, cr, uid, ids, context=None): @@ -240,7 +240,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been done for production order %s.") % (prod.id.name) - self.message_post(cr, uid, [workorder.id], body=message, context=context) + self.message_post(cr, uid, [workorder.id], body=message, subtype="closed", context=context) return True def action_pending_send_note(self, cr, uid, ids, context=None): @@ -248,7 +248,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order is pending for production order %s.") % (prod.id.name) - self.message_post(cr, uid, [workorder.id], body=message, context=context) + self.message_post(cr, uid, [workorder.id], body=message, subtype="pending", context=context) return True def action_cancel_send_note(self, cr, uid, ids, context=None): @@ -256,7 +256,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been cancelled for production order %s.") % (prod.id.name) - self.message_post(cr, uid, [workorder.id], body=message, context=context) + self.message_post(cr, uid, [workorder.id], body=message, subtype="cancelled", context=context) return True mrp_production_workcenter_line() diff --git a/addons/mrp_repair/__openerp__.py b/addons/mrp_repair/__openerp__.py index da4070d6210..13a6e81e141 100644 --- a/addons/mrp_repair/__openerp__.py +++ b/addons/mrp_repair/__openerp__.py @@ -43,6 +43,7 @@ The following topics should be covered by this module: 'data': [ 'security/ir.model.access.csv', 'security/mrp_repair_security.xml', + 'mrp_repair_data.xml', 'mrp_repair_sequence.xml', 'wizard/mrp_repair_cancel_view.xml', 'wizard/mrp_repair_make_invoice_view.xml', diff --git a/addons/mrp_repair/mrp_repair.py b/addons/mrp_repair/mrp_repair.py index c1ac8f809ce..44624044090 100644 --- a/addons/mrp_repair/mrp_repair.py +++ b/addons/mrp_repair/mrp_repair.py @@ -571,40 +571,40 @@ class mrp_repair(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _("Repair Order for %s has been created." % (repair.product_id.name)) - self.message_post(cr, uid, [repair.id], body=message, context=context) + self.message_post(cr, uid, [repair.id], body=message, subtype="new", context=context) return True def set_start_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _("Repair Order for %s has been started." % (repair.product_id.name)) - self.message_post(cr, uid, [repair.id], body=message, context=context) + self.message_post(cr, uid, [repair.id], body=message, subtype="started", context=context) return True def set_toinvoiced_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _("Draft Invoice of %s %s waiting for validation.") % (repair.invoice_id.amount_total, repair.invoice_id.currency_id.symbol) - self.message_post(cr, uid, [repair.id], body=message, context=context) + self.message_post(cr, uid, [repair.id], body=message, subtype="pending", context=context) return True def set_confirm_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _( "Repair Order for %s has been accepted." % (repair.product_id.name)) - self.message_post(cr, uid, [repair.id], body=message, context=context) + self.message_post(cr, uid, [repair.id], body=message, subtype="accepted", context=context) return True def set_cancel_send_note(self, cr, uid, ids, context=None): message = _("Repair has been cancelled.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="cancelled", context=context) return True def set_ready_send_note(self, cr, uid, ids, context=None): message = _("Repair Order is now ready to repair.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="ready", context=context) return True def set_done_send_note(self, cr, uid, ids, context=None): message = _("Repair Order is closed.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="closed", context=context) return True mrp_repair() diff --git a/addons/mrp_repair/mrp_repair_data.xml b/addons/mrp_repair/mrp_repair_data.xml new file mode 100644 index 00000000000..337a4113382 --- /dev/null +++ b/addons/mrp_repair/mrp_repair_data.xml @@ -0,0 +1,48 @@ + + + + + + new + + + + + started + + + + + ready + + + + + pending + + + + accepted + + + + cancelled + + + + + closed + + + + + + + + + + + + + + From aa216774eab92cd4334a9bbbdbf50293b26d5565 Mon Sep 17 00:00:00 2001 From: "Randhir Mayatra (OpenERP)" Date: Mon, 3 Sep 2012 11:47:13 +0530 Subject: [PATCH 173/581] [IMP] make changes into account data for the subtype bzr revid: rma@tinyerp.com-20120903061713-xuhcfdqi4e7cp6qf --- addons/account/account_invoice.py | 2 +- addons/account/data/account_data.xml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index e8e935a9505..5f81cbfe857 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -1306,7 +1306,7 @@ class account_invoice(osv.osv): def invoice_cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("%s cancelled.") % (self._get_document_type(obj.type)), subtype="cancel", context=context) + self.message_post(cr, uid, [obj.id], body=_("%s cancelled.") % (self._get_document_type(obj.type)), subtype="cancelled", context=context) account_invoice() class account_invoice_line(osv.osv): diff --git a/addons/account/data/account_data.xml b/addons/account/data/account_data.xml index fe0c864e72f..bf3b3152552 100644 --- a/addons/account/data/account_data.xml +++ b/addons/account/data/account_data.xml @@ -569,12 +569,12 @@ paid - - cancel + + cancelled - + From 23007e8aebbd269abfbf3f62f27e8cbbcecafb33 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Mon, 3 Sep 2012 14:27:28 +0530 Subject: [PATCH 174/581] [IMP] Add picking_in & picking_out object in stock bzr revid: fka@tinyerp.com-20120903085728-vx5hbkug5527nolo --- addons/stock/stock_data.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/stock/stock_data.xml b/addons/stock/stock_data.xml index a7e2ffdd562..3539d5b5056 100644 --- a/addons/stock/stock_data.xml +++ b/addons/stock/stock_data.xml @@ -171,27 +171,27 @@ watch your stock valuation, and track production lots upstream and downstream (b Mail: mail.message.subtype --> - + moved - + closed - + - + - + - + - + From b7f7ace8ffb67136b3588897654b72186aec54b4 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 3 Sep 2012 16:02:21 +0530 Subject: [PATCH 175/581] [IMP]: base: Changed photo of contact so it should look like avtar bzr revid: rpa@tinyerp.com-20120903103221-5wi9nq1h3utpd3rl --- openerp/addons/base/res/res_partner_demo.yml | 46 ++++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/openerp/addons/base/res/res_partner_demo.yml b/openerp/addons/base/res/res_partner_demo.yml index ebbaacb319c..8693099aa58 100644 --- a/openerp/addons/base/res/res_partner_demo.yml +++ b/openerp/addons/base/res/res_partner_demo.yml @@ -5,7 +5,7 @@ use_parent_address: True function: Service Manager email: tang@asustek.com - image: /9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCACCAFcDASIAAhEBAxEB/8QAHQAAAQUBAQEBAAAAAAAAAAAABQAEBgcIAwIBCf/EAEEQAAEDAwIDBAYGBwgDAAAAAAECAwQABREGIQcSMRNBUWEUIjJxgZEII0KhscEVJCU0Q2JyFjNSY4KywtFTkqL/xAAaAQABBQEAAAAAAAAAAAAAAAADAAECBAYF/8QAKxEAAgIBBAECAwkAAAAAAAAAAAECEQMEEiExUQUiQXGxEyMyMzRhgcHh/9oADAMBAAIRAxEAPwDWimEmeF/+WOUn5ColeGEfogIBHM264CPDoampICoyiQOqevlUbvIaRbpnaLQkNPKWrJ6J5dz7tqlYNobRXY0Rp6RLebYa9HypbigAOneahV84v6Nt7PocGai4zGXFHlbUEt5BzjmP5VmDjrxgf1dqV2BBUU2K3nsY6A5gPKGynVeOcHHgKiWmdQobfUsMNtNEAFDKdyRsNzuT51Fyb6Esfk1zD46RSibLlWJwoUkBPYPcwznpnGDUw09xD0bqKLbkQbzHRI7YJLDyuRQVzdN9s1klOpkOx0tOtJ5Cdmye/wB3QUFvdyTBfiP+sx2boc9FWrIUNgeg6Y781FSYtiZv+Q0RbJIx0eNOQj9ckebCfxqmOCPEBE2U9om4yu0edhiZbitWVcqQOdonvIThQ78ZHdV3JA9MV5xx+VETsG4gWa0Db4238U/7qZWOMDd5gx/DH+6is1P7OZ8nj+NNbFte5Yx/D/5VIYfSoYctEdOPZH5mlRNCAqC2PKlSTJOB9WAW2gsDAdx99QzimHU6B1gYyeaQm3vLbAGSSGl7DxqZPqSGFEjIQ7v86GXFTaZ8pC083OhJHwO9QCM/KBt3DfOeUq2O9FtMuOSri23HirkLGCQj8/KuuobYGOIl0szTSXUt3N5htIPqkdqoJwfDGKuLSsCzacaDMOK2JC0guqQkrKj8e6q+bNsVLtnQ0ekedtt0kDbfpbUFxQhMTsmgNyVj1U+8jvozK4bR34yEypa1SQc9okYAPkDU007ODxUkh2PtsHWeUK91OJk5TMtDUWAq4OqPrZcDaU/Oqs803Hg7GP07DHtWVvpeLN0px00in0tZQqaylBGxUkkoUnzzkjzzW90/vKfOP/1WNpFjl33i/wAP57URUfs7iQ8hRzyhvDmR4jANS7iV9I7U2ndUz7HF03b4j0FRYLsp5S+cbELAGOowfjVvSSeTGr7OBrsSx5nFLg0XMH7Pb8nz+NcLGjF6ln/K/wCVYuunGjidfWFtm+rjMqUVBuDGCMf6sZ++pZ9FvWl7Y4spi36bPkM3mOqPzy3ioh0esjAPTOCPjVt45JWyltfZsJn90b91Kvrf7o37qVDCMZylq7KYnl2SQc0FvDji5SVKbUkuM+sB1Tt1ozKBzOHdyg0Gu6VqkRsA8ymM/DlprGZh3i3pNNg1gqUiMUPx5BK1gHDqSRhQ+BB+JoxpoPS4fZx1htalE85SCavTinolGrbFJcjKSi4RkktgjZ0AZCT4Hrg+eKo3RhW23zJGeVeCO8ZrlZ4uPD6Nb6fnhnluXb7+f+h1bE+3oQ6u4qfClBPrJSCnfqcADyp3MsMefcEqndrhSe2ZGSEqJ6ggdab3+UmQ+hl50c6dyjPKPAHzpxPuMpVtSeV0tNFtCOzaJBWTj2j069AfGhVJy3Lo6TjFRLJ4R22INQNhvkJt0d5xHjlSeTP/ANVC/pR6cjMa0tGo/RkLTcoIaWop/itdPiUkfKpnwJgui93ma4SUtQg0ST9pSgcfIUR+kNZHr7wyzEC/TIAEpns2ytXq5CgAN9wTXR0Xsha8syPqsktU/wBq+hnaOEloFAAGOgFD1XBdsurFwjOhuTDeQ+0c49ZJ5h+FMWmL6hCFSHFIb7uzRzpPlkbU6Z0rPnLMowJ7iCrJV2ZCRn8q6NlB5om+NL3Vi+aTtd4YV9TNjIfSf6hnFKqh4WzdUWjSkK2vzYUaFGb5W0TCeZI7sHwpULbQLemW9JdPpMpGBhxnPyoPcZC8wHgBkN8n4ijTqkmev1DhcY49XpsDUM4h6w05orTtuvOopaWGUKUlDSU8zshQPstp+0fuHeRQwlER4jazj6Hsfpi0odnTZbUSAws4Djqz1PfypGVH4DvqhIS5MG5S1zY/Z4lOIWUjCQebOCO7qCPI1XXGDXd117rRV8UXIsSOvFtjc2fRkA5BONiskAk+4dBWgdAPWziPpBq9xexYvLIDFwZ+ypwD7Q8FDdKvDbuqOXSyzY6j+JHR9P1McGX3cJ/EFFaZoalwpK2pLeMON4zgeI7x7/CiHokqQlp64Tnn0p9ZPaHbPiB0FNp1gZt1w5SJMNwHdCD093iK9wOVzVmnbS3IddXcbqzFy4c+oQpS9vDlSQffXNxwk3sZo8upjjxudXwXvoK0MWmwhiMpt1TzXbPuNqCgpavMdwGB8KMME5iZ6FCh+NYciT7tZpK12ufMgvsLU0sMPKQQUqKSMA+INWRofjzf7O+wxqVr9MwkbBYwiQkeSuivcfnXVWLakkYqcnkk5S7ZZ2reF9jlPP3a1uP2eYXMqXEXyhSuuSn2T8qF/wBn9YRXExZWqHXoyRutmMhtZH8yu734qfxLxBv2lG7zbHe1iS0h1pRGDg9xHcQcgjxFdbdyOXN5t0BSFslKgehFRt9DbVXRHIGh7Q7GZlzrFOuy3E5S7MllwEeQJwPlSqaad5WdOxYaFlYjrcZBJycJUcfdilT2xbUV1xo482/Ra022yIau2og2ULbK/qYwxgdqR1V/IN/Eisjasv8AetT3Vy86iuT8+Y5kBTh9VtOc8qE9Ep8hTNS08ylrUVKUSVKJyST301kuc2cdKNGCRJsHqP1hHcD91SzhPrSVoTV7F2RzLgO4ZuDCf4jJO5A/xJ9oe4jvqJPY504HXIr0n1k4OxokW4ytD/A3rKiWrUdrYeymRHebS7HfbODyqGQpJ8wag6tPRtL8T9L3693qBDtEV11wSpT6WsulPKhHKT13G4237qjX0TNZNzbPI0VcHgJMAKfgFR9pgn1kD+gnOPBXlUc+kRN1Czru13qY43+iHB2dtaxu12ZClhaT9pRwc9MYHdVvNixZYrNXKJQ1GSEXjT4YJ4wQzpzjBqOGOVcSRLM+MpBBBbfAdBB6EZUR8KiNwcU7bzIU2G1ZyUg5xUv44202682J5vKocm2Zhr6jsQ4pSEA/yhzlHkE1BVqKoq28nBGMVWyR2yaBJfE0j9Ge7dvwidiOqJLF0cQnPcCEqx8yfnVmRJ8dic5IcUAgNHO9UHwBmoh8PG0qdCFyLjIXgnryhKfyqbrvKHSr9YT2TR9ffqrwPlVCT9xZWK42WBZZBTaVOOKR2j0hx3dagQCrptSqCN6hZbSGRJTlsbjPjSptw6wsyCZBUdzSLmaYhzIya6IUauWAOpICsGvrB5k9pjBV0HgP+68bKGO8V6RlByBkdSKcQY0vd5undRQb7bz+sQ3g4kZwFj7SD5KBIPvq2vpN3aLemtH3S3LKoEqK5LaOegcUkEHzBTg+41TKMKRkEEGjCLm9OssKxSFczUNx5UZR+wHeUqT7uZPN71GjQl7XHyRrmyxeIF3jak4MaOlpHLcLFJctcseKFI5mljyIbx7warZbnKzmu0uU+xa3IaV8rbkhtTiO44zj5E/fQ1939WVjGxHfQpO2OWpobTcRekLa++24XHULeyHCPaWcY+GKPt2KGhh1nsir0oczpJOeUb/OhvCO7MyNHQIbyJSltLdZS6Gvq+UKyBnx3qQu8r/qKdcSknJ8MjbBrM7pRzzUvP8AbO+qlijt8ANGmbfgK5HjtsrnIJFKpOhAEdOHObYdRSqq3K+GWE1XKMm57j0r20s+yrqKblW4376+rOFhWeoxWrMyPkL9anCFZxQ1Du+adIXkVJMQ5S52asn2D18vOnDbhQ6laTgg560x589a+Mu4PYqO/VB/KnsQbuL3NHyD7Sk+7qOlMXljssKBOVdM1zefJhISNyHEgg+8VzfV7KT5mnbsVl48FCpfDf1Egq/STqevT2T+FH5cEvTC8pIO+3rYqJ8CVKc0JcEI3U3cSQM/5aDUscmMBzC+dvf7aSKyet3LPKvJotJTxRvwE4rKxGSCjcedKvUR1KmgpshQPeDmlQ0nRJtWY+C8rSPM19eJLiB76btLy8n410UrLqT5VqzNjhJ7qcMr2polWdq6tqxUkxDoKzXh8cwB6HuIrwlVeirupxCXJUpLaFe32qObz3605kL+sV/KAKHvYCkK8FpP312cUcq3zv18aYai/uAUZDXDx6Sfakz3Vf8AqEpH4Gpc6lJVsnNQrgPcOfh25FQ8AuNOdCk7bBQSoH471KHpslCiQ79wrJ62/t5fM0ekX3UaHaGWhlSELaV/iRtn4dKVDhcZOTl38KVQjKVBHFWZNa/vR7jXVP8Aef6aVKtajMnZrvrq3SpU6Edk9BX09fhSpVITOL3RH9afxrovrSpUwi1/o5k4v6c7YZOPiqrGm9VUqVZX1L9S/wCPoaDQ/koFy/aFKlSoEeg8uz//2Q== + image: iVBORw0KGgoAAAANSUhEUgAAAF8AAABRCAYAAAC0RnqFAAAgAElEQVR4Xu2dB3QcdpXuv+kajTTqXbIk997tOHbskDgOIQktCYENnWxooSxLgAf7HrDU5bEQYAksLQRI2YT0QqpDEttJbCfuvduyem8jjabo/e5/pOB9C7ucPSvz/M5Ojo5i2RrN3P/93/vd7373yjPKQ//9+ItYwPPfxv+L2N390Ikx/hl3KT48rFAo5H7YMP+flR3Sr379S33zm9/U6dOnFQgE3N95vV51dfUpK8uv0ZSUSqX4+MMT8dfy+XzyeDwaGUny2f7MF3nY5bWv+/1+9+Ed9fK1lMrKyrRs2TJFozl6/WWXqrS0VEuXLlUwnMNzjCgYDLrvHR31yGM/wJ6L/7ziyc/CY0KMn4gnFQj6lcZ4Xl/mjSR4s4GgTx/96Ef10CMPqq2tzRmjv7+fjyHl5GQpmUw6A8eHRl5762ZU+xg3shkrjbHG/zz+D8/8d/wDhcNhZ+DSsmLl5uaqpqZKU6ZM0Re/+EWVV1S515PmucwxzPip0bR8Xh9f47MncxAT/ZgQ4+M86u8bUC4eNzw0pCwMMTjY5974Lbfc4rw/kUgoOzvbGdz+37wwFospHk/J7/2D540bNeOhGB7DBoIhdzPS6fRrt8b+nf058zWvIpGIhoYG3U3IyrKDHVFdXZ2+/vWva9bMmaqvr+d5gmOH6MncHrw/keS1+DO3caIfE2L8keG4guZRGMLeVCIZ15e+9CV997vfVV5enkLhoDO4hSELN2bIgYEhF0pCoQCxMPM1+xjHA+PebwZJpv5tWDDDuX87ZkT72Xbo7lBGLUx5VFBQoPnz5ys3O6ybbrpJ561YoSEO3OsLvBYaJ9rgZz7/hBg/EbcQE1QSA/sJNU89+aTe8573OO+zsDIUHyYOR52nD3EzzMjJ5Cje73MGDPiCY19LOk+3x1jkcf+fyjj82NczYenMsOP1+zQSjzvjW+hJ89z2/3a7LMzlcfPM+Dd+4uPKz88nPHJX+B6Xk7glZ+sxIca3sNPT3a38wjx3AO985zu1ceMLzhAu3OREnMf39PTwhuOEBt9rN2BkxGKuc2D38acedhjeM8LTmYeR5HRCoaB7zng88VqidrGdgy4piGr69Om68cYb9dZrribpE5Z4XdxTd0Bn6zEhxk+ZhxNr7bF1yxa94Q2vJ+Zn4q/F+eGRuDuITAxPcyB/8O5IJEuD/cP/5v2PgZGMt+P54+diAYjL5B52WBbycWRifiaveL1+h6iSiTQHwW0wz05nwtDcuXP1d3/3d7rs8iszN27c8GcH7EwQ1MSHzJMsxHz4wx/Wr399mzOAJcG+vj75An5nCEMadgjJZAqPCzivtIffi7FIxJmYn4GU9v32Yc8Z8Iy6vzeD2Z/NW8dzhxncPNiMawcezsp2B2Lfm8kzdugpFRcXq6W1TR//2I36+je/5ZzCYpuFq2BWBhpP9OO/1PPHk2OS6x3Ae04e3qXrrrtOO/Yd1HACFOMweFqeSFQjQ8NKcQP8xBhDF+7v+OzD8EQK/t2IspRQNMurXJJwACMPg+8tXyRBggEOJMKBRThAnzeoeBJjD6UVG+EA/dwsLN4fiyuZ9jpjejmw9Ag3Cq8fSHgclrdDMwBwxx13aOWqFe7A7OujQE53w85MNBNwEhNifPyON5vWy8+v17ve+y41tnXJ48/ijeGTQLk0ODrg9yqLDzskw9XOo/FOvz+IfRIqiEZUXZyn8oJc0AmeSBwfGCJBkyMiFEkevDeN948khvn6iPqGkuoZTnAIoxpy3u/VAAfRMzBIPPIqJzdbQQ4tDvzsHuB07YZx4FYPfPsfv6V3vetdDmoaSpLnHDa+QcGAL63bb/uZPnLjx5QGyvmDYPrhQeJ1QjlYvAiUUYxhswKEDRJnNgnSDGHGD3mTKimMqqq0UEW5EWe0NCEogbEN/RTnFhM+qAlGhkTwUZzw09YX04nmNjV1dOhUywCG5DaM+tTZP6C+2JArtILclu6uTiW4mZZrLFTZZ7udVnEXl5S4n+MhT5yznp8gxAQDXn3r61/RF7/yFUXyi5Sk6h0dGVQu9MG08gKVFRWqtCifsEIS5iNKPgiHstxVD/hT/DmsPJJvmNuRThCnCRc+DtFuRyiY42I+R6IAh5YmTHT0Duhow2k1cADtQz519Q3i+VLXwLBau3ucV9v3DvT3cVu4MeQaK8YMXk6dOlW/vuN2LViwgJ8B5TCWzs/JsJMmgfpwnpv+9m/0s1t/pWh+gfq6u1SIkSdXFGvOpFLl5eYoPxJUNm6dkx1UlIRniMaMYp8j3IIcjB9yoSCTXIM8qYUKXy6FGrE+FMBQhPhYbFh9/YPUDOQRwk4nHr9n/2GdJNx1DI6oobVTg4SkrEi2+35LxD09vZlkj6dHIrm66567tfqCCx1KO6eNT24jHg+7OPq7p552Vz7e26MFU6o0t76cOB5ViBCQRRWfTWGVGw4pbHGdasfBQSpQS4ZZ0AgBagB3GwhN5rlBPjx5+Xwv4Ql87iEMGZeUJBl7+bkGLdtjfdqx95AOn25VWyxJGOoiHJF3CHEW2tIpr+OWunhNPg40khPVz395q9atuyyD0kBj52zYod5Uf0+X3vSmK7V123aSZ67CIJd1y+Zoalm+e8N+LBXyE+s5gUh2FoYG7VgM5l1nhzIe7hAQX7PDtIQctsPAgKnRzNd9HECQA/CDegylGGRNWkKPD6ips1fHWnvU0DWoEx09au7o1QAhxsi0FDmpG8M3N7VqBM/Ph3b49ndv1jXXvN0RbvZ857TxOzpademll+jgwYMqLSxUWSSgN12wUCUhEqQMOlqStXhvMZxQwp/9GNc83jPcq6xQ9liYIKaTFM3DPZyCn0OIePB4q4ot7HCQKb53lJthFIE7LA7eku3x9l7tOdGikxxED4ioPzaiIeDt0DDJGw8/eeq02knAUW7Sl77yVX3wgx8B6WQo6nPX+J6kWo81a92b3qzDLUcV9YzokhmTddGypeqKk3Tx3tEER4D3R4n7kXAG5zt+BgMaNeAfg6MBjGsHReR3tIM9vCRYfxCPz4ooQBHlBSEZPHRGA+KmBxPycKhtePe+Q8cxekJdgykdaGhWggMb6u1XZ1cXX4+p4XSLvBz6PfffrzUXXqQEkNZ/LuN8jyeltuPNuvJt12jvyX0qDXt11eL5mju5ToOAQx9eZ8VOKDCqnCwgZgiDc9VDWWEXk62yNd7Ghxeb0c3rXWbl4cP7LYf4AoQg8L4fY3o4oHHK2fKGdzTE7UppmOc52dii5vZuIGdCR0m8XUN4fn/MoZ/Glhad4kAMin7vhz/UB66/gQIv+RqlfE6iHTN+f1u/rn77tXp5z8uqyQvoHSvPV1k0W6PZUAeDVmlSwYJ08nOyHdoZT6wW2+0QLIaPV5w+4GaI6tdCkt0EHwdmRreYfyaP76F6Nq7N54uonzrAy7/r6u7T0WON6hyI63TPgE6SeGP8v5/E3QH5d/DQMbV2dukr3/iGbvrM5zRC3rCfcc6GnSTG9w6N6m3XXqv1m57QjIp8vf2C85VPbB/NzZKPDlc6lXAIxkJOBPogzEc2NECY5Esgd3F+nM+3kBQkzBi0dJ0uF6KoQvl+o4PtVhhNkc3zBy1xjwY0DLnnIaH3A0FPN4L9uwkx1AIn2jrV2TOkAeBmkFu2bftu/q5H3/z2t/XBD30kc6BjrN056flxjJGV9usdGP/hJ+/Titn1eseFq5TFu+o3PAgsDAMv80BBUWAlKZMOyYhLvBGDncRyM77rrVoewBPts/3Zvj4SjlLtZlhKK5KMRTW6wkKYVcoFHGCI50mMxhUnpJinN3UM6FBTm462tFEJ9ypmHTYKu33UA83tHc7zP/bxT2Z+1rls/ASGCmLPT9z4Uf3klz/W65bM1DUXrFIfCbCVhOvFcJZQcym0KkqKVQyVYN4fIFka1xPmBpiH+wg1xtFYxTxIIWXFkfHze041WiZ4rWlueSIPLqiA58vG6CXcpkJ6CenRYXmMGQVatnT2a8fRBm0nzBw83Q22z1GMw2sHhh48ekx/+9nP6qtf+8a5n3Cd8QHsv/n5L/Q3n/+EFk6t1hXLz9PRo0fVD5pJ43W9vb2uixWl6qwpL1NtZamqaHYXwOUU5OG5UA0+UEycW9JJNdoFXOwfiDmIGC0qcPyLjyRt4cjlApegMyGoCOPn5IbJE2mFQVbpeFq9FFt7Tjbrdy9s0v7GPofth8D0cZo3u/bt16c/9zl96ctfOfdj/mA6rhyw+K6tr+iqd75FkwpzdOniJdq+c7eCVWWgnimOm3FhYzCm4YE+BYGnZYX53IRClReShEE04UgOnuhx1MEA9DDNVmfokcFukjL/Bjo4D4LO6AGL+WkOxg4nOdjL4aSVA8rKBXIO98Up8YI62tajOx96TDtPdTkawb7fjL/nwEF97R/+QTd88MMa5UaOS0fOzZiP51sntL+1Re9797U6eeKwli+hwMLLJ1dUqzDC4WRH8NKkKkrLuPqtjpMx6GcQ0Aql/BzkHlXVClAAeTiElqZTCg31KNnZCk2Qp34OLjuvQCVVVcqhHxwFNYFcFevr1bB/BAJtUHmElijGH+JwY4Sr1lhav7r3Eb26u0PZZXmKluQDNVu1Z99x/fh7P9H73vdeeOaMduecRTsp6wihRsiGr/nCTZ/Szh1b9O53XKPuhpMgnpAqyuHj7d8QdixRWkPDYnwzybCts1N9gwMqzYuqpqJcsxcuVA8NecsXPaePq/XIQbUPY2iIuF3796uRbtRiDnYxjKQxpZVlpeSGuHLha7rb29Xd1uy4oxjhqzfl077jTdrX2qD48RMqpZdcPmmSfrdhsz77j9/V615/udIk6ECYrta52kwhAFg55Bqtn/7MZ4jfPt3wnmv11G/vUgSI2dLe4gzezs3YuuVlzURHM236TAfzjhw5olFQSKKnQwum19OJSqifhGsUQC4H19/UpOMtvaojdJ1sbFATt2XOvLkqLy5Ue1uLY0BbO0ZcKGpvblGEDH7x6lWKRPMd1/PSjv06PHRC76+do+VT6xStKRe4R3kXXaj+/EKVpMOEnkwpfU6GndHkEARVmoTm0U9vu02trU26eOVCndq+mVjU6Qw8e/Zs2Mi4Nm56QdVVk1RRVelg3qnTjRog7OQAE99/zZVq43v346V1U6ZrFE5mCMXDYHuz8grynewjLz8XZJPv8H1XZ4eaOJzcKXPAQqAlEnBOyKtCPDxOV+toU6fufOBR7YFauPeGT6hyWrn2HNypdK9X8//6g+rIq1BxjJo6fA4b30PytNadeX8PibK55bSmVRXqvp/eoqYDu1WQE1IVsdr6sAYfA3DzXRi1FRrAZHu9JOPJpQVas2iWCgpzdce992v2/IUaJo6b98eJ+9aIj2LUAiClUc2l5SWuKT5IKBstKYMmgKcn3HjodvW0NjvOfxja4ZGnn1M8p1Kfv+JKxQsSilQWqXnTcVVfdrVOw5BW+/M06j+HY/7AYA8xN08p5BoHDh3Utldf1lWXv073/vRHysOpIgGT5GUMbxjdQ4eql3afsYywZPLnhDWTcDCJhDh1xXJtWr9e/TRKAsZuWp6IFHK4VABGNXPGYeJ/fnGJIoQyTpREmwdkTGs4NqDU8ADfh2phcEh9cY82v7pPEQS0V563VN1Z/QoRrmIH+1V1weWK5xYoNAJBFzyHjW8JdxTIZyXSsUN7dd89v9Fbr1inhv2U8seP04MF5oFErDK1RxK6wfqqTc2t6u7rp71I7CWc1FZVqGb6NJojMR0/cRT4Cl/f26nWPg+FGFSDdbeAnsUlpcopLuVQIvKHI0r29DthVhLm1FqXWVTQHdAKwxj2WEObCkqI653tKuN2ldTWE/Mh6qqnK2/KLCWGoCrGpCPnZMwfsSLLNJPIP9I9LXr04d+q8fhhkE5AeRRPhVGMD6IwzsbogS4Krh48fwiRrEkBfdQJRaCd+YSanPIKDeHeYci3tsN7XC7ogacZAFJCBDiGMwtYmkVCDhcUQ6ZBNVMPxOn7jgwPwSPFXegZ4EB8wVwdPdmmogKfyqjA217ZoyBJtgKUo2mzlMqKchOj0BgZ1do5ZfwM244c3OgD1/g2hjGhnS88pq3PPaFKVMsmR4rmR1REkkwTSgbB4CYbbGprF4UoGJ72YSCNgYo1CwRUQvw2pQIlrII0ZOIJknlPXI0nTxBK+pWfCzVB8o0UlytYWKqkkW5JI8esYT/gPH8UqJpAcjJIzhgk/EQrp6sm16tT2zaotatXUy++UgWLL1YylM8d8bjXeDYe/6W6nfEXbIoxr5FgJkClkbJ/y7N6+ZlHVJWXqwjGKSiKystfjhBORuJD6uzohtbtFDEEqpduFuEln6b7tBmzVF5e7uSFTqmQ5aOCjasTljKJV/fQhzWdZzWwMxAtUCIUVpSiLRmnUANyphMW8/uVAlWlUKrF4fJNsZZCxlKfH6bncFj9hLxJK1+vyPRFSvhzuXn0lsfkhxN9ABNifHvRjurl4SVMnNz/qjY8fp+qEC5FgzRMsn3OeKbjGyHsHDt2XC0dncqOkjDhaMr4XFhWQiSYTSItcjcjZhSEyQZNQx/rV+OJUxqk8LJ6oaC8UtlFpQpxW3xUzl4PYWOUa2e3ZGiAw4iR/JEfUmgZSTec7NekohInZ0mGCxSZskDpomp5Q+QM6IWzJNWcQK0maNM6USaS6m4+ovUP3qkCCp4COBlPOubiso/c0NrSrh07dqA0S6lyUq0TRpURSgpKizV5xkwVVVrYGVZ8YEAhOHz7SCYHtJPGfHd7Gxi/WHlFEHIVlcotrURKCMI3Ug5eeJSE7ozPQadTpv3MDE+EQyOK5hYp5c2Vt6hG/tI6Qo7xQ2Nc/lmy/gR5Ph6FoNI6UKZ0Helr1tP33y7fALJx6716TAcfVj/NjX37DujokePg9DJNnzWT5jajPHA12aChEtBOcUWZw/FpE3DaLBaHOpLuVx+34ejBQ3zuVUVNjYoqKhQi+eYWFMoSvjXavRx8mpCVMH2nU7tljF9QiJHhh4b9hQqXT1VWSQWx3hQQXMZh2pzoi87GY2KMbygHeQf9LDycJDrSo+ce/Rd1Hz+iXGsTBuiTUiydOnlah+DXR7j+1ZNqSK4ljmouhjK2gqkU7x/v6aaoUE29bFSzUECYpqeLJH0MdYSbveKgSisrnObHmuTWCjT5UxrvT45wCOSAJLEwzccoqon8smny59UoUFROrkHLYzklw6o5BcPZeEyM8dPEc28YZbJJswk/ozG98sxDOrZ9iyI2hBagxYchjxw5gYqgTwXAPTOyo5lREqdpqkzCkJUcQIiiyyBfkO5WDknYCqk4CdGHkbJI3u0tzTpyYK+jFyZPnawwBdpomBAyRg2PwiVl2pEZwycpzuKhQtXNXCJPYQ08DoN7JmkHjgYDhESz/Dlt/BTQ0JcNjWszVkYyDGnPhqe0Z9OztBfT9GrxQhLywQNHLZIwKVjn4nqMitT4mv6RPhUjI8/Fe7MxcAnJNJ/JRQ8FVIqkmwTLm7jWb61GirkO+J/Tp5Co5GVr0aIF6qeHa8bnFIn7GN6NS9ATNjNbzK9eoGjdHBgQHARYbNCWmRX+CaNMSM1NiXI2HhPk+bwRYwaBmwkMQMUPnXxIj99+i3KI18EAckCa2yaoCmTlKYvkFwImIsVXcoiSHw6+IBtYal5JrC+i1RgppvOEejkAYgoESpjpQoI40k97kdEi5IGNp05xG9KaP2cuR425jabI4gYQ95IcatJulA1d8Jz5i9/0miLuzDFTM/hEF1ZnHurEGN9Ryg5oogiGAgDljPQ064UHb1fH0V3IA2mc0y7cuXMnYQJuJeHVy5tfZQgipMvXrVWsqw2PTqkCJGOea8NzaYzotdAEikmkIez6uwglCVVUFqsQqXkcRGP5pRSOx6pc2DqSqs0E4NMUW9Y1S3voDWfRYJn/+kyPeGyo2l7p2VKpnQXjO6TvjB8j2YWhFTypIR3Zsl4vPvkg6mTwPoa0cHCE5saJ053a+OKraubzj27+Bupkj06dOAmMLHRJtrKyStnwNsUUUNb3zeH57r73bjU0Hdfy8xYzU1ujYYq1IAVXBaQZejUaIiggLOUS80fRCMUosNK+sCKF5cqdufpfTTD+JQzvbtlE7F5wFe5YK87GdEyNBjrXcNtJPf3gXXxuQKUs1YFwjh1vUAw6oKdnWPfefb9et3Kl3vnRt7uRTTN2gHCUA3djpM8QYqveLqrhAwdoHUZUNalS0YKwOjpQHHd3KpdDLSoqItEn4XuQl6B0S5FLDPP3k1zSwaiKa6YqMmnBaw545t6PsxlyJsz4NrbgA13Ym7H1CQY50RDwEdfeF3+v7U/dT3xPMA8Lj5OdAwdvbhDR4X2HdXDvPq26aKlq6+pVTEswQF1g3m6D0Z20BU04ZRKRAnKAH8XbcIKxH36ChRBTLjgDEtfteY1cM5xv0sNBZOHePOTpk+fIl1fljP+XNPyEGd+whRk7E3r80MWZEc2QL6lYZ5teeewunaCDlB1IEa/zdODAMSgHRoDyih1vk4LnqWdU3wxpRrUBhuraSZa/VcNnQcolqSXiTLZbizLIh5OiQLTZvJafmG+DdckUEy2gIYPucZBNqHSKSqbN58WF/5Xxz7bHj1+7iQk7NqRgw7KU9DaiYp6fOQaLc2l1H9mlR+/9tVKD0APoN60PG80u4bZgXajNEg/sp8nGuTaG300ZWDKpirDBBCKH5cnPyQxAo8tJQRkbkWQjRdZcGYSGMOObhMTBTKrcJHAyFcpTzqS5Kqif7V7JuLD2zMn18dtwtg5jQoxvGN6PboZGLqgDDT2Y227DMBODOVa647GvPPuwNj//MP1VFl6gdLCBhZJosVLGPMYIVzCeFcTvAigDD0bPLacQY7DCy3aSHF+IGdpmt6mkEIZ0cACunh9n0ypmfFvpEoPT4Und6OkwST+VXaD8+sUqNHw/tkTDXf2x1QHj3jg+KHcmKpmo/58Q4/+pFzseY9MmG+lq1VN3/0J9LccZfIuQNDsYiAgQJoYVhpsfpdqlwUheCDPZkqcwcd64G1MoB/n+YQ42xQGHmDR3W0JsKNq4HxstoliKkFM6OrtpxJCw4YgHejs0aenF8tedh3zKspLQ9vQjzoJJ5WE9XmtHJrmt4yrliTL6hIad/8j4fUMkWxQCfSf26oHbf0YVa3O5xG0QSxbIKOlBsWwDyoSPXJMC2nwuAtgQqCeEOMqDgXzwM/b/AT4bbZCiYeLlAAzXx+iIZZET2kBGg7RG8qEcsk3FMHO5ElVLlBzocUVWhG6aLVRyUnQY2Bi1QhjC7yyxCxMDNf8j45uW04O8JJAcpDW4V08/eq8b+RxCLJXZk8OgMyjHtoNEKbyMfvba9CFQMhs9DmUWUkLakGgyLZek7BZAoHkxpHE+fYSx5GCXm0AMFkC2MXRnEzCBqlnyT16JWjrzCk10aytm7DHCcxiSMh7IIaez8PiLhB1rm9uIj1/w7V2N2vj4g6CcE3gcHAvZNQy5YlRBFt4YweOz8UYb4Tclmd0AxA6ZkX6mBs3rbZ+O1QEjTKib9rOrqwd/RxYCvZxXAVdP9yuFOvqlQ+16pc2nT338E7CmtDF5HTbRbqpoU0MY+5k5jHN509Sf8JrxmD+ElxmlbPytP9Gv+3/6HQVpkMTp6dreg0K834xv5JmFoWzCj4Uem52yz8xOuO0hbpUYVLEhG2tHDqJ86O/vxXQB1row4Zibr+EA0BMz5zERc8udj+uzP7gH6eK79INbfkiBhsTEhjTIGUZP2CHbDLEN1p2Nx1/E801UNWzbK/Dy3Zuf08b7f6m6wrElePRQIxjYKAmTj+cw6BDEw322usXiPhUvxLALDWZ40/5YizGO8ccPt5iEnZcNnOR5evk5IURQ5TTv73xsk67/8s9URKPm3e97v/7n339JuYUFhCfCHIa3xs8oN+j/a+OPxropaAu1ccsO3fjet+kjV12kaKrXTZX3koxtx5pdf1Mem9LYvNwSZMDmbknAKRKuNdKt/2tGt/6sD5Y0wmFZzggBK7OpAfysEEjBbHqYy03RRXt2yyF96jt3Il+B40FqcsPHPqb3fvAGd9ts6iVkajg6aVkgqrPx+Mt4Pj3cgSGPrrz6r7TpqYf1hfdertkolwfA6B4b+aEytc0jxlLmYNBcGNAsuk0e6gXD4UnqBNN52sMkg6bXNBFWOEyo4aC8cDhBL0kY7j9GjArBfnqH+7T7WJc++a1f01PgG7lZsxYt0sc/81ktWLIUYg6I6Se5j8+bngXrT4zxbXTTeJ2xvulrG5zGihsPRnn07t/o05/6FJLwPr39igu1bn4lU+vtiGRzFMSbbQTfKIkRDG0HkeZACPHIECMkYVa1oNnPQ9mWV1Dk+r02iW672SwcebkFmW2BtlrSh+Q8ZtmFEBXTN7/xLT3wyqDKq8vx/hwMv0i/vPWXDl4OsafBxFlWaI+vGbM9Pf9exfvHFvL+uRXyhBj/j8E149PtYWFjEC/75AeuQ8n2iIaIsWuXzdbbV89GFpJQL6WVl+rWJCTWm7XncmHIVgUALfMptMzTsyiIbKGGffY4Ug2ETw4xWJoC/biFpTYQbfIUii+DlbAMWr/+WX3iuw+511JVW6c58xfrgx/+kC6//FK3B9SoCutruUMcAz1/ioo483L8Z0i6CTW+Gc42CBpCGd/aZ8hkP73b9137JsWQCJ5qatGiKeX69HVr8c04iyoQvprn0gGzA+MFuhHRHNZBWrFUkE/nC/wfBu9b1euz/Wm2Y5PJlgwRx7owkJJTzFnT3O1Z8zqK2mTjHczhvvvz31dzGy3L4kqGI6Zq/qLF+tGPb3ZQN8XCDmNSx+GmGXVc+ZA5kMzkzH/FY0KMbyyiLQc1CDf+iIHB3YAzSe0Lf/813XbLd4jnuTpyokEL6kv1v66/QomBTsfB+E1hYGGLRGpv3qrdXOJ5AS3EItCJrdW0IisLgfM5BycAABOKSURBVJSFsPENs/b85vlpPhvmN1Y16WAtI//w1qaAMGn5Td/9hXbvb9bM+eepuHKqevi77//gHzVrVi3fQz4ZsXeQMbDT8oytDc6wtPb4f9j45nF23cfbdONklYWRLgYT/uo91+vQri14WRqZYJ8WTC7T31y7hgDfC4FWS9+WcVE4+YQJnWgnmkrNoGcJmsyykiJXXFkeMZ7H2jamE3eD0mPzuqa37OvrcTO5TrlgW6WsnUhYObT/kD79rR+yCiyo937oJuUUMhb0zLO6YPUKXXXVpSq3Wa38Mtd/zgxjZ3h/+6Mt3rADsLUy448/N77/sZvyn/L8P5Zkznxyd33PLNNNMs67OHz4sF588UV9759+qLygR6dZuXLsdLtqi0P65NvWqBbWsp/h6ajJTcYW2rnQQwIP0oU3cW05zfQCkqxVum797pg3jq+HGRdG2UHnAFWNVja6wkZGzZhPP71e37/1LtXNmK/5y9ei4eGm2WRjbggCL6Sy4lw3UWOty/p6FHOMp1pDwJndsjBJ/I8NSf9nDmGCjI9Kje6TjdfbY++uXdqwYYOOo803OPn444/pklXLGck5ppe271NBMKn3XbpIq5fPVQ8a+pJsQymsYsTzh0iUdpC20M5ifz6LkupqpjhxlG2rTRipZoMSbklGZkLdNDquInYrflFQGPvARw+7F379q9t196Pb9JFPvh+JYZ0ON7bSjpysuuoqtUBx1NdUqp3F2kcOM3zX0q1qZC0Xr7tUy85bYjpeNyRtCMge4wb/vz//uflgYowPxDS69hRyjmeeeUZPss7XjG79VXuhTY3Hdd3Vb9GWV/fonkefUQWLMeYVg3ouWKqS+hkq9AA1CTMWy+O8WUt4w4hdLZxZKJk1bY5y0e+7AQgUzZktJWOJ0GAulraVXq5uYNFdgN09th7+EAb93s3/RCDP03UfuF7R8irtRqqY5HvedvU12rftFSSIB+RnQiULhcUIkyzWYz7Z0Oi241508WqtYrhu5owp/67h/9xb8EeNb8jBrV4fx+XWIsoctYt5o/RDzSDj+N028nmhE/uYIDx0cC+T5kf0yubtOnzwhBvrbGxpcLOylTX1aG2kBXU+LVt0gV7Zsl/Pb9jIdCJKhXyv5k2epAuXL1Nx2NZxhdyeNfNiCz0DNlMF8WXIpqaMiRL6u/ko2myY2VZFjoukjByzpXkxL+OfZOZcGi7x7nbXZnzs2c265daHdeXa85RTOl196RzQTpXyCr1as2oxhVyeXnhhGxtLOkj6VNOKwP/k6yQ9hx27t6mD5XkL5ixQ1ZRJmjl3nmbNma1CKuU83pvFpQSqaD95yFCVwVuzj2Ub6xHYWjP34JZaj9mZ80z1gsXyzBW37l/mH8RpQI//8gEzghnDqk07CDuS48dOadOLG7Rn1051M6gWZ32j4eyWpna6SiPq7mgHDjLsUFpEpUqsRhtfkp/SRWter727j+m55zeod7AdRrFbpRG/liGWXThtEsMRbB4EStqiI/N4Cz+20NRuA80vNP6FiiItsW3llgBdcrdfWmDLinzQwtmQarxAWwvgwSiHDh3R//rqzej4y7TywnUsNg1rz9EW4vugPnT9VZpWX8Zk+7B27zqkbttsi9efYmdQFxtJKuoqNWX6FBTPbKpihWR7XzszYqyUgYBbs/ICrVq6XLXTpjjHHKGa9mNcK+6sXrAdEfYw07tciPeZitoZHw8G1WWaCX94INMgSRk2t7/LFEgQVGPcdydSjU0vbtGTT63XAdCDIZghNPNh25+TH1VOQQ63YIA3wyRi40ktXjRbtchEMgvB/WyAatPa1ZcSV0/q8SfXs5IrphjjQxFPXPOm1mrJ9DonKykr4foTZlyDhQrXtDfuGThc6zpFbHeb8frAQbfey3C+vQ9rYQJp0zRl3C8pwIEeffQpff+fH9K7r3+XlD9Jg8hVtm4/wOzuaX317z6m+gp2/XNLD+47opcOntSkilp1tnbr9y9sxNh9tCuLnGwRP1KYMDkDr+9lTWQAaBvG2FdccYXmLl3EXBhFIn1jyzmmnrC9QOb5Vq9YTjJgMP7wgAog/zJ4fBwSou11I/BWFdobMmzeSXFiSdOUxa2tJ1ggdIpFQced1tIUaLH+buf1xVSfZbXl0MPATUiqwd4urX3dCpAHxQ/hrIHNTiH2bC6ct5CZ2WY9/OgTvIke2nxtyMeTIJ+o6lmCMZNBuLrqCpZgsAKSG2Dru6xgM8QRBmqasYNgf9uBHECdZl93X+O9pCDV4o6bDysGZWDJ8ye33q6hZEBvvuY6tSdYdNQ7oq079nHAhXrTZWsY0rPNhV69+up2NfePMgGfp1bCzOYtr2oA/aYlbYsIfbQ7L75khWYvmEcfmQV5OGYXqM20RYvYx7/k/PN5b9Nd43+8M2bG9wODDbaab4x3yl4LO5kd9hmqdpT4lKIyNKN3d/fqAfaP7d69Wz205UxDk5sDT8IWj2b2Vvb0G8nF8jjifS7l/7xZFkvhUmyTF+28ELlg0fwZJL9OVVXWaNeuPeruT2rRwrmaVFvtkmAzAxI9DDb7R7oYv+9wOzanT52i6ZNrUaAV43F5zmPsBqZ4B0HHQsLWjK3jddWsNWcM64OIhq3OcHE2qBaWXTz8+O+Zv92opedfSJxeoBKG7HYiV3ls/UYtW34+CXwqm2bb4Yly9NKWzdzNLHLSXARanXj+SwiuoCxozwSxXDfT85dfulK1TK+3EFJLrGGTHdVLL23WIJ44/7zlmktCXrZsCUgJfRBOY1W9jTvZY5jx2DCH/FrMP3Ojk33RooPBso0vbNDPf/FTNTEVPpspkSxKfDNAHl7cQEzfi+d39Qxm2m6U5SUMus2ZOQUmETcxb2GbXxmxfvLkSnLAaU2ZNkPPP7dRe/cd1ZKFs1god77bfdzIZPgo8Tzbg6B1gJ1njPGXgeenYvzaSdVOr28J2Ph/eyMmcbZbatWs6+/yZgzzG/Y3448Q+0OAhB68dOfuI/rNg88wCBHVnIVLtZDtJ4tnTdYxFh/d//gz3J5CzZ05j9GkE6qsq9aGrZsUBhRc/ZZLyVdNevyp59TclWAzFTQDuSPW36E1y+do5ZrV6uK2m5PWVNTo2fUb9PyLmxWi2T9zSr3mL5itt13zFs2dP9ftmE/Za3a5gPw0Fnec55s3mz7eHgbPmho7dfPNN2vr5pedXr4IPmXG9Knu112Yd6Xx7APwM7uReA8ykp9tM7EMvlUyLW7G7zOJnheUwVa/fL63tKxQx5ijzcJDnln/AgihXNOmVuCFk4njLKE72e5UaBX5HlUX+dVxZI8bbq6prlQ9sd+Eshbfs9BfWtJNcaPMdzIbB22tI5+N7+d1WMMlaYJYoOkBbuuGzbv12Et7VTtvhaYT6lasOA/pObeW/Wo79h5US0ufpk+Z62qQmsnV3IgdCg579NlP3wBi6dGml7exiNua8SzRZrg7i8GON168ClKuhq83ue0pFSXleppDuuu+R5TDrJdV4t1sUrnyjW/QyvOXcQDzmKQ0qtyAjG00z1jfGX/81xYZ+bR161Z95cvf4Rpy/en+mLy7vm6SVixb7PaidbLfoJgqcOuru7Vz/1FQE4SXkV3+hKpLotyQyWrr7gdR+dXYwGY/BFHW1W5oZidCXqGOsO3J741q+fJZWrJ4Jtx7thpOdQPr8NxEm2rLQypKsnmEJFfGMFwtP9sSfy6QzmQeMbpOKXKR3y07NdibGXwgqDrj+wAFIyNwOd3N2r3lFW3acUBbj/WoaNpCnbf6Qm4hyZyVwi+/soXGDRQye5nL8ip1cP8BliiF1dx5Uvu3n9A3vnYTs76N2rJjDzeJ5Uq+XDVSn/R1n9a1b1jLzFgh28h7NYm1NGF/mNywQ/c/8qRquN2VHEDj6VOsBz6PXDSiqupqhvvmUi0Thszzx34bkSeB8W3w2EuoeOqxh3TrT3/C1aBhHWHzKzAuPy+s/GyvZk2d5JCMCaAidJGaOwf1/Cv73K5i4z2sc1QOCphZX4Hnx1hg0avtu5i14sV1dXMAPH9f96CaWDSUSHcxEFGDZ7yRpNviBiMsadbW1rqkWZxsUBDoObUs6kaFYgwlF5UzLUgsZ9WRi/e2Tdx+G4Sp0ezn+01KguG9tomQENjeOURM36wN2/apZtYsnX/RxRh8t2795R368pe+ikEqyD87tWb1+UgWo9q5/VUtX7aIGbG9kG6tuvyytcyMdeuZ329QDEm6yV1i9Iht1OiKi1eoBFDQE+tSNWtpsnGge+5+iBU0RzVp2kw3H8yv5NH173k7YCEEyEAYnFvIzZqpOoatX0M7cOujIcr0Rx64T7f9/J9JJmu1ay9zUnii7Z43NTEpTAvI4DYjFUJB4EUbbwvjnnlpp9rY1GcHkoMeo4oNUXOn1Wj3wf0Ilob5/lHV1U8hMZ2G8o2rldjecArtvWdQb3nLW3X11VfrJz/9uTZv3qoIXj1t2jQ2eS/SuoUV7NbBE1HdzJhSx26dKGu6kIvg2YWokxNAR1MjWv/Wgo+FzJiNe5IHSspL3a149rmteu7lPRpI+TV3+VLNXLhYX/z7bwIv9+JQUX3uszc5ws56BMu51a3NjRRL2Q5QPP7MZr3tqjcTUkJ6buPL7GwYpRAEbPDzOGOtW7FQhdiidwgnYhAPO+v2O34LghpignKuW2dWXVGkiy5YRpgazchhyCONkIjLqQuqqtGbWtgZHIqNbntlq/7317/qMnyUzd0vbd0LTqZ0J/OWcb3CtOSWLphDtRd1e88SXU1q74np2Zd2qKUb/Y3T2ATceq450+p17NRJ6oBtbm2u7cIZYNqkq5u99iebSDxezZgGX3LxWkSv9br3/gd0hGRnU4jWaSpm4vyvr12rqbQVh5oOua3jFvNNDhWGTrD9minivhvxR+1gAMC6Xkb72jZa0/HvPdmqZ3+/mX3Kw5oxf6kqJ9freGOjfvfkM9qx6wB5Y0CrVq7QlZe/QZUAgmrmv5oaTlBRQ1szqH37fb/T6pXnubXyL27ZxmqBEnZCUDzaMDZO9PqVS5RPDTKC9qiCKcqe9h44o7voGRdQMddp157dumj1Sl22djWxv9mxod5AxB1kKDsPXumTGePv2bNr9Itf+LyWYngbOrApkqMnWXkOp92F5+eDs0eHe9jkNMf9nikv6CKfrSE9FFDPbtymBsinNGyh6e+zqCyNmNq5e68bbJhG/DO8288vKLOCZDeL5OIcSGVZudauvUTHTzZg+OPaf/AoAIYQYuoxjLtm6TT9j4/foFN7X2LXAr/WKex3vJCVKQn+TZYr2jMrfg37GzeTy2vr4zXtO3RIGw804igMRkcr0P6ndQKktQxj3/Pb+6jIjas56rz/6qveAl0wS29Yd4nb6zPQ0w2bWamHntyIYjqX7VZQEo89rSDT7R0sR7Vh6jjF5DvefKkLO6MYtYQZ4IZjJ3XH7b9lwrGSGgPnpPpduWKx3nE1twexli3gtq219z74qJtF+4fv/SBj/Bv++gOjKXqmq89f7oqkbA7gkSfgW0ia7Z1kd+5ZYqhbS8HlFfxaO9uNMKnUht1SXO3NUMItTuSaQPeSYNy+GsPaNu+FC+Zq8cI5rnbI4yBshdejTzxJkurTymUrHddy3wMPa/WqC+F+Wt3mkONMlVvjYxrNla9+8Qs6sW8bt+y0Zk0qIallaOZshh58RlFau4/PjmuHXmhlW/guDvHg0ZOqXvI6iDivdu89qqeefU6rLlypNa9bpRM8f4QQ9sCj91HJ7iPhL9JikMgFq1YSz1max3vLo1n/wJNbkCoaKvFADL6ASIiDYG9DmIV50E5ad8lKlddUuOXZeRRXB/cc0BOPP6sc8tPp1g6FWNxx6bqLsOkyt+Fw3rx5jl2941/udXuFfnTrbRnjr714zej5FAa1bHqysZpDhw7ooYfW89sW+pnmZngMCJgFWpk7a4qqamrR27A6Mcc8UHqaF3aMHZe2ZtHWa5mco7qyXJXlNUDTaoqNWpZNDAARoyTfA3AphzSFAmSAZP3E009zsGE3b3vBBWvcSnXT1Bt+L84P6Y0swW4mUTUf36tLls5WmEG6AtBXGLhp7hPihg5wkPZLbLr57RDPb9kNAdan+hnzVD5nMbh7k+68534tXbJMl6xbAz1gFWuLJtdO1uPrn9YjDz/M209r1ozpevc7/woPZd6LEGaI775HN7GQCRSEQ+zefdDN6ZrnBqEtrNx4AxVxOQWUTctnAUp2bN2u7dt2sScoijM2qpy1km9985VaMH+mTp84pnrqlZLiMhL8bjbY7tStd92ZMf75K5aPng+TOJvrt5+FcQbxDpBwzaMThJNR4FwY0VEdmLtuylSKjZgWzZvqQsTvnngGiuGI24dvs6wj1ASGImZOnc2bZHy/tlCtp5tASRVu7urw6QaqxX5t2bTVlermtZYsS1g4dNlllzkqw2TeBeSPrIJydfD7soZQNCyYRJ1Rghwcz7P4ab9UzETng6CK4w1N2rb3sI7xe1IKamZp/tILdKqtQ7+5/W4HdydPnqxVq5aARGmimxaUed4d1CfPP/88MJWdneQiO4TFixYSCte6BduP/34rB8wUZF4R2wfZeAiaMS83yaGNjV7zxnVu6HrYWqVU0RtBRMe4cSl6EE08XzUc0IrzlxIt5kM/DEIS5rrfgDrAAu0WIsCPb/uFM/7/AY7u0XbtfeSxAAAAAElFTkSuQmCC - !record {model: 'res.partner', id: base.res_partner_address_2}: name: Joseph Walters @@ -13,7 +13,7 @@ use_parent_address: True function: Store Manager email: joseph.walters@asustek.com - image: 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 + image: iVBORw0KGgoAAAANSUhEUgAAAFUAAAB/CAYAAACewo4KAAAgAElEQVR4Xs29CXBl93Xeed6+4D087EsDaKD3jd1sbi2KNCVRpCzJkWRRUWzJ4zi2JXtkx554KjM1k3GlUpWyk9RUbI1jTeLxEnsy9siLSlYkmZJtyRTFfe1usvcdjX3H2/f35vf973sgGo0mPTVSjaBqNYgGHt499/zP+c53vnOu73eeuta01ofP53Ofbf5bn7f/e/O/tX+m2dz4cfel9n9v/M1Lbv6erd/ffp3tXk/fW637zO83C/ob1rSaNesNazSa5m/6zWcBCwYbVqvXrRHwWzAQ5mX87nsCTf74/FbgZ937bv2CQOsz/bR7v+1/2HTdm9/T5mtvX3/bJvo75GtsfPuG3f6P71x9R6NuNfpm4zYab73oZsNsNupWg202rM8XuOVmbL4x+rxeb3JTvT/WugAZUz/n5+8qX641MKquAsO6D4yqbw8GeG1/TXd148L9rU/bRjX/rU5zu0G3MVrL0Tyjtm5ayyGdbX736Vs9dau3bjXo1ju3nefpa3fy4K1Gk2dt/tjq6eYP8FoYrYFxWt7U5GuGp+pnA1yzfLiBwf24tN6fXsPPV+WpVf52P+es3jLApsOln7ndkJu/wg3abLBNBtXXg5t+fMN2v98y6tYj/3bG3PxL3smo7fv89wkB232P3x/EoA2rc5zdh7wRgzY5tzJmvFJ098WHC8o+DTxH3+8My/fVQlHntbeejlvD3C1Wbd24rV9r39DNR19fk1FvCxG///QVd9/uZNTNd3K72PqORt0Us27zQue23q2+k9E9r28ZAYPKyG1vlPEihACFhbY3E3F1Nfy/58ny2M0fzU05YqsxtvXYLTFzq1FDW/KQs+UffPfWmLr1+N/peLS/752MessFtWLbrT9zq1G3vp5nEnmmF1JcTGwZ0fDeij+lf3VJrF6v8q0BCwRD5gvE+JrPIuXVjbege7PxvlvGCGxjlFuNuylsbPretnEDxOTNTuk+/8Pvvn1M3S7Gvt0dbnvd1kR1Z098y5W3+56mjjtn2iVEJSCSUgCjBoJNFwkUU0PhIF/D263OH3yzGbRyzWdlsliwFfQUKtyN2XRydMOCf4+Yut1J3mrUW27EHz1z/bbjv/VFtj0WrZBxJ0/dMO42x/+djvvm31cVdOIdykP1UoIwkXDA4tEAf/vtcGfV4pEwn4dcCCiVa5bOV2xlvWiZbMEWo0MbXt7AqC7etmCe4m8bYt3JUd4JUm3vqc/ebtTNL9SGHlvx6saF64pbH9sZ2KeEwp8aJmln4gAXFuDn/FxkBI9qYLEKobGG51V00XUZEdzJUS6V69YTC1hjdd729cStmVmyVIff9kyMWS6ftjLfnOxKWTzVZcVS0SLRmBXzBWuAXaulsoUiSYtGYlgvaKuZok3Or9lSumxlf8SC0aRlyyWr4eYN/r0Z9uCVj5/112oWcHBOMZv3z5EAMrtQFOBrYV+IG+y3up832/rYONV/9NyNt01UDh5uUxRsGHCTUbczrq9G6lAs01ltvY4XH/lP/pSrNXCmvEdv1u9wXxBDBasV83PUa6tTFuLvbv6hvL5sSS68O5Ww6blp6xvo5+dqFu2IW6q3z5LdKUt0Ytxi0d2USCRivljcahhIeLdBkjNibaUZsFy5aXm8Ol9p4NkFW8vnraTvCQbNH4x4cZI37iduOwO1kIX7FCeRswkn+whDt8XU/+uFybcF/23j3dFTN59VPt/qrT7elJeB+YMVed94bsBqxD0Z0hfFS2p4LTkmjHGjlTLeuGKVtXkrZlZt2BYtGgpZmLuwND9nIT4PhCPmj0VsZOe4EQnwOCqpICGhM2VB/k3B1oeXd3Z2WjOZcr9bN8ynYkAeSWwucgIqtTreF+Wm+qxQadpqrmLLecIHn5cE5ajQ/PWS3rCBOagT5Lku2zk41+TaQtyE2zxVRt3OE7fYyjsWm0DwW/++BbJsKVt9/hCWprxsVHhzgHjeXNMXwWvC/B3CmAtGXDBfsW6hSoVsnbdgYcmq67NWzi5ZJDvjQH0i3uGMUeCIl/l7fN8eh12b5ap1YLgymd8XClsdg3b19eNtYYvGYxYdGSf+xiwWCfHrq1bM5axcKribr/BS4LXi8U5s3WlZIO9stmaLJZ9lAhGrBqNWr+ZdMgyoQlNhzM3BHzh94A1f3TD77Tj1j1+8+fZl6jbH/1aDb1+mtr+n4sN4HGcfmVke60UL7/DIU3f71qxerlgpk7Nqet385YxFmjkL1ta4F3mrcExXlpatt6eLGMmxFm501VPD8oWcxXwJ6+rpxuP8Fo7HzY9hk319XDQxGa9NjB+yELAngJfK05oNjF8nwjf5WyVugJjYoEggqOcrfstUI7ZmUVtrhCzLsWoCzxSr/HVhXs+xZNQmlm6SC4J8/bbj/ycv3HhbT93soe8EpbaLqRXlbAF81dgyqpJApWA+KiFd3NFoyXwcw1Iua9n0slULK9asZKxRzlq1mrOesSPO09Lra0CqiqXiYcuszPN5ycVcgqYrCDjbFkt2WogYaiABwxgJkpcvMeB+t/selbEYQmyDDKx4mezmRiiREvvznJZilXiLQdMVn6XLnIxIFwedRMmJE+6tO7DLdeC64iMUV28z6hdfutVTt8Ol7R/a1qibKg5939aYGlQW9hGfuGh35DBMrJqxBH8itYINx8KEQN5go4hB09bA4DJeuViyUqFoORLZzl27bW1thawfx6uLtjA9aRE8NcwJCGE4JSFFnQAXHkvy33hlKNFhSZJWnd8djMQtFO3AMCJgvIOp2BwhFi8vLlgUnCsju4RGfK+CSPIFnYSKzQQHzQd6aPAaNcJBrVWEBPl+JdWGAPKWD9+fvjx1y/G/Lb7yInfyVs+Atx//zcaV4arEzhLJSfAkEajZUKBkQ/68dQe8xODD68qlVavm1zhmVQwWxnuDeGrD+vsiNs/xl4HyZOi5qZvWS/YvZdPW05k0f6rDGUivnV7PWaSj06oklkaIn8f7ohEKg2jcwh0pEn+H+SMdJDoSH8hAPxfmRhQLnJLMslVKxHPleoy6vpS25YVlW+k5br6ODrPOHqth3CphxU8cBoRYRFCrTS1uJl3+4pXpt42pMtqdvNcZ1ZXeGL4N1zjqglCKcTopjQixjaPky5csUM1ab7Juo30h6w0S58CI+XyRk5yxWhGjVkv8LJAp0WWr09OggZqFRjmeuQ4LdsRs4cWnydDL1nXfA9ZlCSopsnclz1GEAQjF+dmo5UpVYFrVotGoy/6BRNjWcvxuDNqBcZq1KpEhYh1dA1YPxi0mBqxatlx21bLLi2DctNULecuurNn66pplYkELZ7gRqb3mv/cBy3JDa+m8xQglFWwTadGNtzhe26h3QgCOx+TjTvFUwdrV4/JoWdP5LqBYBuWul5ocd+58N1CmvzNoAz1h6+LGh2uggVLJ0murXMS6Fcn26ytLFuPiE3hEE2jl52LLMZ/1dO+1aiJqq688AyAvWt+9JwghYcvXuRl4l59jKZhWJuEpbDSJ1UHiaJC4l6sELcMxLnKse3u7bWznCAbttiI3osgJigHNAiLDizkrpNessL5qudV1W5mdt5WFJSs2ytbXOWQFbmK2Z4cFR3ZbNNlLnAdpUNLUVDpvJfK/9Oqtx3+zAd033yH7t2NnwwVsgWTPsEpKMqaqcH3UamXrAUzuTMVttDdp8Q5Zu0K2xajVuuXWlvBiPGLumi1N3bAeLljHshMjlnIZKqqApcaPWGW028KTFy2iaqlngJ9pYPCyhYMxYmnQanhnMZfHyCWKB9JjrWTVcoHfN2o5jHrl8nVbWJy3rq5O6x3bYf37D9rokbusGYlyrGpWxjsLa+uWJyHmV7OWXuY9pdNWxVuDOMPCGokyMmi9Bx6ycs8oJzBoyRjeys3cmnN8Murb4VQF8K2G3pyM5JHtO6Uw0GaT2nE1GfHZjmTYdnZz5KjXOWsAbw6OsB8JpbA+b1Gw4Nrl81Zc4qIB8KFoEA8K29LyrIVLZPMdey18/36zK2escvU6cXTQQnDW9R4fR3yodfNgrDj6TUJIEFTQJJbX+Hzh5rwlE0Auqqe12Tni7pJlQB61JDd4cAdhIWlJMHAXpW4ykXA3qFKpWZaQodAUzdRtJbBqk9MXeZ8p6x5/yNIjB6yaSloHrRxw2+2e+uVXvZi62bCbj7ogyNsdf5EUTdeS8Dh8xyYpxvIFkRWjiYANJQPW16GgQPXfCFIvC/iLdCoTn5Yt0Szb0oU3LFAsANIjVEYdJJmiLS7MWq+ReAYA8A8dtcm/+6alz5yzux56L5VM3LK2Slm6gyNIYjLhyQBIgDhLidskHisE1DPXLEsCK+B92elZW52bJHZXrRYOWw6MOTe1aB0YUyVv7+CQdXR3k+3jVgUp1ImbPcFhK8TytrQybaUZbkZ43Hx3PWDxffs5CfADGPa24/+Xr3vH/07e2mZx7mTYGoHeca5cgPNgvMTH36o8VLEc7DRLhKmUAuBS9XTAfQGIjGopZ5nMIhVUwToaJVu+ccFCQCn9TKKL+j29apnVJRvsHrBiZMDCd+21xVef58JmbNfDj7ows7Z6neppjBug+E11RlkpvFniKMvMEUrXcPUGmZ3/LlUsi6dOn3uD2JkmsRFeFNbTGEpQSiiUG+oH5zb545fX8ne8c9TCnUAyQpJRcS2t16zUP25dGNaS/Rb0EWq2ciMy6p2TVCtWtoy+2YM3OAHFTlUZzqieQQWqwySmCEfpSJzKxZ/jgssWIAEFo5SQglg5Mm162kIcsUAtZ4082Z9kIRIkhqdkV1QIZC3eR1JI7rJsssMiS7MO0/p3Tpi/BBewfM26B8ZcKFcdgGVAA2WHZXX8VR7X8kvE1ZRFE2DNXNpmLp6xuatXrcDx9oMWysT2MnG4zp3xB0IkWJgxjpE81Sceob/LejpGLJEYskgXrFY+Y4vZioUm7rPEgRP8jAd7bsn+Xzl5K6TaamDRc28HqfxKUniqy1O6Kkc+NC3KGwxBEB/yZ4k7RQuLfYt38TnlJsemWVzEmMtWnJonDuasEzovvb7CUUyS3ZpWXF6l6irbMte1567HbHll3ULLC9Y5kLLiyIjF/XHLzF61iEgUAL6OfI3w4SdeBuvyzKxVKGMj4ZSj9YrE8hCMUhzmZm16ymZuzBJzcT66rbn1NH8yvA8YNUKJPB8ga2HwrW9P3Han7gZZpCwd5LiHKaepvBr9R81/+BFYKuHvW9l/39dPzWx46nZH/Jb4uqWr6JIRBqrDNKm68MPu4I9WITl1UWkNUeal/IvW3ddtUYC6CA3FPJHxtUrVgfnazJvWy1GrCM6srloHSCFfyECGRJwXWTRFbd/lKMJZjuroweMW6up12b6M12AqEACJWUwURURxZdFKa8sAc24wx9ovT+QEBfBUvWYdKFcikxeXl6ywsooP4NmVuqVXMra0sOr420AMiEbMLROXAzvvst179nNaOjFs2SoYfa0cskpsyLrGDlqxq8dzKnKJC2/8nO+vTs/eBv7/3xg3CDathjmSanNw5yvE0hIW7uTN93K0B5M5WKSkRXijjqPiF4exqo5boYBnLV0kiwZBActWWl2xWIjjB4uUBGQ7wqKjB4MkKBBIZoW6dY3usWj3oEtEChc+dUt53SDQjZgCLFq2WnbdYkA9NeVymXWHmR3EI0SF9ZoYuUxFVsqAcwH7RQqT3GrO8pDYgl8lrqUqAgZyxobGbO+hY5S+xFuKhr6BHXZjft2m0zWbOHiv5ftGnFHlLPoIcC0bRr3TEdfxbn9s57WkB1h0xVI8EJBf46hViOnRYta617NUT6QQ2h0BAr0fY6pEjEB2NIh3FQwVXLtiPoF88GE5vUJC81E25khW3o2oBKKuVVIiAVUCwKuOfuvoxaiA7ho8gbhVd4459vU8Rz67YnXCQFjkNReoMtJ5dU4xtm6JKGAfw5ahGOuEhPLcDFg5TfIiYUFYC0otw5hxRiwI6xXo7rHRfYetHu/htPXZ8NgEZfO6XZ1ess7eHWb77+O6IFzabXGFgyffmLsl+2/10s1G3fpvDvQThyqUi8KoISBKE+NVg3WLYdTedMb6ukEC1OEypo5GEAO7Wp3v190NrJzjgtN4WZ5EkiF41EAFaYt1JBwfWoKFV7gQGx/pHrJ8A7yLp6oJ6KqpEMUGRvVhuApe1+T3NkhUDYwc5XeFe1KElqzlMZyI7g6MWgHKlShv/RFgE1xCZgWjghAUBrJ47dJ6HhqQ0EEiiNLC6dyxxzpG9lmoZ4iE14nDh211LWOzcAMdJz7irsmV5BhWBvZ98813Pv53iqvOyFRFVIyuopJRxQTVQlVLUs/3ZbIWi9dgg/C2BLAEo/plYB0t0XBSjSy+yUUtWlgMO8nFz7HOZbOgBC4ISFNWjOI4hsO8BmViruzjwnrxOs+oYSqbBgZVTV/m2BNX6C+VrcDxTnJTwn0pB6eKGKGeK5KsOKKEp5qP76eyC0HW5AgD+VXCQK7MKanYeqFK74oqi4SVSIFGMGpy12GMusNxtgkMW+R7pqamrX7kca4RGCZMrC6HjPrXZzxP3XrEN8JB61/vZNgAyaBKV1MfOv6KXxVfyRLwor2UfZGkj/jY6VodijdqdQQ5/i64C89i1GWovCilZYMbESAsVKm4Qhg1QqVTxasFk4JULoFYChKZPlYkQcbHMNyEOGihCjHTIIbnSHZR0YjEzxxIQtVZmV8Z42fVIVhbWMCDK9Y/1MPrB2x5ddlCEOMVUYx4shBAnrhdIDxnyPDZYpnTEra+PRDdO3ZbpH/IBoZHIXCCYN8yKAFY13eYawOxkAsklHO8cduodzLahpBrU4GwOQyILy2rXOMjAl2nzmS5kbPQ2px1UWt3D3VZqq/HEiQrMVcyakg9JgV3bkho8Q2bn7xqcWJgPb9O0UAxIfIrBKZVXY5xFTMVMpTp67BRTeg69aZqxN4whq9gKCXKXGbNYoQZdWqXFubhEYBBfE8II3TwOjlOToa43d/TSXsmbkvg3jqnosZNKcEbFGCfspmSZTGsWitFTqH6VIP7DlrXrn0W6++3zr4B3n+c1xWp3bCV1G7XzfVRVtdb7W/f35yd39ZTNwDtO3hqCKMWAcDyungzQqXoBxOmzbd40+IzUza6d6d19fZYDNJYCj3hOh1r3cQy3hNZOGVzN65YAgwoo4I4vZYFBQKp3fGX4oHjUH8SSMQEp2h/hPmd5SxHGoMpNocJKUW6Bx2wTgL9MzenLNWZcHGuCLjvxyAqLBbmp+k5KWHBclG1iUttgkQaChFYcn0t7zQDaq0QVTl1EboPE7b33vssSpumhCP0DO6kOOiwN8/fsPLgAXd9oTgEdgth+L59ZvaOONVd3KZG3rb0n9SKjsDg2IkZx0tETOeuvWmxwpoN7xq3Xt1h7mZNjTreVFjtDb0BAPv6zGmg1JwFCBedrTCSxjg60uIq5dFq4vkxng8j6/3IUOrSSrJTpcio8priT8tq0fCyUW5cniTpA1OGiMVCEz2wU3nCg+uUgyRc/c/P+eB1lejUzslQBJSKxFpyQ5aYmSFpFaohSw6P294TD1kAojze2e3yRheZ/9wlmLXwoO09cgQaUY1Ajj5x2Pd3Z98+puoitjVmKxxIwqgKSlxqE6JEwT/WLFll6rJ117I2sm8fcYlaWt1MjB/E88gteAZvOE95unrZqggk/IVlPKjiLrZELAty9cmOiGWAOIpTmFAJf4OwCblkZzbQ2etAuYidDEZr0u+SUXMYVWKKZhfkNTeh7cl6pT6KCcE5B+YVj1WN8d+K5bCAViJuS+WSAWeXQRuR3mEbOXLcEkPDTrShkyKSe3p+2a5XOuzAsWMQLVhBpS128D11ZuZtIdXmJLZdUaA2bQQv8pOhalxlmbtOfcTxv2H9kA2pkWEHp9SXd3GXgA6SAUsqjkFs5Keg/Gbx1ik8Fx4AYykRyJMVG9Vz8pPYxNb7uGlVtbk5rjryrgDQocOgYW6CbkiI9+CMSkYvZvPWNzTgXjONwdMkTrWnd46MukaiZ3hEFBQhFQwo/UGjThihU5Er0YykQkzjucFUr6UmDtjwnn2W6OlxqCAU6bQ0VOPlbMgO3nuP+Tj+aja6Lsh3zr4FqbbDoVuNuvV7ZNSopDHqC5FAKsCZBPW1f2nSBulB+aiMVENH+ONgFEZQRSNWv4YRGyvXKRtnrbIyg7EA7RxXP4lM7H2tgiSHox8mYYWjZHy+rm6mjNdwqhPgHA1DcQ4icKRr4vZ5pSjHuYbn6WSEqbqyJCRVcGEg2sjwoDslGboOalXnSWAlboBEg+VSw9bI7DmSkAQfGU5UGFwcGxq3nQcO06oipjuhBZ0DbsBkucMOYVRaAdx0T6ixYdR3qvHv5LF119Xk6PNiTSUNkkQngaWxcMV6ueAg4DssMQPdTHmM6v+Gqhngkwjl8tIN8C2CheIahAgXx/GVHDII/BKmbIICpCrxcxG4LG/cg2P6d/2pk+XlfXWOscrSBvCrgEHl5YqzBaEJbkyFTF7AyGqp6N9qaAjScAB+HEAdg2qBG4hnKvvPL2UsnYOnENrgPUcA/QGO+8DEbicviiSAh3GIHU7ndDVpB+++2+oUAA3FI+WWZ855x/9OOHXr17cat065ExLjT/D34f7q2yQ49rXpC5aqwBIBvn3AEnlqlApFkKlKT6qcg+pT9xJjSkDRJFE1MLKEbFjLM6qrvzEiNXhQxnUJizKTr+vfnYwH4zSKwCGqMFVVWbxvCXJbsVMwTDAnihH8eGiARDo2NkbiyjhRRlk/t7boQkWWvlSB4iCXLTtPLYE0fJTIgDW8kAZi56DFe/otRdJN9vYDFXdaDgPeLMRsz9G7qCKlDfAKmluMul39vzVJbf3vt4yKh8kTiXlx2Nza9CWXqGoAygDGjNM67hCUwlMrjjtd53MSEuGimAaUZxcdNReOQw7r+Lv+ujgFgX2Of5x2tMgTaaGUFFuoZAX9QEzEB1g1TrwmNhAj0RSoMUd4KCyuWg+gHfJJgRADJ1zlVdVpwasDWbqmcLeri0uIOYjDahISU6scfWkVijVaPqTiWO+oBbk5nXhqLNUNH3DQiS1mygnbffgwFKKELpwgTu2GUd/p+N8JAciokFSuFm/yojUSVbxBc272IkYtWAbDdVDWdXf1uXhZpL4vYER/Hcaf5nkB+q4J9ArVqY4kasCjavCj+n1B6vqmanBJb6j9BfrF1kqp2i51A1FxChAuKysUA/SlCAU14nUUeJYRuiDOju7aC5inbc2NlTy9QVOwBD5VPDVa4Tm8XB4u8UYVUkVJaj2rIoCbDge8SnXVPUKfDDiVIqY2uI6JQ3fZKrBr1fps/BAUoEYRnJgJoz57/tbsv9V4bULlTkZtNDCCn3sJL5nwxSE8SFY+OqjlBQuCVSXy6ujuAu/x73hPg3hX4sh10QxMU92Eli9ZqptaHsPVODpRioQQHlfFgzWRohhbWIMTILz0dHS5+FzhNNQ5AREUK1FitY6cnxuximHjGFiGJUvx3ws2OLrXVUVFPL5rgNYMXhzkhtZzC5Sna1a9smxpQH9eMRXWqkDyTJO0ClRMNa6lRqrPhjssPgapQrk9BNAXEokP7bFitNv8+x/wusnC066txC2XUd+OMHknozapoqpBWsXc9QS6pjxlU7WZtc7spPkuvm6JwRFI4iZSRb6HBBEGG1aRSuazXAyqkJ29Uep3NFAYR6SEGC1vzoDoqtZJMe2yeBVPo7h2OFQ8a4wKK57kKAeS3ASwpHpOZGoB+yanQ0muBv6MUf0owVWo3kQkC8Z14vjL09dt7uYN2itT/D6MR6FQ5kb4AdFixypoqvIoAJ3Yg2MfGx6xsT17XEKj8W+Bgd3WvfeoVfvGXTvJIZvWpIrv+Qt/P0h1J0/l8FmBElNMUhxPrZJlm00Yosx1a5x71XqGBmF9cgBqGm/00KsIJvLLc2BESXmitv+uwxAnMesEVKvWV2LRmJS0+IqbHbSXZaw0zTr9UZYPSGpNUlPVJaHa0MCwdRCLVSEp6aTwKF2kyG4fwF3cQYd0rZwW4eMgnn3mtdft0sXztoqXBqnlpcMKYdD+gW5XdhYLTVuYQ1hBVbWuDgIt6b0HD3JDgXXJIfOPHrKBww9YEwNvGLPdVtls1O08ti2UvpNRY5SLWQgVafPjTURgKiED6Dnyc1Y5fxKPuOi0o3VVZlxcYWHOVm5eswRymoOH9lh8xw7ncX1kVR1tYVC1lmXQrAB8I4FXqqtJn57QIKKbVG8lXieztGiLV086OY96S2GO+RLdg6GhIafcFmsUJ8EsTE1iVE4BN0Igv0DsfPPMJY55waL9eDrt7g4SYQpivAttVlDFAyhgfQ2yGsZ9emkOcXLQ4hDW/ROHrDmw37qOPWzBHfuoAnGoDYVKaxDuhfO39v23gvuW/uqOpWoHdz+DXqqK/DXapLejUhI+NYo2KoMnTD73l459r2L8EQiJwtKCTZ47Y6PDPbZ3306LIdCN0wLuVr9dFRnhQe1RAfLpmzM2eeGiY7fUPg5BMKsaSxFPR7qTtoNys0C7ZIVYurSoON1pK1RNozvHXAGhSq6b7u2Fs6ec5qpI4lJFBpSwMjG4l1bJsROHMCJJkDeZJ4mmifdZXrOAwcuwVeksCS+37vhX2Fjr3Xvcuo78kPXd816rpAYsRntdHxuzriKEXsKobxdT3wmnxql6CjHqeu5WUiS1Kp0wcQ38uHzxquXP/p1jb5So+lIpW5y8ZrNXz9vRw3tsJ7qmWAdwSco8Mr8oPNXrqsuX0DFNT07bMl3VFZj7LFBHcUEnRyTgIEYdRQCxqy/hboKyt/rUOXr+99x7v+M3Z+cXLZir04ldAnmoOqL9EoOnBWd2ArNSA0O2nJ7CoEHiJxiV0jVCb6sXsVeQOCzSenY2x+uCXYtwvckBi4zebYce/0cW3X0E7SqvRfz2jNoWNBNiX76wPfjf8NjWTOedjn8AcqEimTPRN8sAACAASURBVD13rJeeUVhy7rgk2wFbuYoi5OLLto7+qST5OOaVmk+Q+v57DqMI6bIM+lB5T4mmnTK+MnmJC1xDyljI0sijL3X9xrTdpCdUVGtYXktSjMWDkNBJ241QY8dQHy1xJqaBZxqiePiHfgiNQdTeOH8WAcWiU2zHuKEZ4FlT1RXvLUjIKCsG13NwBLBlK3mHdYd6EpSxVE3g4ZJkPxDiUtLk4RuiA7sQqN1tEw99GIX2PiSWcRyA5mOrfGob9o5G3TDiOxiVbhSNPg5/ZdWGCquWqpOkugHpYMLy7JrNXjhvl2H2RbSIgquRfQ9MkElH4Sap9Qsc2yyYUYSHyscIQF5GLYER4xLaVrJ4WgZZI+Un9XiWC10RW0+CCoJzuyg4BNW68fgINF6Zpt8+cGM3MXqN77t07hy/B3gEtEsDjwToM8RUxXFxAR0QLkVK0ib8aZTwE0EH4AceRjkVcTwxkSQxwZ51APuK4X6r9R+GGttne5BVDu4cdqdQIdLFVUKcE/S9cv521d/mUnRrTBWc2fzB27TectLSgTnre+nPLfzaM2YkoMF7ThBbC1Z8bd5O8svmi7RaZlbsyK4Bhhekio5aRn12y1sc71mdXaAoQHjBWwwip+waHnL48sbpc7YETl1CCzUH1RZW6UmiSnUEnTHnQAbDBIQ86DvKzRwIU2ygKNFs1s6uJZstRe3cxQVudA8JZxVZDwWI+FRyAIHaRrsZtSROj++A0cd4uilRSuos0CkPBbljsAeinOZhEKyaBO7RT7t+edHGP/pZ2/+ZX+FkrjheV13ltpDU91rLqHc63rfyApsN6n1eoLfUW6MXFMXbvvQFu/r7v22V/k7beeiwJfpp3hVjtgys8vXSAUCcFqdyCiMFEo4MSVAGHFuYmbUrb54DtFfQj+6yHRAX19A9fekr/9VOop4vQbGFoP9F6Q0xNFGGOwgA1HXDu+ghxSQS46K7ER4c3zNkH/7ZX7AlktLUU39ir59dwFODNrWYJdGgL4B7WM1TypKvmnhtCFQQ5Wt7Mer4IHNYVHFRPF7xXX/CMG2x5AghLim1LT0tVDXrDdv7yV+03id+2kIlym1JChRThXykJXv9wlua/22T0qY5effvW4bRKiGoPwwXSFEjf+vL9sZv/hrAmRJQMzISb6V6rOfed9nBRz9ocTwvc+M8jUD4AAB4B4RFI9S0N18/ZRfPniOWjTCFMmgvvnbaXjp5gTLT7HQhCq6khYEiehA91UAX4lvmq/L0+N0UNUlmuVizHaMhuwsFyqd+9D12/HO/TN+MZt/r37Y/+sKX7OLlabs0RRWFcxZwJ4olCQSh9wij4E4deaYJkHwaxu2xfWND7hQs0WMDYSFtH7JatBNKkaQF90tP3g5/6pct/qF/hKZL3QZCgNrkCOwa/PGdPH+rUbd6bNMpv7yPtsZ/cwSo4GnRuqe991OWvvzr/8rWLr0GQw5zTwa+SRwdO/agvf+zP28FEsPauVMIeiGgAf51aLYmVOEacp+IdJ548uk3ztqbZy8TOyuOqlupQYJwgzqIXgiBnOo5zZxABjCgaRs/8psqmqzevqSNx+r2L/75Z6zzkQ9amUwdWzpvz/zhV+23vvBnbmKlVMdTpeDm9ZKQIut0T1f5zx2I0ILoufzoBZAw8N/MvO7fi4hDIjuVylGUgF14NX2xm1dQs5Ts+D/+FRv4xD+2KmW3RMyUbE4U5wcN3GbUrd6quSMZcUPMq2pGka/dEOSTEEcvz1Hq5A2c/Py/s7Nf/c/WO5qAV4UH4I0kYjvsxM/9nMUI7Gsvv2SdcWjlTlgkjKqBiG7i3fmzF+yb3/gbGPmiDfQPk3WT4Ee8tCYJjzoFAHFVZsTDHMZZZr6qCJOUC9N0W52lmeiz9//IA/aZz/2EWfcBsDOjOrkrln3lNftX//o38CBVPuBTlclMwfRhVB8kUKQbjwaZSLXdTR9LbTLh1R4wsGYGxCUUylGkR710ZPmdkxeI/+t2zz/5ZRv79M/RsYBcF6zSVA28gYZCfCfPebOp2x59d9rJjE6ryB8xUQK3GxCCAC1Ok1i3Dtzp2TFo03/6f9oL//u/tOTODgsXAdhMl6QnCzb2xBP20E/9Q7uJ4foSfssl0FsBl6okhvV1wDVePAUufePkGcssM5xG6A+iBOnv0GQe7WJJcfj9ObiFHHzDJNqn9QJpkjg6wb/vOTxhn/vVn7feATiE8G6rpdCtVq5Z5exz9id//DX7m7+5RFua2SoKCGmuUvydgsT2h9B6Aa+CME9R2t15jvMiAgs1DHvBwRIyBtDH+tF0BRmaKyORzwP3Dn/q563vE5+2YHaOsCCRGx4LmvFJGv/62evbCtTaRpa4wTMqF9BWSQtGtH6qCU4N4CV1KpISZWT2ya/Y67/5P1nXoT4bDA3Dji/Y0skF6/7oP7CP/ctftqtf+gozAEwk70hZCg/3AYtiAuRqH88t2HU6lJdOX7Dpq7SYod18VEL6vTnYeSoEDElDjiyzkCa+UTX1BXP2kR9+j737scet/8i4pa+dt4597wFPHrbKleesfu0Fe+mVC/a1r79oc4s5N9IeJ453UnDESfuSz4vMVitI45kRDbeBUdP8PoVCKQU7U+PMBoBXK2nzz12Hu1iziY9+2jp/5BOWRBJaw5i1Mu8H9ot2hvlOnXnLqNt5K3mwZUyxP4rwEB6bPNWvko+RxyDek+WODxIzz33+V20pgj5qlePbw9z9qWUb/NQn7D3/7Gds5mvfsAiJrPPYbkZ5iJODyM+p9+N0XOtkf5+0Wesle+Plk3b13CWkkfCkxPW8xnbwrBUY+jyxVvKa0Z07bW9v3I699x478p73Qj0x6QJXmkWQGxsgJsILlC98265PpQHvHfaVJ/8Ow84RWuBHSXzQ0NZFAnLTgjgERD6fErLI+mmEGX3q82OoZOcYIpEY7RoGM+inrc8t2tAHPm69H/sxi67cdLMFVU0pSmisk7z5+HvGapECLQsrozlPxZjedggN70oVK/igHjxECvKaeciNAWr4ZHndZp77pq2fesamXnvR1kt4xoFR+4V/8+8t2+iys6+9Sr08DzZt2MTwAY7zCrp9UizeU4TJcvIejv7c5JJduXDV5r/xTctA2y0SJhZzCDY6mXQZ3UGbOWmDdDb79wza6OH7kan3mq+8QjnMSw3ud21lY0dA48o1O3Xquxxxn81MLttX/vJ5jDQCTiWONjI2RJUbBrv61aKR1os4ngdy6eR1MpAW0pzyUBLMSlFDTysIVCswaTPy6Ptt7PgJNLLoqTRjoGYksVnx2ffK6auq4ja8zxmrbVDxhBJKkJxcY69lULfOSJ/L2BoPVWtWwJMWhZ95qB282eaNM/bs1/7ClqbXbeeDR+yDP/s55Igj9trLL6Czv2yHUa5Uy2H6516vqQFWVHWiflIn0ycW6HAqvKvPPmevnkZwwe/Zy/BCD8TL8uyME/aODfTZyG7k60O7EbQhJaplnIqlmpoAffQ7PYGYMk3zSb2SXsnaBfjT69fnMShcKVxAgvaHiBonLJN4ozVqrqMvCWgCCXt9oJPpbQiWq4wkwaBVKa93P/6Yde/ei4KTGweckspFclKnQHz11OWNvr8rsVpne2OAQtlehsWIDRHEZDr9LW2nvh4gGwvahFSpgB+jxJ1dhKVYeo7286z9p1//LRu7f4/9w8/9Ai2HPnv11Ve5s7O2Z3yA2NYN4evJfAKUp6EYbWjiaKiTAQUGKOhdGBbRm/I0VTDypaUV0jPqE3BqAK8I+tLARqoenCGuhqNYfmanpCWl+WXNSy86hfT09WnXmhmf2GHnL122azdmbGE5SwdATRBwM8fezfIyHS1eIUimV83fAUdcRwmeA+ItvH7WhiFbOvaN2J7HHzI/Ax9WXnNbMDylB301tahff/1Cy6heoJSXtqf89N/C8GrmOdfmLqhZJoWd2CgJdyP8W1HYTxwo8SyqGETV1E/rt4fK6urzeAqdnF7i38JqgP57jooFjX+c7I8evxyk/ob1T3HUYknNf0J0hEkKkNNBII1aGGKtBH/yxFcKduIgKJ6pljq1fRU4lcOrq/CpqQhqGW5KpXuXxXRTxCxNPmvXzs3Y9JUFWK9LduLBQ1RtQ8xFrdjUzXWbvDpJEmSQguOuhmKNcBeOwgEQLsqMxie4SSXIGHEPK2ev005J2eC9u2zoxAFuNOGCNrxnUG6NoqNWhLz68kmZ7TbsuUFOC0opdqpfr74RRnUiCB1/PJawjgOR+SSRBKeWGf7qA1ju6uu0HHXy2NETxjCULZw5bTNTGB0DrC9ftcFOiApAfDW4zhAFun6Oa5QelI9+utFgUwujwbGMgafWgTiS5kQIEx0yKO+3MDsN94m2n/+qxpjvJ94n/cRkXqM5cAAh2wCq6iWrXfyWrcyhjp5etddeeJa4mbX3P/aw7RzfD4lTJ4mdt9mpBahDkg0TL+so/9SlCMERa+42wc0vMcA2P09xsFzi5jNo9/ABC4x2OtrSoSOXazTJoz2Dov6++9QGpHKUgGbZHePiBdb2FJ9aEirBGhi0pupBgZm4VKdnL91pHqZJxhYA7oRE3j1EfxwF3nIgZbuP4jUL03butWlQQgctDw3zFjFChFi5aklklglNOWuEHAY+rGMvaToxtkr7WK1tyhs8j40S/MniofP09tWC3nv0XvryxE/eT5gMTAxxLFIQjVUROafdeIXxobytziw7nf+1y28gZMvZo48+in5/mBtXtrlpuhFzjE+mSwzEpW2BSRi6Qk4jG4uiYGFUc3k5b10gnBjDdiPv3geXypAIZbMrilqe6ookGfU7X/tzR1K3/7T3hGx8TUO8LlEpOWFUaes55hLPuplOCSZoE6vNWyT+qWauUf30IGN892PvJ8CjBKSyKVN5nHrphsu8iW7CwPKU9WDAEFL2iHAqhlPTz+1I4Y/erKBNHMKjQl9Jm3fC0HHlInOmFy9BRhft2PG7LYFRm6zqKHNagqU1kiZzKr27mWDpAZqh0M4sMBo0aYvI0LvpJ1XoOT35V18ntg7Y0bv305gcdMS4ZELFTMFWltMuNCyvUXLCTYRCZUPxhWYD+EVC7uiNWe/dE5ZBhJeEGnSaWwc1NaDhtYF8X/3j/+SM6lYawSeqny5N0kbfxX2/pk8wqrzVGVWeShzSlolg1Y1wJ+luiiRuUAYKMag7/64TJ2xwzwkA+dM2c/k0R4wx7+QwbWw6mkCZmBYcSPfssq6ShSafWxt/NG6jtgodA8X1OsYoMpixDP136fwVdxM+8tEftfCxu3k9khMVV6zKuhCEG74+Ymovo+fFFfPBgGUZglucumJTF2/awYm77bvf+Q4ha9qOHBvDqHexPQg2DYjX5LqyGPbGjXkMu0YY4D1S2GR0ahHHRTkNvWM91nEAmTwgH5OzHYjlEIRBj6lS3x9P/Ysv/A8YlYuiJAxSVXiSGowrmKWboMArUkVSckFbkpISR52LdaVrk/iqBYdCBXh0lRpYuC3MD2sZzAce/xC9oVXrAlyrQ/ndZ0+6MfIeyN8EmV+iYbU6tEtK0yRBoFUn3dUiR1XwRFldc6WNEhQhw7tphhyWmb+qg2ff98EP2NBORoNCHfSRoAc1as7PhzTWA+ZcIrENYPypqRk7/eabeHeBpQzDzhtv0v8ah2acGPbZwMgYLXRa7HxvlpbKImXowjpsP9p2jbfXkBqlpVvY0cXs8QA5ifeFgSPyVGKq1/Nvbf2RlPIPfu0ncVoPUuiP1HPOqHCKMiq6Z2/qwvEAmogDAVD5qPWhGNKAQNAAgeKr5kHd5B1vQMNqeq27Dx21idEhC6E1vfzmZZtdZF6fkZ0IPGV2bcbNO+lUZGk/S2DmA6rFCAN5Oqm6gVkmR8K8r8U59ZnidmVyCi/ssyd+6idtns5p4TJVF7F5he6ntLLiV8NAK70XXbgWNVRg/DVNola0ioulJcbhcYg15gImGHnvgcBRo1CcrfCs1nzk2PhTgLhRX6xMAiphj67RHpQqUICwZTql0hpsNqqXi/DX3/ofP4BaxxN8qcWrmCajhnBrJxCgQ6rsJgPKvVUx6M1quEwu3yTjO3VzC0EoaMsYEjU4RpyMOj46AJsesus3GeBldCZBhi4h8q0wn9pNP0uxc3152d0QhQ7dkDzQS57fSIukRlWNF525dImcNGCf/JmfshRV1ToCt7/9N79r88xILRBrm/zg7p0DNtJDyQkTpfeYhETJwIatsTUtSCtaLJWf9/zQg8ft7NmT3DykksR0rV1yOUNhjZCnzkAJKrLcJF9wLRHmBHrHkS510vGlH+dGnIi5En24hE6p6xxTPbR//0sPN93Es4zKkYlgVMluPK2SchR3ywViLbvyJJNilBRH3EdrMYuAs6cskVYJY3CcnBafUsjHEQnAqMcYLDsIt6rlWquL1+nFc4E5Yhfqu1XGGrXIwO2A4jV08bpZ+TUqLU7CHGVwjVj/wx/7mD3w/kfYSsGyLm7kH//Pv2XnJmcsLe0VXd2JHd12z64dlMIgE5qAgd4Ou3Jl2kGiKoS2hpH76Ej8xKd+xOZnrtiZ16/Q88pY/+CwK2zURdBHmfK7yJ9ckwEMnKh/fNQZtYLEqYpWTFt+QlRbokbbHzKqhjZ8/+tn34WnyqgIzZxRPa/dmHXSLH1rmg1Tu8+d4rg1i6nSTm9DcVmf6wgIVtQxquTeMX6R8K3mp/qHd1n34B7QERBl7hJxlzgqYQRGzXAks1CAYZWJ3CHF8goesgi5ImVKERj3wR/5sN1z/30QK+yeokVTBHF88Xf/zJ58+gVjBgXiGcEFTbvDaAp2MmNAUWTnGJa4dp3h3hrxrwErxYxqIt6wxx89Tis6YnOX59HuX3Fa1iDHsRf8zNwMZDZSS2L/er3DjVWOH97H0e+ybFXzrJxEvDhE8lLS9j68JO8Z9acfbLqsy9GRyi4MbGgb1CnY8DIt1nYIQEaVwbhg7XJyMURhghfzFil4E8UuHHD0NC2toytmXPv4Bkb2c0TRJRGL0ss3mGguQgOiJIHDzADkZdi4NFXcoAKJKQMQv0FXQB7/4EPvRicw6tj44QF6XtxKQa0zN6bs9/74S3Z9jgoOLUAAdDJA8TGGuFezCG9CJxJOnbSoiqi3h3aMn5Gkw/uG7JGH7rEKI5FnLlxGjYIkEyg8SIs6Cs7WIscq1zNfgMTGIfYdP4TahWZladkr5auENn+MCswzaluk5o7/b3zm3ej/vSUuMqwzsEQLkpzryMszHRvlBIyeAkUqu9b28vYEn7wURmBDyaLwoJjmpkAQXETokPYO7ubPLgeR1ucZK29mXOZX6auFMKsc8V5GetRAWgY+3YC0juJ9h2g5j4yP8NaJ00SYbrxQ81trTEGrRP7GUy/aK2/ehMTGjNT3YY2gawgDROEQC9CtipcWaHt3U7vHyN5jkCQfeN/DlqPnNA8/euP6TaSdIRvopmTukJIR1Q3XOItCJQLIP4BOwUfHIotRFR5rkPLhAOU0Satt0HbR5PuNz55we1/xWgwKbNJqIwFaGU2iA7dCQ+uJvU1oDS2IdeHU+3eXwLiTugfaLtmuyBSHhRQqJBA33sONagQ67f4H3odHsGvq6pu2RghIDQNRMGoRqU0aTx1mr4nA2/Tcsr1x7iLoYT+VDRgxGYNfSSFYg6YjQ2r7mjb7xDUy2eiwV87M2Bvg0BU8u6yx9I4Qg7tVyB26o0wFZjBohRvcp8E0rjGJ4Y8d3A+UW+RawjQHr2HUoPUB9XqgIgXq1VNboXhJ0FrZj6fW2FuQhUCJo6sqZEEpKA7rdB7a+F5WcYTK5z9zrwP/YRlTkyHa1eOBLPffCphvKZeViDCsi7Pe+I0k396d8hKVjoa+XsODdGwrqsT4kMf2MNs5jLdqtnNldRFIs2AJylwhDiUmqUuSzLD2MSG4Dlx649Rp6x3ZyXBZFUaJwTXg0BjTLurR51cXmNxjSIPtQFX+vUpCvHDusl2+PIUipmrLqE4Ek8ZTHFPyhZ4ToOlpt8CWLoPEHVrGGAowkdjfbVMMrRVJlCP9vU6YoWspcsIk6h3dPcA8GEwYqCHL9wjiRTS/BakT1q4rp/pu1fWSp/9vn73PGTVCPFWCEsh3Q1sCsfJGt6m8TQ9sNqrCglg5bbvxqrHNRtV+aBm1xHEMEaNk1K6uIZQp+9ysUoGhCRm1WywPH2L+ZdQEldkAPOnC3CwCtSm7cAPx2fIKU3iaRDHiaYp4OMGSBKod4nEK4qPCDUkigFAMX1hcBsiTB9Sixim68FrJMxUjG4r9cAM0HGwGkmaaKeheLq0Hpromxo3wp96VFnmpEyDmba4as90Hxqx/J8N1AK08OUIO5/TcAv7cIOehLRs5T/3tn7uf7E8cdcMLOvZkXW2bcEfei53eD7VWfToje17qOgF0NF0skUBXnuoSlfbye/+uDC6j5lixmYInPbj/bsD3KrEU/Eel1YFR3Xw/WvwcREmUKmyQelyeqp//7guXIU+WMBDKFBHQYjpcj11EBoSWg32QH/ydhK4LEMs60Fjpz7q4WK0RlWye9yzxMTJ91/fPUBWmkRD1oj9wGgTUJ8PwpjFsofwfwwOLOEY6mLQ9h8ZALczAajuRcoWqTAf+RSRryMj7cChJRv3Czz8gGbxX87tt2TBDMO76YRnS46zb4h8vWXnu3jasx79uJmXav0C/RPJyBfY8lUp/3w578F3vtfPnqN05hnmGGJJwBxXV90RS4dQg70Feq5+Vod84ed0uXblM5UJ7g6Pe3dXvhsyCBHFtqwxEuwgpQ26jhXxidnrGLly66N5zCC9ay/L7CW0hjq4Po/j4Oyykw42WE8xhWJEz3cCrUcJOkPerwQwXh4VcaNOM7x6G66UQoDDQIEeduYAalWQcuKD/3mxUYXTf73zuQQomL2tLwez2Rwu8t5KRMvVbm33eWsLS9sT2mgu9sGdY7wa0sa1272l4RHThron99qHHP2rPPQsdx7DYKlrQJJoo1frq6btHZuB28moNlGkYbfHGVQfX1EbuZYJ5aGgHTP6y2zM9PkqXk4nA0R0j3hAaorg1uNEvfvHP7dzZS3C0IAmR59qZSqkQITnFtHuQi5LKukgJewUJeoHYqLDSRzyvi0QHR8dg9bkF1rd/wqkTm34SnVAM+n83FMferBhVottW3FJQ6+vOqL/3Tx9quv9ogXm3hEtHHwjicOdmo7Z+eLPRHLHSiiny4vaH6xXK6/VUCPbzaVfU/v2H7ImP/pg9/e0XbXISxp2p6aSkPP0kJrqcUiXL+PPoSjXlp6OeZJ/V3cePYkzWfAi4U67OzMzBFdBOoeZP4mEpDLsKUxbyR6072YdBr9ipk2fd+o4oq5vcyZJx8aqaxng4vln4C7eTmgqrRHu5l6ZlipZ1kDgRIB7XNHbEezj2PvYKxjXYQSWlMU24Vb1ejQ6HnKUOOd02qiOWVL7/0X/3CIPN3rJtZxwMJy9VDBKEctRcKwi3f9g1AgXwHQTw9ADtp0ZsfsKE+zH4zbyG0RAwHDp41D758Z+wZ77zop187ZQjYaJwgMMYNQ8ZXcHIelOS42i7T4kwtGc0ZROUiGGULj1gyH70+MreK0trNgnwV+ms/1aRsQr5IrZNF5pZpQkJPi3Ap3oJlGPL91ZIwEiv3I4+waY1BjQKKKVjIcgYjnMvyEQ7VmkKWArp/PH33McRFEGveMq1tjb7aq+RQkkVcUc7lzjUQyXp+y+/8l7nqVX+yGgyrVvMyhuTUcQcvZX9vSO+ORGJh20beLNh23FXF1Fia6+arffT0v3gE5+2V779vP3tX3/LGbXAcRljVjRK0V9laEwVnfYAzHPEC3jTOATJ2CjTdjFKSLbyavCsk3gXJTysogG4MpnDc2dINFo8C0WHB6+AANZY39HRkXRZvOmIGkRoxNEob6TO5xqdzCGXXGymuF7NdFFUYNQejJrDMGXCy9EHH7SenT1OnyrBspytzE0QKxdAQ0ZK396of/jfP8L1yzv5MR3Z1jSdi5kC7cJdyuzuOOsRRXomVKtygmpr4M1uv56WzOAZHtb1du41wEBZYFIHiUdM1Ed+5AN27MhhO3/mvH35i09iKI2Vs2ZpkAUHKEc0aH3p0gXCQT98gNZ35OyBY4hsFaZZmhBxmlQ0WxAns5PX3d6A6zfWbZ35gDQSQTdlwtFd0eYgkkoP2TzEDRL+7OuWaMLbmg4OAhnAC0OY3CSBKtunaOUEMVYXBUYOr+wnOR04fqR1tNtPsvAQkZqDbsk49pDBHd3cOukur8io+u8abtw26gbr7/aRtD5E6Ql7EvS9JQZexpeHO6/UTnxhVcXdFrb1igAdETb2Yqh/8OEfBlbF2WWybv/1L76Bt/AaGDLOBHJJK5eodpT99bG0yFIFEs8Q5IiIxS5q9jit4xDGVfNPewAVfzO0PWZm5vlD+GDksQlVpx0BBcKBioreBC0QsG8A8O/CFb9QxuSeUWXRTeD3DZMAFyiJtbRhCD1YgQbivuOHGZWccOQ5F+S1rzmVLm5iA6lmZFRNOLrw18pJDtv/51/5IRwPg2qoTMSJWq1i/8FgIkpcQnYFAXdHzJO41BbdpSSmFcWb4ZSKhXYi8z4hIXBkHnzwIXv/+97D9geWx8CkP/23L9jVS1MA+wXmnpBikpHD2tWPVztPIJ5KdecjSajMHaWc7QDDivSQZFyYukyXYRFjrKO0nuVJE3Mz6+yuVqeXaoeTpznTaJR1zUjQpWd1CIVSVPP6WokvCZHq+m5tR6NxqVUhWkg2OD5kh+4/ThgQd+Bt3BSKUHm52aiu8Ukl4+0e8HKSVoX6/uCfyVPxqLZRBfjxOGFL9Y3EVLmYq4VZVC6avmvDKBnTJTT9TpX3LfDvWtot8N8EenR199kHPvgR27dvL9tz5+EsozYFx/nS86/ZTRbRypv7+/scTq7qd2hPCZIevQY513UCBqm/JZ7oKxGcOwAAHapJREFU62auKhFBkceIOTc+S2Wk7cBBtE7awKPR8jDtlTyTJZN0CZ5/6XVHaWpEssmNkBMoQamEXWGixT1gAeP0088P8XrarHHPg/fR0Y3bunayME2ogmKzURUC5alyNMHRDaOqvJcj/u4vPeSJ+loZ34NWejqOHnfhwQVnVO1p0noMlYBuw2CremrV+noRYUXHF/DhMiVJKEDX8cSJH7IHH36/O455klEFHBogi77yzGtg1WWkOJfdhcuQScgM8adSAircRGhfJzGadPlNcOLwYK/bBNnVK/1owmV+lbftcOQeFaLfQ4wVbHvuues2SY9Ku/oEqZao2uStkhqVCB+DdBLk8UXWMaVYDbL/8F7bwRzWNCrqfjjbGiFCw2pysDbqkZy0iodWHZzUKW7hU2zljPofP3cCk3pxUAx7G6/Ka7S0xVt1RLkpDTxAXkatESN1I1xw4Ps2Q672k8TaiGCArPw4XjrGugxdvGaS1tno243E58aF62DKi7bAvqglcKbewx7mP0toB5TA9Ltr4GWFBD83r4ME1aOEAzPVydc6iMV7SHzqGigmi/IT9NEwhAhyyXEunMvZa6fPoCfohM4L0dfi9wjBgEZ0I3eO76KrMOt4iHvuP2IHjxwgXKEtoOWdBAnIgUJaUMYfGdWLISAVjKpiQB/eIlyPOBL77/utz9zjuqnK2G8ZVdyqdPl6IW99XBVjCupU4BGrvEAbPsmbXQx2rRQv/gpmtTdHvIsFA/fdz1wTksUSb6KOTqCIYCwojydGP/f0q+5IzkEmC/SnEKDF0IQ23fMDtHID5MAxiiFn38OjPQRtItz8bkrUuhYooDNNcePiVDfqxErWqIUKWoigPtLCQtkuX5ukO0qXl+JA6+Zy1P0B4FUPRHaYymmJmzyys88OH93vNveq2lNVpRMT1eY2Supg69FMzqbcYB1/3fi2fTyjtkil3/zpY86o8hJtbnR0Ht6nB2epPnb7StQI482UwI1tozouhaQWhC7y2jB6nIeX7fVL41Qj2kz+3/zoE4zv7HariZRB15ZnwI1ZW0e514u0Z/L6Mu1iJax1GnQ5xha5IFobKWg9Hf9moMfmWQbeOdxr9z94r9uxmiTG7eBnV5lgCXfGbCeLu4VFZ2cmnWBOS201i7UOVtVwzzpo4PSFG5D1aEzx2CUI8SiIYBh8PMnv7QT/vvexd1PhMd2tNaNci0C8IKKOdhT82zZqu5yXp8qoLnE5T21Jp5RXvgBJ7cEeYEILfyrzuy2SfIO6i2qk5MV3uqWtYoq0g0TPQkEFjRAtTLwSUa0FCSmJu/BUPeTlkfc8anvvOwEoZ0yH4a80g7O19AyaT54jRczTYq1huNE3Tp+1C+evOeg1xYSeiha1X5IM4CaQZ+b1FCDKz64dY8xDdbkFCfMzN2wPQ269TF9rZH2dzRJp5l7XSIQ7QAq6oaqywl3Dbt/UjevX3Xh6mdfKglVjKFi0X+oqPOoHP/QYw8TEZoYpmiCPIj0zOYXsomTYJqHV3WjnjIqqUP5og5mM6nIICcyRS7/9mQe8ikpf3ARg22W8k1BivBJ3Tgtby9o0prVC/C9BZdPJQtqM5vE5agOQvaqK1B55DBHFgw+/D6EZSYajX8ujmmPGvpae5UboAVxsJWdKuQ+wvcqDCi6iOrlw/irGp9rh4jNcWAT8NMozpnxaoogaUOs6ukEJo3hmhoZeP4SytAVpStwyQgntHRRZWwHsl/CiAiRN/859rnqaZ2+/ZvdDbA3yEzqy5IfJuXnrHU6hVDmC0k89fhU3GIj3r2SXphEpEZpT8LjVTm8ZdaMK1a+UUdXexn4OAf2Hn72/ufGYthaD3Q4DXrwAv2ovCRfajr1KWOJZVSmVqOsl1NVd1+OR/Px54L777AMf+ijJgJ0pytDEJSwH43QeD12E3VGooPnH3E40ogTUYbOoT/7mm99yCxFEPS7Qr9KbTbCCScWBCx3EyjDl4+69bIngcUnjuybcCOYaJLaOv7az6dEfawz4KjO7pMuUSwkAL55TBE1JnkpGn0OEVuCa7jo2YRN7JggLcAZIeRRP5eFx9gdIe6AdABtNvZZh281NDzZ5FZZr27cKIt9/gPnfYK2JkW2DtpkrtXVlVK06VtwQSaEgq3iqkcY4x11iXUlqtMnnQ489avefeIBl2TwAYWCUSTl2O0ugsAhIZ6tagY0UQemd6O9UqYDKKPU6uSl1uqffxqgapojx71kEvhlUKhkN93IEk2pxcLRcp1cLrilHh0fHWGkEfuVrVZLgOo1A7UxV5hcKca12qLo8EE6fK/EsQsRktdWH0yYBxTCPEdkDfvaRP3SDclynoKNurmzmLCJjtXVmgowtrZm3Z8vLI+74t0/6f/zcu5xRXQHQ6ju5z/FQGVbLr3RnihitgEhMmiFPxSLRBWw8x6Wb+PTII4/YKBhSnOXA2Ci1Z5d7KmSD/XhNtPfNeZYNSqCLIlBChQCTKZEgOiiyrWBLkuN9/o0z9o2vfwNyQ9MqMTRPqJSBUSKzRbJ34fV6ooRie1rZnbCgfdfqFHhVn6cVFXaV3kvG1j4q6QrkfdJUFZg3lcBYC24klRzezXg7nl9g+nud5qN+Vq/jVjtLAcDJcx0QaSNaecZ5LrjVYXm1a1xx9Fa3w/c7v/gguw+9reFeJpM7tx4j5IgSj7USRNEO/Zh24IPFFPvUPOudOGi/9Eu/BKuP2piYGaNu1hJasgw9IU3KoXKen7Tm0k0GHdhiRmxWovBj8ARhIUy7WdvLNd+kbbxf/C//t1u52Q3BrP38GrDQkSzjiXp/AvzKxNLE6kK0QEE9fYWHTuCR2uce+IdvdSudOPZSeqsg4fuFI3XDlHAFI/vAueO7doLJ4Va1rwqOoOQ0sGiv+B26GQ4m8lpCOTKmh0db/81Ti9qJynuEkxLV5x5whWb7qcR6Bp+MKAM62Q7lnEgFlX2uvYLeqsIbl0BXe0P/21/7XRvYMWRrN9mdz36/FHOIMYJ+QCs5nU6AY7E0zYDFvFMdq22WA+v6SCQs6bCS5pO0Zx8WXoqbFxmceP2V00A0dvtp5z4QSiuUmvx3Wg9ExGOahIQeykgJ4XrRZam/XyZBaYmturd1briKFadKVPsdiNiu2PSFLDdNYUzd2eXEIIMbHTY6PginwKglm93yjPvUEGWouHGLaVpGFdRzN0p+jsH135q/bcMqBzNl1M9/9m5wqtevERmg9oArWTFqO1boMZ16M2q8KbgHiKEn3v2wPfbBD1nzwKO0Pwo2wFwSUwkopml/UDW5w8P3+diQFkB8GwTwCw7r0Zoin33sj45wLLMYNY6XrlNVSbKZJoF8+c+/TAKs0BVgqlkbfDFSAc9eJc7qAThaRjM6SO0PBu1kNHKdOKhBDt1skdEyaEKLarSOnveiikxIwCN+tDmSHQG8N21NfzmL6ILl4MeOH7Cjx3g+C9eg5/rpGS9qRJY5Vc5T8f5tjUqbpX3KvdxEnP38Tx+mmxqnyqi5oYUwYL5A3Atpr4hGjYEnglvqRDYwwPjhE/bej/wkywTvR2qInIY37dYIuOeLksgwgsC99ktrI08wx3iNnvGkpYmqSoTV8LAwv6PJarqSn99JVVZEqCZBhbjN7/ztM/bma+edVqmH/pDim0Yt9SFOQEbTBaQYcAjRLmkfPw1T6GMDV7YI9bKbzyIGah+fDC8mjpsrRv5aOW6vnbtqKzxi6Z53P2qHjh5igQL4lo1FCDpxiMv8Lh55x8inj6E2HzsMmshAA1pAjoJbu1eUQKXDUtKSls/3+Z852lxGVNvXz3p17QAjtiTZ2pAmvqkfw2gx+Q8DB3vsxCMftYc+/mnOUxSSN8tQGSM7GGizUeVtfk2+Sf+PjN3P800qyBq1rdU9f4+YVlO3VtCFbRQh6nGVnmKzanrmCSfhClPU3/32s9wc+SJbIWj6yZBqCLYzrIynpJLiYTcu0WoySTlB76atQcCooggdiOdvfV04W8c0yDUIIs6wpfz8jQW7MEsrhvmtncxqTexBSMfwW433PxjVGhB6Zg2G6FQp8kSNJhqqEg5Uoc3ilpcLx+r3trogvn/9qf1NH0crBB0XkliMJl0UHCmcpjVCSzwmrn/ooD3x479i48cfc8NoWZJGksm7PBt9Yig83JNRW11FlagS7uqIaq+fn1WeVfr7Yqu0FUJQqCndJ3FQx0uyHe3rFxmiMZ6yZqXYuf/Nr/21rTL/pAFc0XP6EMRqe2k7WXRRpm5QjmILWmRx27BuqsaV3h6rpgeB6YiqK+rndN2kYTUFB3ueIbopCpRYaodN3HXc+sbZQcVwRx9q76RvyQb8cwgv2AYvLlZVJQm0zh/FVo1FCBV5UlL85198fHdT3cgCcVHTJEG+UdxjgumODPvuomO77ZOf+jnbwXNCymXtnJY/SyrJ0ATT0E3utHv8nBqELdWft6BFWBYFR54Hy/AIuQB6fI0Eac+0NpqJ+dLwQwAv1nIX/BdnpjIjPtILsZe++yKynze5MW+ROm3oJ8PqyDvSpnVhHrxpM2Yyopcn9L2iILXryvG/LQQQUoWGI9xEYzWX5gGJ6K7mmU5R7Pb3gH/33c+40ruhGzVK1GQXLGrC4CyfXwWQwDmoTwVBE+T3iJ8FVzi1jttI9Kuf2N+skQgkm5HWqJOOZYU7oe3gBw7fYx/6yX8O5GTHHmM4OQJGmV+SwuPkWFU0S3DD3vHTZIY4+tabV8Dyvs7BYKAhxNyoFhVoLEjcZ1C9LrdHFUNqTkAPiGViOkT21jNUl2mRPP3UU0wst3ZHu6PsLfWWoVzdzUeVmO4egChS3Sm/vbaH04qqyuP9iFhvDyo7xWJrZWiF11oln1yma7DItWhNk/RVmSYrRCbut6Pv/wR9sX4wOseTuNwdy9hwYp7JbYxb4no4WQlykPesbW/Vp5zG9788sQ8ltR5YTadRT1bgzXHTbJxE9PFP/hPr2/sgnAEXQKxt0PGs8OJMMRDMWcmpoBwGwrSghNfHUbh+iwasaeoEsB4mq/pJYBWm8PwYNsjnerafc308tEDS8vEmRevlUO5pBO25Z5+1sy9edEZT5tVNUtJqe6wwZB3wLemnN1XjGdSR5Zpb4G+prxsqsR3cF28MLNSjQbj4AjcngxLx4tw6A8Wotjk1ygdZnKqQnLD9D33Udh57AG6D/aokXT9zVClaQXSxrL85C/JYQGMLPNMDb9ym1Vb19asf39fsZkuDZojCQBuJCDp5OOBHfvxzxJZ30yCjQqGDqVpaSo8o7E2Tul/cqjKoX0+6bXEG8k6nDZCHiDdQJaI753T83rCFQHyA8cQgK5eq8AB69IYImDK9dz32SA+IEcMf5XVuXL1izz/5ckun7yUaEd2ezsCbBWhQarW905WxMp47+ng2RuW7Xd2vaRmnYcABZFTN9xepunIsVrnKopklNlBmqNwCjIDmCRFrPC914sSHbdf9D6P2g93CcBWe/ttkMUSYcNITZpyTZwyS0tG7olZskh/qzHFxGn2//hNHm1XmuRMMiunp4X07J+yJn/mnjF2/H5jFHY2wTIBigAOGZ3qZVB0BzRBI5Otnv4h31Pnc4UDnrp43cYEhNw3HZ5yEGkIHCRVCvEmFg2p2gUELZq84clqd7AMBrM/PsOCAOK0tvDTrTn77Dbuqh3LhodJWbRizVWdX3YiMqkHtCNaOdRkVAwoU60YKsOOdMqqf7xP9J/JHQuACNT5rEljW7af/n2AxwzJThSxNxIOLyTE7+tiPWdc+nvDDWvpGTbmAUORjaobuQp2bAKVkQ3EMzDO3+n08erQ8RUiYp6L68T1NAfI52sU940ftoz/xWTt64hG3j1nYU5MmLqO5luLtH3f6+lvf6ZG3d/rwF1mXgQEr6UWGdxnzpq0RYGmY1r2FMcrMjZw9+eQ3HRLpYG61pAcdqEEoGSM3tyodqvCp+kTCycSNMN4b0fCG3jslrKSP3spSySkxrB5Fzx6CPGM9RR85hJuaxWPnpaTnxqZBK6upnbbzh38aVTXKavBwUVOHxPQyv0fVmBzG9e+0AVBaL+0g5CG7KcZCff/2U8eaKzyCvXNowj7y6c/YPe/7sBMbrCChSVDReJqV759Rg8p4miYkntVYUlvDuGWY/jJVjh4404UU6Llnnrfzp8+7B95qgE4cqgy0QgnbQEChRePywirhqarF3hDmCTFoWnRLeFLbXDMKetK5loDpMc7ZgmfUHN0AtV2ysGqrFAAV+In1HD2vvgPW98gnYcy8hqSGgIN0BJyUU8Mjalepbc0zARSWwhgYWQL75Nij8u9+8WPNh973uN3/8GOsXR/jO8NkQDIVRySm1Zuqob+PRtVm4ACBLsQF6xlS2lMtzy1CdmsreufaJXvjlVP25F9+lUloEgMGCamawoNE8TWjiNC0Qs61x+WFbvM/r0fsU5XH7KuPsCWqUp4sL68Q5zMYNceSqjWuNyYCBuxcYMK7SFzNMn3dGDnC4+YeJ5/4nRBEJJM2WKg/p1LYxXUt0eVp68LoSnwq88W3+JYmzza72Qoe0L5m7ibFDsdHuVeLyb2HGXw/jVpkrlSiFKER/e2UmI4p82BTkA1lGqSdvzltS4w+3jh/yV585hmnQ3Vb1diCEQLgi5zRwhlNruvCRM5ElEA5CT76M2KQhKcb6v1jyDRr7NjmaavwACLN8zWQD4++K+ZWKEqYAxg7apkhHo7IqjtHLfLGVCKrSand220OOqgymXBS44/2CKoIADLCd+t593xByUQErY5DlBJQ7I5je76Pngqf5QKMhxa82tl9tJ6bIi9QZ1hTMko4IbYDXb903b7+5F/ZtWvXiMHrbF6nYBB60Jg8RUmUxymnHNki9MdF4qmujMVTJaiQp+bI4jkMu4al9WSgHD00X7ybkIOnrrHKbnCvLXXdZcMTg8jlB5zD6XElVd6gtgLrvTr4yOpolcZOg9auKrNFHmjZ6sHoivS5ZpWcpwJZNkqv71Oi8gH8XeXc2u5bl/TIyeW1019CNynjvOpJT5BQvFQCff7lV+wcGy/TGWCO9k3D92rXdWn5utWXrlkyv8B8Pg6hZ1+11N8uUWFoIcoC+0kLJSCXMDq/rwAxUgsx2s0afXnqSgdjmv3HeNjMfohwPahR65W8pbsqHmRUfVR4topQhl57Y6y/gt5HVYom1dxR5xoKlIpqcrUZoe+npwqwtymzt3jJlphMDqulDlyA+FC3SUdiBXCmtKlPfee79uYN2tAUI4AmtxmyQZKpz56zwAwsV3reSTj1CFA3NEa8VbLSI5FKQCQtVqyRxBR2ysC9PBoszM3k4ZzNsImyzn6rw8ePw7d62T+kB4+rGnSPGxEhLfWOcLuqIK+T6lot9HaaXvmnHSkeM+5ij8tuntTl+2lUPbjLMU+uaeZVQ+0ZWDeZTeNNPXjNWunreTxSq430rOpJViL90V98Ea0AmqsqhBBrOURFNmbPW+niS1blAQ59yC+FGKQmdNvg9KRzDFnFw8oYVglIsng9PGyNKYtAs0Ava86uVVHA3PMhO3Lfg96QBxjeax9x+0jgGwWPEqCrpBDugSwkmubJGHr01p0/bmlbb/Nt7YDd/qc2bt3Ar5u2Wm79Xu9u3Y5jt2JfF+dbtb+KALFVIp61HPzkxWn70p99jU4r2gQevFXHeAMsu8m++i2rsMhxL4ksjaflSVbD7EsNw8KlWUTuR5dQXsL7Ynr+1A7IcwhwaM5sOmLX4XUrAz02fORH7QCb4OqggjShQlt/w+BcLZLQ7xd/qyE5fXikijiA74FR9YKbjfW9MOrme+cQQGtXVLtjqXAl4+rP+O49dvr18/Ynf/oNyxgdWqlTSDQTQZ6Y/voLluAhYnGUgmph+2iNpPA67VCVGLkbak96qHKd1gy9qTr86CpPSZ+m3dPkCRT9h99nRw6yn4V2+jrrPjSorAe/N/XECyo1Td6Q5x2RpGT1PTXqdob9+3qqe9TyO3zIqDJoO3EqvooDWGOjWZ3dUzt4QMKzL75pf/XMKVsHXGkRYliP/FiZt9ypb1JALNtAAOwLK+ZjREiUndbOdfcmwcKgAYYifBDP0q3O0fZZQmoU2fOI9bBY965dvYQWPTKE+QT6ZGzSd/tk1ACUKLuix5q6klxVHi2o75Wntm3S9thbvPWdjr9bcXfnDyXPzT11B73a8iSMfXPymi0vsIyhd8heOn3FXjg76Z4KXEY/lSRbZy6+YLVXvmV7jEHdLhp9JRivJmtEufxcAzYsMEScnCNed0N3AteyNy3fuc96j37celind6CfpZCoafJIr7X8uwMiX/yCloWXQQQFiheJUVxHWhSgoNb/15jaVmts9tbNMbG9immrN2+YcYtRt8bdNiKQt7Z78mpZe51eEAEtnzSPXJ68cQ2h26JNzvNM6TWI6RYTr8eG5p/6qsWmX7Wu/gSz++Bv4FQ3ysJ5ltNEYKOM52U36uwrzPjoWS2af/geG73nY9a3r99GqKikBBfoF/SKt7RVeejBEgkvC771eGPPsK6b+r0wattg28bWTWlw20R1B6O2v9exYi32qy2/kaFVlCiB5dk2MTYyYFevXLCrTELPz6WdVF1PNyvSBteu6ubVN2zuma9btJZm3r+bZxCo8tLTJsG20Hl6goaW0Nxkrc88cTOx5x6b4IkTfSO9MFAMYtAUDdKa19OHRZ6oIFkHKYiIyvBa7feqS/2eG3Xb2PoORtXOlM0/t/EGXbvXe5NO/ItxZUh5rPCzPhRjy9CWN9lpOsKChTgtkpeff8MuX5miQmLlJ4WFv0EPi13Ss68+Z4U3T1ovo+QRRHXq7oYxfEH8Luz/AuufrrHhvdp/3AbvuttG94zwhAuU3TyxSA+d1e90a/kkgKMknc/TvKRYKLWQyeaQ9z311O2OuNRGW2Pu5gj6Tkb1mnYe/9DWd21u9IWh7coY6jrPaA0CfcZ3HLRTpy/aXz/9d2z89bNVsoMH5nAkUbIs/u03rXbjNB4I9JJKigm0GmQz8yk2Bbd7naoqsuvDtvPuowhE0AYEuyFq4CCoNKX3knijjOgjz1aKWY0MRVih556d8ta8g9vmsfX4b3tE3y6TbEpE75TFtzOuFNObmVp3fFrrRd7qKNz+yu33GaASUolYgQe9yYNn8jQwR3fuZmQIUcaXv+p0W37ipyZfGsgpc6dOWW3qGoCfnj69v5KG8IBb1xbztthNgnrPJ60L+WU3LP4eVucnhDzwTL1OVo/+hHECCNAJaNX64FZnSM2a6e/twP8PmlG3mnPr+4uxak6NwxDydA3xXr92A0oPsYOk6LSc//RLT0IPs18aTjTO0V278CbbJV+xJlvVYoxmNnWEafRNs2Y+cujdFt1/3Cldxui9jbPew0dHpEySyiPUY9sn2Z4QoeE77Q6QqkcdD2dMyfJbT077QfbUdzKo/l1TM+qfaXe0Hq0sGf06/bZFnu23uLDCuuQqw79nGFHP2jBbLdR8nH7jeStePkVHlKWPeOpyCAl8dNSGHnjEooz+iO06NsJDEjHYjB5OK9kRvTrNZmn+qqFiRPQfRyyqCXTXwdXuGY/T/YE8/t7I5u3V83Zfk1El/lD9rWSm+lwrkKXv0uDwOZ4XvcAzXK5NLdkMhvXDBaSIwcXTr9v1p5+y8T72tYRGbX0E7nTvQQB+xViSZnvQrmaWSHBwDhJfOBWO1DTqOki2L7qP9xiTEVszZGoE/IAcf97IFvtJF/BW0tu+x9U2sAaE9SG9lAgYkcTCi+I8Y9TnC4y8Xzx33U6dmbTrzBiUaCoi+LH69UlLn7lAKPhLm43usp4Hn7AIMwURX9Z2DzJQDOs1t0DchdmTFleQqr0wweNDvGanmoxtyCeVoKP//v8//rcbVeT/W9Bq+zJ2w2uJf246pEUPujF1DOwG1jiSXSzvklTh/LV5e+rF03ZxUkptNLbU9ys35uzS079nyw0eOPbwj1pqiGUMiNL6uylZy5q1gkABUmltn9tloGoOeOWqfIynNriGPpwx1a1tJawfKKO2q7P2chEv+99u1M1hQJIeh1vJ7hVwq7CsFpCpa+EU4XQFguqoIj7WtslTr563kwjgltDbVnDDwiyPpaMCG+ABiJpRDRAa1HwvQ5QkU30sXEBo19obo7fi0MnGehO+U30qZ9TW6il++v8BZv2cCJZVHY0AAAAASUVORK5CYII= - !record {model: 'res.partner', id: base.res_partner_address_3}: name: Thomas Passot @@ -28,7 +28,7 @@ use_parent_address: True function: Analyst email: m.fletcher@agrolait.com - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_5}: name: Chao Wang @@ -36,7 +36,7 @@ use_parent_address: True function: Marketing Manager email: chao_wang@chinaexport.com - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_6}: name: Zhi Ch'ang @@ -50,7 +50,7 @@ parent_id: base.res_partner_4 use_parent_address: True function: Production Supervisor - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_8}: name: Paul Williams @@ -72,7 +72,7 @@ use_parent_address: True function: Senior Consultant email: david.s@tech.info - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_11}: name: John M. Brown @@ -80,7 +80,7 @@ use_parent_address: True function: Director email: john.b@tech.info - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_12}: name: James Miller @@ -94,7 +94,7 @@ use_parent_address: True function: Senior Associate email: charlie.bernard@wealthyandsons.com - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_14}: name: Jessica Dupont @@ -102,21 +102,21 @@ use_parent_address: True function: Analyst email: jessica.dupont@wealthyandsons.com - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_15}: name: Phillipp Miller parent_id: base.res_partner_8 use_parent_address: True function: Creative Director - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_16}: name: Ayaan Agarwal parent_id: base.res_partner_9 use_parent_address: True function: Director - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_17}: name: Daniel Jackson @@ -124,7 +124,7 @@ use_parent_address: True function: Managing Partner email: daniel@jackson.com - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_18}: name: William Thomas @@ -132,7 +132,7 @@ use_parent_address: True function: Senior Consultant email: william@jackson.com - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_19}: name: Sergio Pérez @@ -173,14 +173,14 @@ use_parent_address: True function: System Analyst email: robert.anderson@chamberworks.com - image: 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 + image: iVBORw0KGgoAAAANSUhEUgAAAF8AAACACAYAAABtJLUPAAAgAElEQVR4Xu29CZjldXXnfW7V3apu7Xsv1fsC3UDTLA0IsgsY4r4Rl2gyic+bOGZiZvSdycwkcebNJJNkYpxg8sYYTYxvlChGQFEBEVAQAZutofetuqqrqmu/dff1/XzP/3+bVmlpaMA87/Nen7LoW3f5/8/v/M7yPd9zfpE6D/v/Hz8XCUReTeH7OtfqFolEzJr4b/6t5yK+/DWeawqEEAl+62/1esR/NzU3W42X6EcP/snn+EdYtcp/87vxnPF8pVS1SqVisVizNUejvCB4X7UafGe0OfyuWiX4oCY+8FV+vGrCP3GDufB/4lFBKM3Nzz1fqSDlSA0hRUO5IaSf+YhauVx2gcfjcT6r2RpbulqrWqlYsZaWRLC24efUWMkmX3CtaLgYr+ICvHrC/4kbrNVrVkJQTU1RBNXkApGwSmisxBaLRa2JJyWgSrlo0VqOv5WOC7iKukvA7e3tFm1t5YXSXgQYCTS4hnaXymwJHlE0v7kp5v+N3gc7id2lXaDP1+74aXV45VfhVRN+zQIzoJuNIKBoLH787qSZVkEgyE6aHmhi1SYOj9gzO56yAwf22ffuvcsKhYL/ND5HQu3q6rKenh5bsnS5dff12rp16+3MTWfZshUrzWLS9ECsi5m8tbWxSDwKpSICj2HdGgvC977ysv6pb3jVhF+to+WhLW9s/ToC1mK49oXbf/HYlD31xHZ74P77bPujj9jY6IgVi0VUNnpc6K7ZvKeh/TIzpfyi74RUe6ctW77Czty82S7YdrFtu+gSW7J2begQQgch58CioPhWLNctEY+x2179x6smfJmUOs5NdrkJ7xjjhnnCytlFW1hYsMcf/B5avsMefvghGzl02Kq1siXRTglY2p5o7XNzIaGf6D8a/+5MYEYwKWXM1mI2Y/l80ZKtKVuxYoUtXzFsKzdutCuvvNLOPW8Lz7dYDQcbTbTJKOkyAo/9Mx7P56dOd7leVeErNEHf3KRUs2l75skn7eu33Wr33nuPLcylLSqByD6jmfoJnGHwyGRL/pyELduvh0yHXuM7gOipYY70vF4rp53LBb4iwusqLOgZm8+wX/7A++2Nb32Hxdt7jKcIdBJWV/T1/1Xhl3F+sWiz5TPz9v3vfse+/rWv2NPbH7VyPmstybgVa0Q1YRQkZynBFStl3ykSrlUr1opjlVBlhvScBC+Ba2c04UO0I/T3ZDLJrgmsuIerLHbCYtbSmrCJ6UnLFwt23S/caP/2333MztxykXTB6rGf7XL/VWp+wwTUEFwZISQTSQyyYmdFHoo6FL9HrKmatcNP77DPfOYzdvc93ybsa7FUKmWLi4u+4xW/S9Ae0SB4abjbdsXy+ghEmEgkfIHKpUJgvhB+NNrE3yKWzZX83w0hBX+LetipnZBnB7S1tfEZMcti6nKZjA0PL7M3vemNduONN9rSLRfg9PmyaIuHXRUtiFalqRzkD8Z9nfDQfcmHnU6UdNpm57jwudCmCLF2iTgbrasrqnGrgVMt5+yhb33Dbr75Ztu5c6cNDg66Ochk0tbR0eHCmZ/PuDa76XANjh03QdgUqxQxHQhelqiZ/2vY+igLq/crSdIO0K7Q67RQEr4+Twua5PO0k/TQAvh7wp2h/Oqsi7fZuSzA+z/wb9gZNevuX+LKU8Ihx9gV+UI+XOxgh/qP/++lP1424UdQ30KpjCNNeMYpM9FcK/jPp2/+hH3+c5+zgYEBtC5rs7Oz1tnZ6Vqpf2sBqzXZ6MAhaxEIPH/M9kuA1aqcdSBY3Xy1/JztjxFWNhxysEgnZsnsGhawhPC1QNl83mP8WCLuu0HmrNasbDhuF19yqV14yWV2/rZLCVfXo0z4lrhyiB8XcsNDyKjp8VL2wMsq/DzaGZfZ4dGsMG5h0v7b737Exg/utXokZvv37/cb1Q1PTBxzyECLMDc3Z9F4iwu/WA4WwHcU+YCE6IKsB2GpQwNotMyQFkk/jeelzR6/a2FcAxRhBs67GTOh9ym8zLEAuULRCsXAzBXxRwPdXbZk2YANLhmwK669ypYuX2nnX3iZDQ1vtGqJnZgMvq+RFWtnnuiiX8oOeNmErzCyiaSlrK2NoGYnRu1PPv67tu+ZJ6wzEbWW9m4WJmFTU1M2PT1rsaR2SJ0oJusCW8wWjsf8GKxAmxC6cBllwVGgB4cMtEtQx4ZNr2D/tXui8dYQC1KyFuwa9xlhPtASkw8gscNMlfApZXZmFV9SAWvSa+YnFizVGuc647Zq3bCdc/5WFmO5vfFN77CVazfgC0KbD9ZU9URRuwvzGm6In6vwZf2U6MRbovbofffYJ//sj61ezFt+cd4Ge3utQjwtrV/E0eVyBUK7Zps8dszS6UXPUOcWFo/bYNdod8LBTeohEyVbLeesnaEFayVK0m5Jp9M45sAU6adhfvS+xnPZhXlLdbT7rpP5WZhfxPzkfJHk/LuSfZYh8spkZ/mssrW2JWwxV7RVa4btD/7gD+ziK99g7finAIBr2CDtvwCsk3K82MfLp/moUVOkZDt+cJ996hN/ZHOTR60XoccxJ5lsnvCvFY2ftumZOcuy5RXxKySsoklKsjrbUx7ZsCrHnaRMkITrpiZ0rBKWBNrCQuj9+pvs+LG5rAuyYXIapkumxuN+3hP4jWqgtY6KBv5Dn6O/Cf+Zn59nh/B68J4lSwZt957dtm3bVnv3r3/ENm3aZOs3bmDXykTWPChwRFSL/GIlr/ecLqTciHak+Y99H43/w/9sTcVZW7l0CKGj4bGUzc7nLL0wZzmyTgkqnc1hb0vWkmpHMAnXwNZ4mFjJNLg2VQPTEELAFfCYhqmRwKT1DfvuZiNf9whKP7qmRgLWCF9bCARKZa6HvyUc1wlseAxHLOE3JcpEXwUWOWXFQs0y6ax1dLahQF3kBzG74hffapdffqVdculrLJlqc+ELo2pA3Q2E+sWswakLn/1VQhMVRtY8GiGrRKtKhJbSronH77a//tTNNj562LVUaGNLe5dNTB7DnudscjptEZKsCPFnFgFl8wX8aaCpipLaWKQc4VyeSERochOvlbCFfHqCRsQhWFifqzwixQKkWLDB3m5rT7Xa5NQ0AVYNTW6xufSCJ1JaAAk/gVmZJoNuBrRT9qDFSgJvtBLtWA2Hy/e2pJJoe9LGwZYiZLwJFiRLKKxF7mhL2YXbXkNi9ov2hre9AxtIsofSKHSNsUvK1aIlmgKleTHJ2CkLv8yNx3CcErbgXu22IhBBApxk8shhu+VT/8P2skWJwN2GDg0N2e69+2107GgAYFXIbtH8IsKQOckXSl4IqfNBDgMsEpYiYAkMS4QggYSl+YIk+LcEnE7LRgcwTG93h3WDUvainRFPeJqD6Icd6JBCGNNL+BK44nViJQQfFnD4zBgJWlwJoAJb/juGwOfwQYvZAPUU1Jzgp851tHd22ep1Z9hv/YeP2rqNZ5EHDLnyHa8EhAXBV0T4qkBJUF4l4hsJHpBc0Spzx+xzn/4rO7z7acsspv3GN6xbY9ufeIrtmrJMLm9Hjx7FEff43/ReJa+CeLUAikB0o7lS3p2qdlGZ78qHCZNjXnxvkoVfXMzrMvzR056wbvxEVzsOtJCzVEurv66RZKlSpiqY7yw+q8QbBbrJlAXVL5I50thkohnNbkM5WHwVbtDkRUxODrOYSrVY3Is5ZNwsaxy/9R/+038lGtpIBLTRhles8ohJ3ymI5BXTfOX4NZyhnKLWYIFEqacrYZ/904/b7qd+5EKU7dSNSsgLaJAuqqunl8ihw7Y//rTH8xXdcGuHO2CiZyvkS9jaDL6h2Z2ebtqdrNb2hMhFwq/z5Q1h6mbldPu6OvgMnC1CSLbE3Wwl+ZvH9OwEXZNHV3yWfgu6kLnTd+la42hRZ3sHQixamsUdHOz3/EIhsfsEFEPRWLGcdsV57/t+1ZYsX23nAlefs+VCQlyE7oFCoBWvkOaT+qv+SmxbI9OMWcm+fsvf2ze+/I+2ee0KNLfmGl7GxsiZ9g0MeuSwSKQjJydEUThOln8X0PgCWhhtltYr3q/aAtiMhKHdoEczNjnqxZDA+cqhaWfo+2VKPI6vl62f5CgPhCwVlKZWVfWKBkmWayQ7okgyJbstP1PkdcFnVELnjJkkMUwkYyR+C7Z0aSd+pdMjs8VMzpVNBZuB3lb815RtJOI5f9tl9su/8m9sxeoNQNOJIBcJIelXRPgBziXbyn9USzZ1eJ/914/9lq0bHiK+T9uxyRmcEM6pq8emZuftqR3PHocBJITe/h4XnmJ9RTDz84GJKhaClL85jiN1BcKV81NWtIOQywhLgiwRnjYR2pVV9UIz4+wEJVt9PV1EUoSH1QjRiaInbU29noiKXaWwUXF5Jwsjx17Al8isldiB0n6Hm/m+PqpgM9Mz5AEJ/EsbDlsAH74JX5fjGlcs7fDrHxxaYmedc6699wO/ZstWrbUuYUDyGq+k5qt87SBtcYE63KL9rz/6uE2PH7GlQ4P2xBNP2PKBXutfstwmpmbtoUd+ZD19/aHmtViRUBJFs8nJSfzCom9lIZoNlFHCTRBBuJbLObNYGYWNCLwRmwtlVE6giCjCIijcLJLELcFMZDOLXFIBqKLd+ge6sAI4dT6jLqAORxuPJ7l2TBnBfQ5hLhJS5llYhYoBJF22wf5OV4IIO1QKEigBjprvnZ7N2hlr+/3ver63v8/e9yu/Bgxxg63bdLaH1CnC5lfM7MgYVBBIa7Jmd/7jp+3WL33BBb+wmHEzc8MVr7EpEqj7H3rEWju63dE2cJmFuVm2MQvADbeSoDRss4Sn0LGnq9M1W7VV2ew8v2sqbofFbgW2pRKZK3Y7g90WRKCNmKfAsnLloIe+E0emEX6LrVq9zIVfrrBT8FE5Ihf5lxhlzCixfhYTNDk9z+8iDrTFhSl4oo2oTVFTjd3UjiP35zFT0USr30tna2BaZILGJyasvbvHthJ+/vqHPmyXXXE1rw/gjJdsdk6kUsjMSHju+JTSs5sT2Ngn777VPvPJPyb7W2IL+Qo3MmsXXXQRmjFs3/723dbfN2iHDh1xjV2+fCnmZQ47nkVAQYaZYRfk0JQK5kMZopIUPdqJjBQeKiLR3xQyFnn9IguuBfE6LVosMKwFmzwzTdJG+r921RJHFI9MTFlPZ4rwM2lrh5fa3PyMsxfK7JaZuQXr4XkFBQLwRo6M2wIC78REFhC2zF8vSpCT4wYmkMN2vxNWw+aBIjo6WTi+r6tvALO64NeeSWds0xlr7S/+/H/ZeVdcC/zDLi8CrTscHtQhCKTdxzzf48fifCcwhely48Xi0+gh7GJ2dK/93//z93C2FXv66aepHiXtzDPPtC3nnG0H9++2kZFRzErO7WwGZyUspg1Hp4SsjNAlQDlkaZpCtEYStEC001xrsjawFznhNA5UkESdhExRi2M1KMICydoEvkWOP53Jery/dGjAFoEnsNw2gP3vAFuSfdf1zoMXFfk+Of1UrM61dGCy4nZ45CiaX7LO7m4Ugt2m7NkTNJmzAOev4NckNPknXW9PNyFtmdekOuzYzDw5T9Jm2OmtOOq3vvnN9if/+2awn04EJbQzoKXI9KVaf7wIc+Ii/FSSdaLj8CgFm+j11MKMffnzn7WDu3fYnl07XQCJlpS95sKtNsiFPfnMs4HNxI7m0RCteZQsVXZeJmCgu92Fr2RImh2gjRJixoGxCgWMJJrT5AUQ/ublKyKrsMI1ja/IsxMmj82wI4Ld2ImmD/YPeGRSAkldgi0WTFEn4unr63H0tIizKKrOQEWqu6vXbfjIkVEPG9sQVoH8wrlBmLD2rnYilyAvCPCfoA6sxLI1DlKKn6mzeBNCZfFRc+wIgjzraG+xt73lDfb7H//vOOHVviMTYd7xswoux4Wv8FHbpYEkNgAqWVeRl3bd/zX77nfusR0wDMYmpx06GOAGh/vaLRVFEtjG/v5+hwIeeOABNzGqUunzlPEK9FMRRYLWo1EI18LKwekmPRni/XouqoIJeUAj4smE0Y7C1QxmSFGSPldhofKHCFGOfEcbcT0r6c5c5iSP4BVqdrUBJ7S2EctnMZVzCDmolOXwO160J6aMA3MXcOi6jiQZtV4jwTtNsZRjcbpEL7KxCUwa2p0BA4pwY7IO/e1N9tsf+R37zQ//FqZpyKtxNSV5gHUno6UcF76zwoirXfiqhSryqIgxwBYCJ7n7839u27dv98w10UFYRqrf191pvRQZLt5yhtXAZpYtWwYT4V4vmuiG+vr6WJCgZDiF3VXcr5vT3/Q92pbOtSHySWAuhI9L2DJZWrwYNrq1Ldgx8gXyQUESF2D4ChkFDih3iAF+CQpQpqviuaIqvU/foZ24bFmfL/rUMfkgQD12bRGgTd8TJzmLA0kri/UsHOcszRXEod0Wi5KLIJ9WZdMoxyQ2v4CypAtEUlAQZQV6WfNtF19kH/3o/2kXv+Yyq2IyE8mUiqsvLPwa269JJUBsrwpHWu0IDlYefnLkoN322U/YY4895gJYKFAsWYAbk8va5ReeY5eceyZ153Y7NjVhd911F+agA43ssAHwj337DrhmlogGEuQBAVMszAa9kBFUo6gpkUn2+cLMsVB5BCzNVqTiSVaI4xeJQBqmULZVpKcCAkq0BKyGJDtG3zNBRNLJwnlJEi0cHOjxXSk7rR0lLZcjrwHSNZTBw0svmhMvSbj4GLfzgHWqdukheKLIbojw3OTcIkJG87m2OO/dcu4Z9p6bfsmuve4G27zlXCcRqEikvOFnO1wcDPvM43GBTHUVCJoI9opZe+QH37f77vhnS8/P2v69e9xWTswuuva+6fqrrIsbX7t+oz38w4cwKwvOKFAWq0LJs8/sApbt91g7IWfERZaoPsloi7iq0FM3PzO/EBa9g0ijiZhcQmrAADJN8h0lBKbnFOfHiFyyhaD02NLe7DBFlCK+J0+YqZTCWsxQH3UFZzmws4TbeAWK73ccCJtQICHTgnrxXqAe/maRnZXLByCgSAEZxKNoSL6mGV/WyWdOkEzO4yu0LIpuRNq45qrX2n//+O/btssu96xbDvhkJNznHC5bTStVxINE41ycCx+NXJyzO2//mrVg1x/7wfdscmzEix9tPQO2Zs0aU3lu/Sp4kmj7j+DhCPGsh/XWO+/8tm9ZhWXDJF1RXittFp7uTo5FkNmRIGuRJD5h3p/v7uz2BZGgtANlvxdLmBFxcdC8HJGOwsY4C5LHHCEbTEaWZCvA8qXdPaCQMT6jp6vbNmxYZ0VMjxIhwdLKkh26RthalJnZAMdZBKV1fEkREF69ym6ViZom881UuZ4F+SuKKLynDwbG5MysTVKrUCFe0ZMimxI79t//9oft93//9y0p+NurNs9v9Y8L/8Qws8GB1HNyksco93U1Fe3eO2+zR77/HYdzW9s6LUXo1kt4RyBgy8hwDx06REKScVsrnGf3rj2+mAKmlmMvA+cKoQlt1E0LT5Fj9+2P8IUySiBBtQnyE+bDNVyLVc+7Bol3X8KJypmJ8qe4X7lACaGk2T1FEqIWPr8fQK+f7+1F+PIp/hmsZDnkhjacfgMIFI4jf5NOz3u+UWSR8yigwtuDREd63TSQSBO7TclhL3WEHszq9p37bS4vyIOqGBGVtsGNN15l//Clf8YUdrjZbgb/+ZlmpyH8Rv3zxAK0nNDi2D77+le+aPPHjpCCE37xswZGcJrstcK2XbNylWtQRoUM/i3nWkRr2lrbPYttYlEkcP13Co09XpMNId9ckYsMa7CeayhSOOGK4wlCV0yKoB2BYgoVhc9IOAtEUGUUxStYaHsHNraTnEG2tlWgGcqg6MNteshAaOQz+ixpe55kSwufgVClRSj4AlQxa2U7MjZu+0ZGbJYdl8EUSaCD/d2eyR8k8jk6w3u4rrYkV8x7b/iFa+xLX72DHdIQ+vNz/5+3mNKI9XXvjYscefIH9vnP/rXFqPy0o8XdZHpjo+OEm102e2zCBgaXsKXhwxAVFMhoF9FC3ahuPobZWdJF+i5tRiu9eQHRCtH0LBJNziMEOfNYyNEUfOzFEZ7Xb5ksp4CwAEoBxHBQiLfIQqfRWmE+8gsdOFlpusqGXkoMYWlxfhra3mDDeQYfLojwfjlfj3bwfzJPJf5dxOGq0P/DnbttjjD1KHmGiiyDAIVCXnOk/ofGjxklZKprgHa877WXnme3ffNuijOpkHN6ChnuT24NaYAesr+7Hr7bHr7/Xmz+IdsI4zfLl0iYabR9/64dJB8witGgLhKfoYE+cBVdCCYA4XeREwz14DDFx/EoCg2Ub5HdFh6OoBXmSRCNHz3X2IWN52JywqH9VOFDSZgWQGZikchLQlcs36CONIi1FdRSHOaGIgVF+eDf2l1ajLyye54rhs5XZsahDl6haO2pI2M2emzajgAr1/CPqiMIiigTx49NzdvRWXCrKHfBYt3w+ivt1jvv4pMD4M4pK8/z+DHNb5BPGxfZuGndzL5H7rE7vvoVqketNrxyBbYziMkfffgBq5OAqJ9E6GIHGMqKpUuc3h3BbnYTGQ2A98SbqZVSRnR7Lq3mIt3ZAlG4RtaDbV/heceYtOvCCNnNT8MkAZZ5EY3gIMCeAmq4HoqolKO4ZrNQTV5vJqoR7YxV90xd4JnsfrgT9D6VCYtCohXO+u5lJ4ZRleLueTCcg8DWO/eP2By7bI7/bgd61ucpnp8DJT04QR6AlakAY197/eX2lTu+yfcHSO3JHj+F7ejCGvb+RKhhzw++ZX//mb+xC87dQljHqidS9q1vfYswM25rVgw6eKWQTbS8dorRCitlcnoQfgptbMUeKvyMsL3dFGCvIwhSNyyhy5A0GGjaGQ3BK7ZzYfFbHM0YmnacOi6ni9CEfsZlX/W5SsfZHRHtDCWIwu4RrrieoqDrC/XdrvnCRkPSlOBmfZJMZx3HksNHyZkr5k8Tdk6TyO3YS0BBUD8+dQzzyEIBP8sBZ3jd3rFFawPaUAJ4ySXn2mf+8Yu2dHhNsLNP8nhem9+g3zWcsG728W9/2X744APY9j6v7j/8o8cJ6WbsrHWrSb0X7ciRI37x7RS1+wCsFGUMkd32gKfI9rZwtc7LJPaNsV0V2Qhv1+8ygtEWdiFLacUUdIAv4PD4a7DDUgoJWX7BNVYLo/9AQNFGiRNTFFHLkQrf2hXhjtFO046R7ZcfkefWvjneHaNgnQUp47P0qXlieq+qhcIv8fq9h8dtCiRXxaIyNd9jM0SB3OMcYOL+MZgOgHdV4t53vvut9ief/Cvr7Bk8Nc1vsMBOfPWJ4ecz9/0LhfJP2/kXbLU0MfPTz+51+KArFbORPTsRMGEc27UdpzcAxqPwsre7F83v83CxjYxSuIwgi6jofAhYTActhm5Yu6Ch+boGXKtfSvCcd3QR7fA+HK6iomCheL8AMJIeISgVTIqQyGYg4TqaL3vdxG/F4THgA32WcguFijUReWXxwwy7RFTj+W2ZYg1PZ3HgOWAV7aRFohz1FhyB/qKfWSIsMaz3Htxnw2vW2VEKSPN5EsvFGeoBdfudf/+b9l/+r//JdbQ5eHhil+WJ8j0pdeQnI54nv/lPdhsNDUthGidIVqaxg4MDS2z7D7/vC6Csd4bt2IKdXUKRRal9NwUHLYKYYG2JdufVFwsUy0X3Q9MbFO4825YCYWiLpYCB83WzhCQkpLL37pzwONE5S/mxr24uMTmKhISEN2H6EpiFKMIve1arz2YHyEVgMupisBGZiZBVgE2tF7jf4d9BJSvAn3KY0yq+aRFYfJ5oaN/IEdu1/5DnGYmWNid97R0nc64SceF0f/Pffdh+9w//FLNFhQ545GRstlMW/mMI/zvfvhNt7qJUt9S6CC1vueUW27RuJeEn/a9oUBexdav3WtV9B/SQ6LSBf4sslWgi+1NdlSyyopqtkg+E5egmkVMzUIbsf7DoCL3BEQmjnuoJoXKjg+e5yIjPwhw5KUtmR+QofjepeKJwVmYorAto+WTGamrCIKYvESUJVIywc9VT4CgqGh/sqrBhg91aQoGU+c4CYewn6dpzcIR/y+YHVMMn9k9av4o5HTA6/v5ztu2q6z3BlALEvMPypx+nLPxdD37THnrgPhxpM3au357Ztd9j9uWD3ZTwDtr87LStJtESsljkhkT97unuc/SwlYJKCyzfkhhpcHtK+YxHQifG2Y3OdA8TMS0Nmy4VdgSU17t5F2X8BF1qrIkzmJ2+x+Ij9AiaqmKPbr5RSfKoCM1X2bGqUqUimyJajXBRgePC13V6OKpcz/0KcDf7T9cwg+k8CBFs3+FROwbMUvYW1iZ7ljJmilykv6fd7rr3u7Z83ZkoQEDkjTu+cxrCn9y13b79zTts+tg4NrTVVkMaUlLz4P13geihAdhLZZQSvsf2YN+qHLUDQ3T1gNXIJmt7Z6g6oXF1wj/VTINYHg0LIWMXvkPaQQLUcP6FMAnT3xrtP41F0Ou0k0SylSmIxCjKcI3SShU/ZIqaic1PbL7Q4jdMTx0nXK5APwnNjoQfMN0aowoA30B7q3yHijqHxidwsOM2cnQcsA0fxm6fmKfkCdK76YzldsutX7WVG87yFqMgZH7+xylr/sgzj9kjRDsP8XPGmZtscNkKoIV52/vsU9bVCmYDTiOH1gvAJnZyjJuWvevupbpEqCm7XSdiKaP1RbRfZUUtgDtOx3SCCOf4z0+0gigUdPt/Qt+Vs+hC2+/OW8ma4ntxKZVdAvti8APhYxpVEw4SPcJp7QKZS2x+GWETkLrwA8CvGBZxlEhyTfgnRIwDr9kMZucIfE4J/9DomC0Q96v6tgC2P0Ot4KZ33mifuPmvrL1vKRAFeI9M4ekKf/bwbvvarV+yibFRj6c7evrpLMzayiW9dgCqoGMoLMDypcscUZSWpchsRSERHhNXi73QTm60mJ5jByxy42x7trwnd9UwfAyMi9+0s+PC/252fmhwGw3f4LsixGocONNrFYVTSqAAACAASURBVO0g9CjCF/PA432EL9ve2EVeKSMHqFNMyefSTm2pQnbVogTKEHRBKnPW4jrETngtvGeOax4D5dxDvfrw+DiVMQA51SMAzybGpu1jH/uQ/d4f/ynXQiGnEnBBT8ZgPmXNL88edeE//OD36OJbQfvMsCOa373r6zYIWTXeksQZd1o/mu4MZWx9Z0cXC0L1R3ZWXEiZGZxZkXbQguq2zmoQIYfnVQwNH0p/JOggbw2sekBTDJ73XRRqqbf/sAOi2Hc53GZxP1EEmRzxexTrKxuWH2q0GTmPXzsF4Zex+XKwYtRVQ0RVwvdGulD40nwllRkEn2a3jsKI3nnwsB2ldpymWKI6QoTdNjkxa3/5qT+193/wN8F8yEnAl8QxexmEP2b308J5iNhWcXcCqoc05uDOHbZ183ovGrSLNcC2V+12eHgl/Jw2qkwBdSJPxhjTlRBZlOlWKWI7vXoWRjVFQCvXarQ0oKtgAhCa/w5tsQs+BN6UJfuiSPsVFhKseiMEQpfwBS94yIlDVPyfwPx4W2kjnJTAFdMLZmBHSnnKoVmS8J0ld4Lmx6jULcCqWOQ5CX8HFbpjILcZbP707Az+ALiFz7zzW9+0cy++jF2iaItI56XY/IYWNuL9TGnatt/+Ddv/5FM2Dw4TxbnGISn0pLip5jI1UFJ8wro1OGIvB4olhjCyOWYiIM6KIhwEVlVHIIJXCxE1Otc+hXoVtq8qTA3tDkxKkPH6opA4NdBI7wiR2Wg4ZFlVGu6CLpQQc5FJ570Ncm0NCmGVEBdsgZ0WMOHUuqrSqXaGwxSgmMH1yDcEsb52ToTvKmO+ZPoU4RyliLIXoG1kfMpmKfjI9JDcWpFN+uDj2+F7rnSqYhLTpyqYqPXP93hBfn5D+MX6gt33j7fY0b27baoCc03sY4hQbWIDU2ipsQuWMfljw8bNXKSYYIajbfFukIrsOsKXeSjjzEri7QDGuZelNKh0v07W7AJvZK6eEQW23xetMQdJGq/dIW1XyKhkSg3PCDGIlNT6r3ad0FwJvvEVVD5B/C6WBjvBC0a8R2ZK+E8dyoj+JsZahWv2cDRceUU9VbUKEdXMA7jN4OsUau7Ye8CmoI8UREFE+zeff77dcsftEKx6WVjlO0RIah9yPv1PP05Z+LVIwW79y5ttlkaILNFbF4TRwhSkIfxkib/VAZ4uuHCbbT77fA+/1ALU2dGGMIUQYtsVV7MIZTLGINIRL1J2N0Azm0jvG3VUB92Oo5iNWDvwAIrl9fCwUfaeh0xRDCfbUBQJX0LVw6EJCZrPE2LpDlRoqHq8yH6VF6g7MRJF2FISpyoqIgqEr/c7z0i1Ab6nwHMFFkua/wCc1HFoKLzZw+fr3/Qm+8u/+5xT6XG1z0n7JOHOKQu/HMnal//8f9vMyCGLk1h1L4GZ8NQz1gOOmq+AfQBcXXXt9XYWnHUxxMRcaxNbi22excF6LC07y9ZXYuNxtqKEcDpUM4wIZxo0kqnQqTrZVcQtmYaQu+nCRwCNZjnXeNV3uWk3UdodamqQ01b4icAUdfjIADllUc+9zVStodAQZduNHShb78IPTI5n33K+3FsE9LaiyEroJztmBGz/jru+Y4foJ1Z0VYCe+K73/4r94Sc+yUfTE0DzR0qsBQn+dIWfzU/bD77yNTu6Z5dVIaS2ww4+8OQOMtwevP6opQCurr3u9bbhrPMIsYLWHG3veoWslsTKtV5sZSAG7gZHK0E/d3MxHKMLnxv2Nh9pucxD2JGYQJgShIel0n7scAMF1W/Zexd6WLlSV0owfCpsohaTQPootgTCB//yfwu1DJoxtPPIO8CfXPNxws7xx2YLktaYGIFtHjERbMwQ399yxzd8B0TJZ1oIJj7x139jV/7CG/hcCJU0TouxJzqiaCqnZXZK+Vmbgway7+knbN/MmMVIpnLHZqEKttuzB56xJZ39dsU1r7MVazdz0yK1CirGvBSh+RFL14BnizjZCiFfBDsvzF5mXTLx9h1HeaXlJDvcrCuMUEp/HXZTDk0mS8CYbLywGudEBtRDL6ScEAGJodCIjrxUiXMQHSVG6CusRwJ1ExTWE2pcgBRE2i+7rwWQpnvI6d8JK1oopxI2CFUZdt4Xv3aH7WQaVp0dlILp8cAjjyGXXq48SdJJRS1AxU9f8ysFyEajEza+f699b8djVic0S2EKKjRGHBjbb6uXrrbLrnqd9S1dxfAOzUFgmyPseinrzRNldaSQWJVIsCpudhCafCqOqYlsOBqCbO4HiDqC9N/hR18Ax/TDuQzeqRjiPwoj9WiJtQXZ6QljAnT3jdBUeI8WWtGNfILsuJI1woWAD+TNYtSLFQCgrVICURi1iP65jWRQ3CM+q8RvCf9pGBsVFuSaSy+wv/vClyyS6nHNV7wM6qIg7PSFn50es+qRo1acm7EHnn7U6tjzPhKpkf27SK3nbdWyQPgdfcutQBTkaL3ieGDWYo4qF62YGcpv2bkpK4GFK5yT5keirT5vzSEItMTrtA6ASRBooLoKwwiowT7z7DfEflzyCDkRTR3HbtzxhoLXZhBAlmD8gEyI+sCUjOkRE7KqaVdEXqpJu/C5rmpII/QAwBdXRZ2AY6SoqqJGbX5/8fav247Dhw1kwTYOD9q7fvlX7X0f/DCOHJogl+1N6UDML0yaOsEonYjlN56OjDxsBz/ylxa9dIONnruU9k8SC9FUcDxzZHsbXnelbbvkCgAtePbEhcLrmxTRFBZs9MAey82OBLwaFabVga6MFs2OocEp6CVzCFnto6L0lYl8hqgVZCApycTI7ktD9RCfXva40VUuh6ziTKWuYUeMBNNiaTEo4KhqVRIrDeG0tHQHPkIjaBCKF+9xlM4NJVaPoUAZTGIW0yLGcwm1LUnbVZ1G6C0tnf7aFiCLuHicaP6/3HW3PUL7k6YbrofotY66xgf+40dtw43vYecq4uLbyC9U6jllm/98wk/f+VnLfOk+W3bDJZZbu5RmYeaiIdQqpmV2btIuveKNduY555FwkSmiamqhrPC3LH8TrTx99KBrptL8NBmunK1uSnbcaXtcoFBQ1TyHFMYSroruJxaYqCXS/gC/CaIZrwUo3FQJUggQkLUnQzITaL58ciUcniT0U6xisRs8fET/VSBXUJClKqXPHZ8cC50zy8xrHNVUQsZDCZfgEvmZXgpE7cAmVa7zjnvusx8wqqwZFt4FAI0bO5J23fvfa1ve/mt8m6BsFhFHHocQdlrCj9xysx177Bkb2LbFZhbAZ9CAJ9PjOKFZK7VW7Ypz38KUjhWYHLY5NlUevkpcnZ2fsgP79lkHrZbHJqmBHhtDmCKgFmyeRdAgDNlf+IDehqMCiLidvnMQ2jJC2g7qwloc0badi6M4Xk3PClOBomWq5AgF7cpMqJFN0wyl9T4CjHdnFMUg9LHJCY+aRFWX8OfIVp3R1kcrExGMSpUBsVV5gVDXYLGTFMf1/DDAYSfVuRp+6q7vP2j3P/qow9fb2LUb4SZd+s532EXv/xAKgd8DBy2CBiSbn5/F8IKkqeMr9jd/YkfSMzZw7mabemrEYr0DNsoQjgO7nrR4P2HmZe+DQt3hDC9hMnEQTh+Zi+2enZmyyvy0O9r5mQmbRcsmjkLDIFUXrWMWlpstFuG/Q8CFF6O+3aDHlk4PYu6VjONqZdtL+AoThf8IXqtiotjVrpHCcFSr9f4tnKZ2mWs3Tl7mZoprmILoe2h01KnlGhHgOw96obpYIghWeYh2nhhvip6UAbdSiVPdIkEe0Ya5GYKjKZqk4v0HHvuR3f3gg1bj+y8bWmrLaAZ+44d+w86+6dfRQEEKmFCiKIqZp6n5//RZW0xRWO5lLOJe5ikQyx9BQYoIa/2GlTZ8zlV+Mz5qC9xEUJd6m7zxQWU6nG+aan+dTLCVRZk9NgkgBVce7R0FGw8SoLhNsyCjCKhbJUk1PLQnqRv3kbBpIlSbA2fB8CPifsLXiqaFhDRCQdpyqdJsCVyz1BaoOZS8m535DxBoMzjdMtc5PjHpiynTpvAyhu8YoB1ULaZ55SMC47h20WQSmkYFsKZET6/X95dxuk/u3mt33nsP/qHJ3kR/bmJu2t7/B79rg9e+lc8UzEGoqpHEp2vzs7f/M3a8bgcK43ZG+wB2Pm8P5WasnWxuHYTR7vOY0id7iybns0Q3YDmi7KkxWT5kdhoBY2KaVErE8T7++BOQjWif6eixp3fvgwl21A4cPORTApcuXUqQULUWbOay3jbbtH6tLaMLRvNuhJiqYSIJNCAaeI5M2qkgRFiaA6EkSzG8qCZZOiXVMqRhdmJW7x8ZszThY4aXj7MosnZdkH4Vg56BRvf3dsJSqPPZEeti2oiXEfFdPQP9FGc6fZHU6e5cUfbeIcjAt32LSbcs1HvPvdDyowftDb/1IVv79g9w/1GUjxD15RC+UUbM3/sAtconrY/abXM9afuW91rf2jNsXcdSa1qxioIFzATi+hwUwtzCrE9qFTlWbTlpbH0eAUxzwWNoepadc9nr32SJ/uX2P/7iZipCUO7gPKqP6pfedRMR0j5bO9RjTz58v60a6rczh/u9HKnWowHYEXJ8iv0z2G41TESqzEsj8VM3eAF/Iicusu40O0yUlaPgUHspfM/QyjNJe2gO+vcRuKaqNYuLNMtuE9Wdkokv+obVy71rXWZoFVT4ZpREIwd9vJh6ePE7U/Qf/AsQsnieb91wjtWmRm3gkgvt9f/pj/A/XVyLNF9g9ynQBRuG6fminbldD1vmE/+APZ/GZh+hx6nfqm+42vIrV9rq9mFrX7bOcsTwlcVZmx0/bBnmV4q91pgEZfD8ZxCE+PoJQsu98BuHt15sGy69yu783g/ta1++BT4+pFdw/SrRzfVXXGYr+zvs8DOP25F9u+3sZaoFU6wZHPD2I81IcEfKLpJtb2nuxBF2Q+WI+wy1xiA9CV/Fju37DrLgKHlrp00RmNeTHTRrP2LdwN+XMFlwZHzU3nbj9QzymLDvffM2i9EUslTjZEgmB6nGDW46A2IWQ5bEhFCIjPlbwInfDmsPJMFev3KjtWTnbZxRYR/62y/CYNYMB2jrZPgdCXzX8zxOGVibuPNvLX7Hd2xydMrKTPxYif0vb9xks5dea2vWr8f7k05jV3MszNyhvVaYPeZRTRq7O0svbmGhiE+lUY0b2XjmFmxy3Z589EdWgf9zzhmb7NPbd9nIgYPK4W3zulUkbfRyLUzY4UOwg9lJfb3LYUcspUTZCieoxVYuW8K8nRafRCJm8ECq25JoZw2nm+c65mYnfSSwzINw98OP74dtRr2WBudDFEXGgYWzADwL81n8S7ddf9E2X/BpksaDT21nYXHa6kaHEJuiQqeadDfNf+2YtQr3UsERp6GKPPLYo5Yj8z8/OQzZdtqWMHHlHZ/8a3xHrxWx+UlG3ZxsSvYpC3/hga/awb/4FN3/aNkArARCzOTWbRa54V3Wt3IYTSKGBkDLwGKeZy5DASpJhVXPEddrtnEcvKegHn5AqCVUuTppqpuEgjF64ICmSVuRMlwW+13HnqqnStnmHDspCy6k5ImuLoZPdFsHTrW3A/bEsmEcd8Iy9EWVaSNVV2IriU6Ezy9h7zOLU/6+Gvj++NSMHTkwaqO0pdZwmIAbtkAYqUGoGdBH9Y6dvfFMH56UmRqzAZSrC8KvesxEhG3CfHbRMB1tAVNiQaKUCCOdPZYHMn/i8cdtbtcBG8wwhK+9ZGecd57d9OnP4SwA4oDaU5jDk9URT1n4kYNP27N/9mc2s/8gnr5gbcUpW3PtG6377R+0ZkxBlQsv0MWyMLLfFnE8eWmemApEDmrrFwlKs2zq1FpTsNu6YDhEcJLpGTnErLXC+1fbZRYnrMlUmruQ1WAkOU8841TxmNvgdoWgONxhQt04mXQxrdmdhLaEpSn8QJ2sVaFmNjOHgxTdL0a5j3YeopgjONwqeYEofEJGVfRR9WwIVrW6SApU3YqFNCEuND+y2wxdKuKGyme0EGmVE8L8C5gRQk3G1jRxDwee3mmTjz1t1ck011C1cy6+2N7z918giUxZvhnmsuYmEHicltmJ5Oasfs837Zl777PRIzutuzpr619zo/W8/f+wCpFIlJvLoCnpI4csP3HEipidolpscIaOPBJqKnoI8HDh6ME8HM1HkKaXS4HtVqKTI4RU24+uO4P9Fvc+TltQO8lQFwvQTXNGOzBGPQf0S0NcK7suBoUxhXZWCFfLUP/y+BixpmuEofOAeiXC1gyd4xWcbR6/opqu5u0LKmhlYEachdA9lEmKCsVM0NvLIrVTh57nfT7RhaY7Ujc63LutwE7ugkgwtfOAHfjOQw4aVuNZ23DeBfbBL9xCktduFdpkE+Q92u2nJXwnuKL94w/+wErY4uzoU1aOkdW9699aedUQF8mMtGnif5KnwtRRHNcsdh7hIzhh9HU4msoBHGNHeyVcUcYF2zr2Tpao7xDgJlSxyGJ5zoAWCy7oVF+rCLdENF3YYVHFCwoz0WSFtHEISm0Qc8veyE2GS9QlIYKqQ+sj0eO1ilaaVVBnVzm+I+hCba9EZB3eXa74nXyDRdDOKLID66Tsgiki9F3VO8DnmaDYhrOm89dWbz7bRh592p76Kk6XZKoczdgWJtJ+4B++SDTUzWLA1eReDKDttISv+Dm751HLj4xbPxjGM/d/xfbsnLDL3v9Ra79kE46FihZQQvYYA49IpspAx0UXPtwcdYHzt8Y4Xl2IhO5mCNem6VIwgYLaKdtajIIS0YY0N9go6jzUDAcAMpkeFkCamCOOF1QteLQ7BTURWjpTFLhU4fRB/aCMSRKGJ1MjjEjmz/F93p8XZq/ZzCSDVSIVZcoC5oLGPbEzOKkCCEJ0vyjdE4vNopgwf034FYu9+YKL7LFvf9e2//PXgVu4zo6aXfeGt9rbb/5bXakVCFmTmlUg8tbpRDtqoEkfedrq01k8ft32bP+WTR+gaHz1263z8k3WVMLWYmezU+PYfuz9ItUrNRFzA0IxZYbUrxXBfiuNV9umEirNqBS9RPiH+nNLRCqVqubasDhookI6MSHiYjsLXUT46lJUzpDDx9QovEfZWZ0Dy7wzPqcqGXBBnBtXk7YmIpbJhuuYIh/dKzOgkTEOnoGIei6CycwvBA3a4aALhbFadDGV3eIwjGmmsoCPABCkK6dA+XHjBdvs3ltvt4P3/sAi4DotXU32xre/2678vT/SdrIMw1HbVDI7SYPEqTtcbKsRc9QmFm2CBCiaP2xdFaCG9hVW27oUxtoQ9pS5CLMTVpiesBqYfV1FCc1JAKGMsBMWqAU0o23qp1UTgeoXyiB96hN14AjbX+GhKNfeIIfGJOF6xtwuw3gmzRfeUyc6OsbpEmm4kq0Iq4PFqOGAkzDkcnyWErtWTpJQlq0OcjHxqzV4QxrlzsJryqESNM1b0LQRcSyLrZQ+CXtbRXMMi/QODlLqktNPQnGfK9N/TBzfVAYegf69mi7zb3/lNsvvOmQdTNyyeMGuf+PbbeuHPwbMzfQUzKjMpXdIvxTNP/4eZO/F7AUKKnuetgjZoir7haXDljpLrUIpi7DF0iQ1BZydeDo6HSKqAaZgOCWmU1Wx8SU0vsrrhESKN+/9rirPKXdUxYgF86IJF42RwCQwdosoppO+rhiAV11N1eBGGaZczR4+ZEnMiOx9soebh5KosDBC5CXtVjFesLNXwagla15PRFTyZnab6greAiTCLsujrkf1a3lLrU6wUI+wztEJuiHz/HQSgs6pHk0xpk4/QE93v9351VutE2VqXbvK9v9ot73lPb9q1330ty3H/bXKsQj6eKm8nRMXrIgTM3Cb8t5nLc+IlxzZZZxTeZZc9lqDEWtV4eNM5avjLFVCLMBliai1UpMGgQ+KGmghFFHlPG9m080F+Lp3PoqLE1JJREqt4FTjmBkNJfI+MCIP7BRmp8ny+JbpgwfoDajRE9Bmbf3LXPhAlK6tEqTMm6AA13K8gYbqRdBITQLxejDfpYWMYErK7GwxHeT81enojRbeqhSccKQ6boK+sgV2dI0O/TKlUlHgf/jd+2yIUTFZvjfNgLyLX/9Ge91HPgyBiu/BxMXVr/D8tJ1TH+craoUaQ9ngZhNQowHGJnbvovO31dZceD7T/7di5xlSDWClXl0VzxenJjE3RByK2+ePWZZFUCFdzQIChb0qpagDc+BtOdyoaqU+O0E3ja1U7N6mUS4pChi8T5rfQcqfPTZq4xC4msGI1GjdQv+T6CMaEVnTGBavwYqUFXA5mxT9CO4OybQacFQHrvaOUhY/J7qZAxYB2yFQjrD1SBUyVdNooFCNOIozJtWC/t4N5PUjGyAA0O49PDppV777PXbJBz6AtIi6MG8tRFGnLfwqh4TRJA5eA/1atDtm4k/segb4YN76hwGhLrqcGyRGJsJpEumULZ0BYiVDsRJZaAFfIM1X2BaXTUXLBT3rIaeniMh7phCaopwcv2PE9Z0AaUnBy8Tymlwivn0H0UkOzR/duysQvvB/er8iOtiMIaUKGd1RinXA5ysyqpLIKaqSeZNg8+xOfZc3IQJ+1chIxW4QbCztD3rBuCbXfBZRRXsfkselKy9B+FGingM7noFIAAoK/PwYO/FXmTi+5sqrbB6f0K5WpdPh7Rw3O9i+sjh7ODOcuEVJ+8sLUw4fp4i7y2hBQqwwJ8AGJNQyKCfpqi0yT7k8zVhf2VXxMxX3qzVHv1Xsls6x5UtEQ4Kkc+yaIjfeSldjN/M5FQpqi9Q0w56kqVXRCbnE5EHm+rAgGmjRysk/EcyBbL6u0cuN+mxl1vwqE296KyrXKPaDijjKIZwbJOxeHM9GmymbRXmGmy3xNxV5afwXsbxeX5JporgT4bSLI7v3OEyeYVcnVq+09/6X/2xtw6swcZQ9naXcOALwpz3uC0Y7x98ix6G6bGi/3H+rximt4PkcU8JbuYEKCGJJ1G+l9iqq8O95oOL61JGwGzCgBTotPKTyaRFiaJxghgo37TcuB9ff65ovdpqEGku2OxVPn7sACpmmBiDAK06CponkEqqEpNcKNtAj4iEVMT4cDh/fxUKIqabSpWAL7RJnwqlFVfOTvTYcnM1VJtfQPCAV5DLsZpHiNNpdFiAFajk7tWgju3aTgAEgEoG94z/+jq27ChJBhMla2HyV/Gsgm7q304p2xKVXlNCEsyN64+ZEwuAiQRTjOMEqcXJciJ9qstJgwC1NqAJZwz7PGrGhwwdyrE5uEmmW+F+7wStTZD0aASksSCQrLVA3M9NawNvT6mwHwlBfawVtUzEmjfBFNVd1i4sKzj3RUGpMgu8A9WWJUiiHq652rjcXns+iIXpiQYnDE8OJy1xp1poYzvJHNQ3aZteqZVTtTpq7Bt2LqCpgJGpoXqpziK6cfR7y9lHE2Xj5NXb1b7zfCihIQvRwmS6d3UX1RfHZaQmfr+T9YgdrWjcWjwvSo0zmpxk7tSpJkxIaHb0kR0WaXgTNjNCRXQLYqo0f8mpSQL8IDh3QVlUomEQIZZIxtZLmVNgmolDC1YnAFeNPUY3qWTZkA0tXoFUJS9MZkgVHSrDzhDa6KVK5ErUWZUi5g7PZnC1BiAl6aVGaGPg+EaE0PqwZE5bEV6QwbWpfAkhAiYKES4XzvDoVdUIQwtfQjSwVLo1prGKCxNsZon5xcN9hixO+XrDpTFv+lrdBo0wZZBfr1oxNtRugF3gWct3TjfOfd+0CBrFvb7RERB5h+HK2iiS0GBr+oxpqHWFp7llJ89B4j8hKarUv6iYxI7WjYEGU7w5jy+cIS3swI0t6KVYDNWvmT63MIZQbhy0Onp8dozrF9I8IUU8P0G5XE6VKNE6lw1pUQaq4lnSRayotPkfTrLTo2nmaHaT/VlVMg5f0o+pYGoGJNec9K85QA+IQpVCb1G8woHoLkhBz4zW/+A4bWH8mO5EdpLRCtPQX+Th1m/9CwhfH0nk0qkTREOxhnqIeqHgiSYH35BF+zsNNzBEC15weTQBXV3gNOspRoqPp9KzDCil2xwo0XZWmUUqPzbWELdmy3hsNZncfgAGHmaP+6mPf88T6NGUImCuTzKnzUIsr9FJxvrAZtfDIjqtzXGZMStON1ncBW+gz6pgfp5p7+BNw+r0VSf+UXxDxmdAlhy9K0IN88Q1vtpbBYWdq+BDrk0yT+lnr8fIJX1x5v3khjfgH9dmqoI7w3e4CrBVUPSLbLVLZqqoZTrOSwV9yZMMqpBwEjpbTVF+Xop/hFav9QMkxkrXMsUVbfvZ6n5k5BYZepSmBgN8dLICyxTdv8WhrEWQ1qhAWM5bhe1qZ4yZHepiBd97gzI+0f4KdqO54lSTr6qqhRuCdLfgDj/GdZgiihaFXXbiqPi5MrTLdZZu22NlXXgcS2+5TTtRW1BhF82KU/2UTvqKFOhGOtLmKNmsgtLTPu70VYmZmQCCZ1ETxJM9PHeFoB6hgIV8wAqFqgRZRCX7VECU5Gs26GSqx8cILCS2Y3npkyhKU8WbHmQbLaK0kQiiA3wCzWK8mxa4/y1Js/VnaM5MsepQoTFOv2mnWk/nQxELF7mKfSfiHmJgo7R+iGK+e4bg4Qd5WFEw1UflRghX8rSSwLE6/t4TW7axLr7RlWy6hSUKnT4gUq/6BF3+i7ssrfOx8RV0oYjEogQkHW/jkEMiyZWk5mlmAwOSIJ/+eZyfIph8GjBNe309GO9DZx2tlv2O24qyzrGfFMijYrVYgwxxhumGB0SvdOrOE+17EbyQJK1tWnQHMkOB8rmPW6ecuAnETwWgA3AymrDylqYIsFsLPgDmN0cZ5hPNdFCysXrvGQTuHrhWbix+q6FCtQOBPngSCyStsrIOwnn/19da5aoPXgDWsTyiU6IEv9vGyCT9orVTvFZrPzakNSHCBFzZUyUJIZextHuHnEX6RvCCLZoreoeqV8PVUB43LaFyrwkRcRga42xhp/gAAHaFJREFUOEndthPK4PKh1dbGYNIs75t/do/VsecFQrks/kLlxAgQgw5MkK1W54kQo7Sa7hCikjabZSK4hqliIpQ0LRCm7lSGzjWIJyQHrMVvIfKRtitiUggqHqbQzTosaHWgt4Bh+dDq3qWWQ/PZfOqt10q9WNmfOrZzsk8+Hu3oAryxjSSLrLcWDgxVhqht36RihvpvEXwWApVwnzQ22cflYmBTODzR/SSoCCYsAgimcYw+lxLNU1KzjMm1XYBYOQZRLxyZgLoRTBxsJ4HKUjzphfikSd6LZLJ+aA0+RUGnht5p8F8dzVW+EzQ6wGATdxRlCI4X6fFwtVU7QJNC9L06wBKIQ8JXw4eQ0n780MaLX2vVJFiTPsvF/vMWPjev6KZGbF/GdvsoFXVyi2eP5sc1qhccSEUV1XrngIR9rrJMBlBxkg50lfNkKrxDRGdsaQ4bWqy5NxajRrt6qfUvHbAO7rU4m2aoHME0W6ajhlnoEFMBqh/aOEdsHxcGxIjhJhZA016rLKAnTTIpml/LjlHFa5Yaw649e3xkgQSvBm7lFhHNcvYkjCgdp4298Wx41cYzbPi8Sygb8hzZrhhsTHz2RO/FPl5Ws6Oeqyad2IDTVQdK2TvMBd0iAArePEGCBEdz7DCVKA6jDGNq0cFr0Ap7oF6n6eJuJlMqkx/IhGQIXRV6CmwLztBt58CClT4/WdOfxE4WNtOOKZmHdKWp4d0UVtQA3Zg8m8e/RAHn5Nw1GVBHNKk8KGhEA+20A9SEofO0EhTnk5rfDFqrY7x1uI2Yyil25SL5xMbXXGFDHt8HB5wFun8SzPgFVuNlE76PyNJZg4R5EbRK3Xka7SLhKyNOQjQVg2EePGYGR6fulMZkWXUudlIJ6u/qs2NjE+BElP/QXt2bSKv67DpmwMmvQNSidEeVJSseF2zIAmSgfitT7aGpQr25SQr6qtvK58iciIqiHi8n82Jy0vgahfQaeq1/z5MHxDSHGeEnXPt1aFkAQ0i4KtLXAA83XXatdVHD0IIHE9Y1RCnoFX6xj5dP+MoI2dZxFcYRfg5KeIE6ripF6krUIDg1PMvkTCH8GhqXJLooYNdFZu3gOD91puTQ6JoOKFMThWAEIOokgi8Q16t2K96nqCYaMSZkUsNV/fQgb4iIe+OC2AoNNrOPClZDRCo8BEGFEYKBLIqhEy20OwQtx+RnWIiEZnKCJwmc0yLKp4mXqfyjnb6zc664juSu37H+Khm1cCIN/35lj+d7oQxX5CaZHbS0mZtR71UWoCyC8HWATwUNUWtPgSx2FlCsikOWM5wSmwwy06pNZ9mZmzd5XVdnVAnr8SxYBRrx92GWBf1aelqDVZmLzO9WhKXCSFwnPXvDMtkxTOYZWoo0/VunTs/g5GO0rzqaKlRc/Bz+exoaohZAcxeaMH0ScEP4su86XcgRVwo4BTR7JW2umy69xtkI2nUaW6bwtIKZ/LmeCuojfsFpJHwJOc+NLZJMRbDzujBVdhJEGyUaFOYmQSR96kjRxom3ddzHdx/6kW2FcLT1/AsZmnqmn6Eyw1ybPOYhpxG7OSb6KXoR7UPjtVQgYZf1gHyKCCs0UyyHKiaonYmGo0cnPHoK2kSjRE5p5sABpDEXVMikQs1JdmGeukMLwu9UWxGvS0rzdWiZqltUoqT5QjvzfP7miy+3FedChQ/haj9fQNnvz13zgW/zOFmBay2k4SXCyjSZJIY/GHwBI0wn9qibcWac+WSMhRQpaZb2eWn6PsYmHoCKWGR04mbS98svv8Idq85R0QjJKnRu8WicvKV+RW8NVa+UyLIUMlisYIgF5kLzdbieFPZbw7X1ObmokFjg6FKGkyOYk8P1xRk9rzNdmim4d1B1UkFfwle0I6xfczUbwq+DMV14+eusfXidUDTXfEDjYA6E//eLf7xsNl/YeUaZK3awTVOnYKjlsOXia8rml9EskUzLRDkLnBK9AMshj/MUjJBHqPPwJMto2hRdjk88+oQX/c+BObzpvK2259ABe+2m8xyKXqCHKipUFEdYYPFUBJcDLupQMRWufNKUxnupOEvFSZNPCEmPUknzuB5O0WIGcwh3fhWh63pO+9H5WimSKDVXSPjKLXTipw4w0COq6YgbNrrwmfghhM2HZTSL/6NypUYJvHjZv4xJFhezwEBrsc66oHBHwHlyAGIVoppmzEMWmy/NB6wHDiZJop1IzlQNbaKLz2Xg+sC97Ih22NTYjB1QIqUxvGAzj+540ga3XWQXbNnqWj8EBKyhqTMkSNo1K1aA8wtYxDRI8B0442cZH//s7t32uuuutVtvvdUiOw46ojnA3IgVK5egrZgUpqX0MQ28A9ZzJ0JtUZipE+zIxFTc96ZpYTxo9+B559um115DAKH4Xj1g5CDqP1C3PAv88xU+Wd485qRKlNKBM1TDWp6jkqqw2JoJ5ajmOtDWpKnfZLeLFE506oCa2kT7y8MO1q36FChVq2Afz0/SszVPlsvuHqtTZFHChHkZXL7C+ukWmQAanuLztrIw7V1LbIS2ogN79toW+gZu+8IXrA3TdMXWC+zAzmesBbbZEPz+wVXD1AGabRasSYshglUbAm9HYVrUfUJVTpUrtY+nVX/AvncRvqq3VviPwlY95EsaY4U9Ivp5hpoiHi0cPYJjTHvLpFrsVUWqqN0fZ1kVXqOWfjVQTE+h+XDlRVjVUUhCODFXSlyEv7TAVIjo1IY07TvzJFOQVWMcE+JzEHRWoeiFOM800c5RHHgnmt6DwPT+Q6NHbNmKYVo8oZRjRnrYOYq2yviDTsbNt/Uz/43eslmIXZqXLIy+VW1OqiHA7xc1JTjTJTxhAmc6AKRwxutvcv/SEPi/LuHjaOfHYChzUxp2J+q1LrAIophbmPHWSoFtygFEoF0Qo4EoRcVtny6oworAOOxoG40OKfjvKlkWOJOkiPDrh6e8EbrAxG7N5teZWgkWWY0XarpoZue00UGS0zAjxtAIpNMpQLNk1P2cagH5h10DSAbdL8dCp2GeqU4rOSvj1RC7FnIENVPU3YbB0+E+MlBTNmy5wFZddv2PaXpjbo92wc9f8wn/JPwMfbZxHclB24yihxKONEPCRYXQJ3mLq1llR6Sx1YqOxJUMwCmqRMT+srUxsJQW3q9Eqe44OcwGDofMYsbKoJmaStVMVqkkLcDoEThTTwT9dgJJaxHliJsAXgqaq08oaW0qrmtKIHaarFdwhZqkRVWRAsR0XBPgXkWlRF7njGp2RB7SwGVX32CpNZuOmxYfQy8Kime//1qET0dKBmcqKFnpvTRTc2xyaJkALhWmlVgJgEszJC5D61BEVSd8QRJBS2DKWv10OMyP4nadvpBQQzKtP2puKJHp1kmIyjrMhgXXQD3PUHsg7PLRcpp6v47hkOb3YWpEvs21PDcfWXQQpwEK6ias0n/7wqhgoqF0SsLYHZoim2A+5pUcPl9r7fqxeOb4GPl/HcKn9RLh50ig3Lxg82OqDpG4CN+p6TBKJUeKiBG+ZpIp1hehVoOtNfbFWQ/hVG8fraW5OhTQYzrmg5Y/hbMSeh3To2mEYj4o/BQkrB0UxyZTnHQQLdGDFgO2q+CuNqEEUYr7jJCI65IUxBwORlXrnLMexN3xDhX169Ztxdkkfq8lxEQBTvY40f6/mIjzZYvzSUNt/ughK9Bvq0qW5tdIk5KcG+gHBKsLReOylJki7ByOsgRsIOhZ/btRKkWermi4UTjAKGAN8Cx+gHd7paqYBvthEUtq7xFEgVB8gCrsWx/HwoK1MUehmeilDN0jT9SSJ+ztLgho04j2gJYYPMS9DFhzYiM3w0oQTKxCjCpYWRK286+50QZWbwrGiL3Mj5dN+CIwpRF+GepHFWFmgYQ1a1LCVxe6CKuaj+Czy9SpQhhXF40c4Ys+UicDdlIruyKiZuNwZJeOVtKiCYMXoUlF+CS7REWYKRqmvdqktiAVWdgNnXD0e2ElqC6ss82lxTpsvuCjuwLqYCD2YKyYKINOScfJqhegjr/KkZW3Aq5VUIgr3nyT1Rlg1Bix6voQjhJr/PdLXZPnhB/myKrJKFVWBqfQUEP7nbmiQQ6iBko7RZ8Wt9f565IZ5bVFADMyV3EoNdpLjRJ54nBR89Sm2QydukKYKMQyKSeKKVoEfFtYOMZzmAXxn51Lz/YPh9zpO4JjN9gxSE1OWcWLAr23C9R+BTFobo4LlVYlhYI+z0xYsdtuxj369eMcVSPAlDUOq3E+joosToiFDkIkJH9TI2RtBssX7LfpwkttNe2umjijOsDpCvsnF+nHhR/awVA5gi9DAH5IpGqaIW7qZ+S6FoGPw21XGl+CmrEAUJWFjVwj7KsieAFiwrrjamRj5n6Sbe2Hz8Na8Gl/5AQZcP9mDZNjYRQ7yP77/HpFFA5ggaDI/oieoXXX7AO175OY6d8KYfUQk0FJkAbRqSwpc6JTI3Roja5PjRnBQLzQ1CiPclUKJ5mri1Fn4ILzxOmvFb/+bIY3Ladhu0rSFwY2LymZOtnOOC58aaTCq5gmybH1JNy8zr3jIlTh93Hrok+HO8MtoBIjsJI04WWUMl+eeD6PMKskVRVMj+JoT6C44QT8+sHly+G/UG9FuDpAUhQTkV3r6lIUq1fNCDoeD9MiDqcTmFRJkokOx32pZ6oG/VosOEU6OrhSLSSzXItGxgjnEbFP5UuB7H54AZ+hXi83eYq/5FNEjtUCiN+JZDOaXuu2HkyfRayCRW0FTuhfw4mn7HrtvFdB81VpFtdSx2GjMRSONcxTTRE+10xXoPVRSDhPSfDgTpsa2WvLz7rUYdu88JospCgE64QoJUESLjBCL13jKRqm6wjep76Kh895I+pgcWiBNReXR3zNugoimiCIpsu+i4Dl0ZKiE7Vz6oBhIhMJXzaYGSI+kcSxGd4kTqY0XmVAb3YQrz0woI54em1ZBXDF9fzMO/FJ4xjBoMgLqsx+23b1dfTarkUO+JXGSaYvAUZ4Qc3PkUkmxM6STBBcEvvpNhdBqym5lf5TldUEKKWxt2r5LM2o35aubvCbofOvQ/iaja/2H+AEPqOKcEU4LagdVKZEoNdyhmRQ4NCkcJaVFksa4Pg8xdvKD0SsKkr42H5Rq9U4JyYCBiSY9qHkU4NK3d6jpaHw69RdEw4ToOUq7GgWsuy68y5hGPt5u0GSJfRTc9S0Q9T0oEgmo5qsz+YErSR8leZfzlSUFtqNKuqkaXBSXwnhS5ulFeIkuobwj6NMj90Pt6WNaOJMDpjXrElVq1Shys5wvDaZK9J2dtiSi14ftPqr6xzqiOL3sgZNIHxxMbULFhB0GzzHgVVr0S5wc6IW51QibEVAZTU9836Rq9zLadgdMLOEL/aDnLFMjZoYnJ+DoHVosLaMTuYJjgF5bvq35CQn6ychtdDghmYpOpIpE6NZYamMuWbsyxRK+Vz4qteSX1z7lncyY6GPHfIKCz+9wGnNKr3RXtNCvbOSq9Dyst1mD+y0czeucZOiyd9qFtbUqDo2VJNifVIgWrHh6rf5SC0/lECC1+tDConquFlGwagFtoQP6YYOuGQlC6AeXKX38iNoqoi0RULEKqZK5qdM6VCnyinuV7uORyU6KRTwS0KVWdGEQB/VCA7kIx+9pht0oIjaLTPpcb0XxNW5QnSEuRJsXNYCKIhUGgLOpPHD3pUl0hSLec07382gDNr4lTC+kpp/6OCoLRJPl6NtzD7TsUNgI/NHLXdkj60f0vA3HClCjXEgWUTNZQhZ5TtYSswc67LVl16PieFgL58ei6aj/XLAMj8+u5IzScpwcw4fnebm2u3s87ZRl+jx3qsOTiCKkKVmVTKk2FIVbZxMtgCjucqKaXSjuxoEIC6/ynpOQVRRRdPDxS7mfyoPBlmsZjdgttQaynu9/UhnJoY5gYZSa4fnwy5DRUbNaL7m//tcZsxOBXN29U3vYZwAPoTXJ15J4T+yZ8HmyE4LQh3hp8wycK6rCXTj8KM2WBgDGIMp4PG2Snj8N5osUpR6oVqoma7ceoVHNzIhoozURQ8kgXJtZgEUDSmEzEPh1inLwmxWbDzL+pavJANFMcWlYSctUmb0Wfvi0xNOaual8PxmOsj9IHtMTkQD9NSZrg4TeSbN3Udb1cKpBucsO8adrGelGg8IdtQa5cxyMCF2TZxjReosWI5rE5dIByonFcezGHLQRWDkJBj+5b/0PkwOWTXf1xqOeQy2qX+rd7A3sTB6nFYx5Z5HOHpo/LDH8scYydSkg3RxpC3Tz1p8eq8NNaPR2sJyejqy25uDuSls4gAC7F51tjtqHUygKYLEgjhLjfBVj5aOQwoAMHHZNYBO59hGGCCxYj0MsLXr2TX4C51ZBUmqSSU83jdJh7lKhWr11O4JzhnUbAURn4LkSr5JjrcJJrMyaBeIFgPhC/PRDtCgvTIz/zUDuYkdoPG76nJXJBbFJCb9UJk6A+6YocN75vjOriXD1rlirW258mpfAAU7GXZ7cJDyc+e3BINSdWr2ixf/8Tj/jvsP2CSUDvFgphbhwTD+NkZLfnKeRrbJ3dYz/ZiPWtFACR0043YWSKC9d4ktW7nOksxKc4eLAEULEUenpllnaLmftAkuHhx3GtjjDL5ikcSqvXfIVjOpqkvv5+86TUhJF7wMdiJnktDXqxtP4AADh6qB1IpcgrPOZfrFzWkimlF0KaJUNOTZBMLXlEMQUwZWaPSkZiqnuUaZTH1PkiMfoiE8rMUV1Cxf1Eapchfji6/5xTfZ8FlnY6IIEHT2DcufA9jTgkqRnDgVzO09WUR50uePC/+2ew84Y3gcukYOXqLsfz+dH5HsJIxgGg4e/yd48EzaU0KJYMlzYHZRS2VwdWf/ACfGwanXnAWE7QfRCD1E80vqQBdsTGytJE43LbssEEzDjAp8jwov6865xI/oFrTg/B+hmrxvEeRzEVOWZKqUzK6E75oORKH8QcKWOSpS/NDvMjCCiFVyrj5vM+gJhH8PHYT3ZrlGXaeofp3sFk0SFGwi2qG4o4p2+pgmKIc8Qk06yq67/KqrrX3Tle5D9H1JOtHlhZSFNyspddoiqOyLDEOPC/8rd+/zkG6Uwnaefs85IGCNPYxi6xXZtO26w7Lje2wgluN0oFaEDwbS3mdDbM02YuxeWnh8Pg5bWY1k0nrF9uXwXFlNHFGkohvXT9ALS2Fd5ChuPNHDUFCaqdWoEJxPCPqoY510Njmfo3qABB9QOcKz0ymq6LUSep4d2UoxRN0kGljtJweJZYDZ8fcxmlH3p92gds9Oxni1JIPCt6KxHIX84LODYoo6ynVMxy5mZy7n/N/iwDnOaHjLO95pPdDWF0RxpPDuyKgYcyccOHyqi3Bc+P/PnTsQhBqQmWc2T2SCHcsjTEUiuuCh/AHb/9CdllrYZ+sG6XnVkRdABkux931w21MMplCxRM7VD/3ymQcaA6Cp3MHhYIrT3RTIUPMohKfzSEPTmpOmgywZ5dsOB15YUtZ7uDAP0iiiqOfMTnCWSqO1VIuhpM2dMYL1qbPi6GjxKaTI7GTVwoKZaUFIHQzpoFGdRQrOc1EwpUMkkxRfvBVIDW48qcN2NO5Xj1Lncg6gX7QZlPJ9H/wNO3fbNipvItcySBXfJ6zqxMepLMBx4X/2ju1oIs6QWFzOT451Gv58e88AfUh1awPRyu5+gPm9D1iK+WpiCyfoBFy2ZAnzhQcIG5cGx51qvg6/JXwd1SENFgNYuJC2tey0n2PoDdDBgGr9lr1Wi2WN3dFBF6KGXWhqoAA0tzchNa8B5+q3OtZ9CLYEBlbg8Ica1BCwTm0rKsvFYQhwk4bqxFKNamzFtmt3is/jRXuwez0cZkaGWiwV1sePjvIeQliy6Tl8QRx2Qznewcz8Ccd9bnrfL/sgJcUBoqH/5OOFFuC48D99+yNsf9pqZmjnJ86dZriFSnFNlM80VSmDnDbECQOfudOOPnm/D3ToZX7wUuZbrmUMY2rJCq/RNoQvey3he8u/oFo0Mzi9IRjJLq0SWKcYPo+pUqSnNB7qDoUTEikW1xFLzcThvrx/N2QPqOznJwipL0ttpiqGMCtTcLJO4sxQS5BZE86jmc4xzMuSLvIDAXE6e0XlSpyuJ3h8p4SvAdbKetVILWhZjtdPsFDhRs3aVXYhC1xKdtt0NWH7ptJ29rZL7e2/9F7n7awbxJk/z+NnLcBx4f/d7U/6Dfo0Jo2rleOCNaCTfwQDNw9wuiezrLrQwOmd37KxXV+x3lTBNq290NYs32Z9q9AKtXWqKwW2mnO4iMNz+I8Ctt2TM2Wgmu6t7a4ZDHKHYZMaEFkA+SrdVOulBKpQRmZEZilCIhYK3JnFCt/DooYPzBD+IwYCgmwFFk6xEB1Us9pInMSm0CkOjTJiRf26qtuKNCsbz3fkWSyZSPcPwphEa9G8HmFDmg9UZRouQtdxJBH+/qNRMvzVV9rSMy+0TsZ/rVvTa1e85iJb3osfwLzqLEbN9vEU+yQU5uPC/8xtT/jFBWcCcjNoabkkRkEwcrGJSIdQ2TrQxkRl0uZH7mMR7mfKYM22gXn3MchZ2WdU2L60CoxGHJ0keH+cL18IhzZIUBK+gLGG8LQgxWxYadKBMBrdIkeoraw6LsLPU25xmy+kVZCwMDFxgUJIQQmXIGnhM3EE6YcdC1IWfV9jCXxSlmQRzNdv/Pbz8xTA4VyDke3B4fQN4esatNh+MAIKqVxGecr3RhDwOW9mHminDSaFuC5yNvAqu+a1F9r5m5f79/oAb13DSbpWjgv/b//lCZ+w4UcnKSyUDeZ6NVtBRCVt7yimQEdUNHHBAxwPt/Ds/Tb71D22pitq19xwrbN1Hb+RYNGaOLPSmoqCh4lYfKRtkOq7KXL6RXDYmL6scYCMj2c/QaMFvPgNKLwMT5CTsFRo0XM+lIhHVPx/fYPggePgoL4rEKiechOgH3EsuQfZeL8eYfsq7ig40MK6OZPZCQ5N89MlMMltGgFQStuOg8fs8eKQRbe8xSYhdvU0kRhy711MourviNlZZwzbVa89z9atHPBrOlnp/Tmb/9XH/Ysb54RI+FWZHkIw1VDr4DJjc0ct1U89E7yjOJux4RSaltnD+Nu77fr1Ov82oNOpelXwSU7B2EZ3ZiyCH4enm2+cZxVOdvJMVfGyNDM818pPaBMgpvEqvMcLOmEcLXhBOyI4jCZIbjys9PcE4ag74TAp82oaRXwvnug7NAJMQJ3+HS6Uxot50qbFCKMyVxBMn56fo9W6t1mdN4t2+w/3WnrNdZZbTi8uH1IjEc1w+EI7EMaKJcwYrTPPs7hgF11wjm27aKtds2XD83gD9IAL9bv+m1ufcDvYEL7MjoQvGycYIc9I8moTWsyU1CJTmeLNfZgZhk1UaKeJk6bvus8G22K2rKPJ+qBja5K97HIBYQorAYd2zXeykRolBOWq8TPU9CKxdkP4XtCWtvprNYBIZ5o3hKo4MGzDCY/v07+ZtOs+whVFwsf0uFnS97jGh7iUFIGtUUXqwVwFVbdUUg6mD7rwZRrVOS/wTuCb/KCwqamDdoxy6cOTTBvcdpPNtix3h71I3VrU8x7yIjG0k1xPlAFKaltdgKXx+Dc+fSrCD8I+LzSrdVNHFWk0jsxCHf5LYQrfofZ+VbjgNca6rIDGgsNZc3raEsxX7syN2VB9yoYS4COk7spYFQ7GNWtZFShuyIcQhVoenE2L1oa2WVrauOmG8L3kpzAyVFMPVaW94b9lalRpC7CewIY7qSlcWPcL+gQthGAR1XT5X+McLHfsKtS7bQ+K6goyGkdD+dEfNPTt3/mkPXWISelrr7TUxiuBHIjUSBjTOOcYu2IRSF5HjKTI2NM0diuc7qK69tCX/tvPFv6nv/q0a75HH5q+HQpfUY9uaJEkpIXMRI0IGbCNHjAdjco9Cie/lYJzM2W3RBN2vkyKnqYFPzNmXVWO+YhxRiJOv5UwL9jGaCWxY0NQqkwFUQctlz4CMTh0RofGBEILqlF+QE1It/H/9ipVcE9u973KHtp1Lay0X1Uvvss1XwRYN1uqReu94bHcGkkm8yabH2a5wZEfQQ6hYEMCniej3XXwiE21rrbmzTdauZW6RzXt8pitEtLmg1n8TkcBVpHDzYLyZuCujj3w+ecV/v8Lx3tb9voW0TIAAAAASUVORK5CYII= - !record {model: 'res.partner', id: base.res_partner_address_25}: name: Jacob Taylor parent_id: base.res_partner_15 use_parent_address: True function: Order Clerk - image: /9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCABNAHgDASIAAhEBAxEB/8QAHQAAAAcBAQEAAAAAAAAAAAAAAgMEBQYHCAAJAf/EAD8QAAECBAQDBAYHBgcAAAAAAAIDBAAFBhIBBxMiCDJCERQxYhUWI1KCkgkhM1FhcqJBQ3GDocIkU2OBstLw/8QAGgEAAgMBAQAAAAAAAAAAAAAABQYCAwQAAf/EAC4RAAEDAgQCCgIDAAAAAAAAAAEAAgMEEQUSITFBYRMUIjJRcYGRwfAVoSSx0f/aAAwDAQACEQMRAD8A9FUE7RhUnCYPCFIRaswSgPGDRgoPGBiUcdV17I0fCBYFAMPGBj4xFeod2EfYDh+yOx/bHLklms2lcjYLzSdTJqwZtxuVXcqimmmPmIobJHXlD1QqKNM1lJJsqV1oM5giqoVvNtErowtxC0dm9nLmHWKc0m0x9G0fMFJfL5YgJJiIkmmoKyYjzCQkJERXEUUK5qSZZc4tWqib1rNCU1k1E2xCQkPNaQ7ht2lzbYAzY42OYxNbsdb6FMEGAulgExfuOGq9fYLxKK84fMwnmaGTVM1tMiuePmpJuTt+0URUJMlPitu+aJ8ZQdjcHtDxsUvyMMbyw7hCxKCT8I+3fhAS8It2UElcDcMdBisdHqiiwg8ITB4QeBREm6klAQZgUEYFAxKPF6TdHjAx8IT4FA7vqjyy4GyNwKOxUgglrYidZ5mUXQrYnVWVRLZSFtwi5XEVCHyp8xfLEmsc85Wi5UXSNYLuVVZqU++TrObT5OuH8hJFcX2m1MRFyjppiOpcPLtIYQtqTp+bTyZVEVYOJo1dJrJ9xV01W1pCQlplbu+EumIFnFxMZO1lNpJIadnCk5Smms1mDlnqJd2IfaN0yut3EWp+keqIxV+aCMppZ/J6P77K/SSfo05zMBEbViRLTRbI6haitokVo2iNpEUJGIUM0eIGnLSXOIIHE3T1h1dC/DBPmsGix9FsrK6j2dA5fSikWLfFBvL0iEEy5hElCU/uu+KJHiUYwyM4uGeX9HU/lrWFOzF63ksvRZtpmk51F1ER5dYS5it6hKNJ0JnVl7mQ7KX0zNlSeClrd2coEioQ9Vt20rfLD87DJ6FgY5psNL7pB/IRVjy8HU62U6j7j4wTqfxjtT+MVKy6+H4x0FmUdHLxAAtsKMCgkEfNELrahaoqB6LyV1c+bpWaYtAMUk0rrblLrSIlNpc23d+WBc9e1jM0bS4+332KIQURkflkcGjx+/NvdTzBQSHmH5ojNQZsZa0qCpT6uJM1JHcokLsVlh3W/Zp3FENrJaU5c04M6r6tJXT7Ilxbi+cpruU01C5RK0R+YrYoOTcNWTNYqqvaa4oJNMTdncKbbuW0iLlt1RLqti7Dq6KcnrYLALWtrfx4aWVOIUkkLR1VwedeVvDzutJlxFZMi0F4NdM1QLlFJJQiL4bYgtRcbGVsrtRk7GbTRxeQkJALZMbSHqK664SuERHp6Yr0/o/5siffKbzksD3VZLqJKD1CRJrRXtefR95yOmeI07VlPPVU1NZAxXUQUFQdo7VBtIbStIboPQy4O49qQ+tx8BBZWYoBowDysfkqW5p8clTOGz1rl3I0pbp8q7kdZyQ8xEP7seoeUozdUE+WqB24nE8mT16q89ou8cmSqlpJ7SK7dbDtPeGfieotEnlSZbqzEERISfSh0i7Ek/8AUTEtQfzWxDW3fke8I6Pd+6/aA+LRJJPzXdPNug9Rz4ewWp3DnYi/qhFRBWuN5wT57eiCFDzB0/YPpGSAqiqmRCRFoPhEhIRWt3W3CNpDuHaVsTLMtNDMSYtSdScmbOVjpy5NN4Rd2U23LpqJ/vSIS9pzWiI7eWEFNKCm5ai3JJVmorsT01ExTIdxEOoIlbt5YcfSCbUha3EqqKQqWD1e9aXVEn0tJJVNq3NGYAi/I6ffNWMqauOmNKxxsSDYchf75JHLZWLFgDdHVVIR0xVVVJQiLqIiLcV0OVKVAtJ3Cs8Tmjhqu1VIkCbK6a9yfLpl70Q+o/WSaMF2bOZJN0nAluVSL2g28okMVFLZtMpfOlFquUB09lYf4Fi2C0SG4h1EU/8A1sbnOGXJwWUMcbvO69jskMyCzQy7ZVE6WblMUyUavhQLlWTLmt6bhtK3zFbtidYlHltkNxOVtlRVPfGtDmpJnlvpKWHMUEV10x5VBEi2qD0kXNyx6UUbWklr6lpdWFOrKmwmiWslqp6aifSSag9KgkJCQ+WFHEqE0shc0dg7cuSO0VV07A1/eH75p+xUjoSmpHQPW1LQKDcChKmpBuBQqNfomQi6S1NIZfVUheSGaN0lUHQW2qpioN3SRCXmjJtUZA5TzJyu3nWXcpB0moSZkgloKCX8u2NgYFFZZuyHRJKqGo7CtRdW+90qf2/LEXuI7QUMt1losg5XTq3eKDzGrulTErh7jOiJMfhL/tA/W7ikokz9X+IopylddoVDKk3N38zcUSCuKubylG3UESKKgmteJuFStWu+KCeHxPqBd+o5rDUzCHQbrVHD9xBZgVc79Vc3mchGaLKkLR5KLk0lU7RtEky5SuujOfHfT7Ok6kltRM2YJKvFVrBARG60bvluIfmhopisHDWbs5kzWtVbqioJCXuxNeMeuqVnFO0/V1QEhgyRS1Cu5hUIfaW+bbBGKFlJiEEl7Am3qQfp5BYpJnVVHKw6kC/7GyzdT+YijhncOkJIpKFr7dO622380bS4XpTw75oZaJTKtKbo2czFq+cJqlM0ESXQIS2ju3Dt5Y8+TzxybmTBRu1l7xgqoltUeBqCSl3UQjtivpjVM8nrp4csYyp8CuFt6DpMSIenb1FDVWZa2LIySxuDpv8A39KCUuejkzPj4cf922v7r1klrfLGqpVNpGpT9JPKYJV01ary0iUUISULaJWpi3t94VLrt3mjIdfZI0DTeYRelCm79mzS75JXZPNO1Mi01kytHcqJae64hIVB2iQlGaaYzQzlotgkmjU7mVs0btFI0kVRTEvduHm/LGxOBrKGW5wITuv8ynfrW+WeCizFy5UFItoqFrkn9oIkQ2pjaO0eaFOkp6/BJzUSyXhvq3W58NDseO6aa2pocXp+hiZaW3e0sNr6jccNtlVVQUjIWabiVy8u6mmVxH7QiL3VC6lPi6Y1b9Hj6xN6Sq1u4eGrT3fG6kvQIrk2zohU1xRLqTIdMovwOHOlU2ZN1Mr8sXRKDaSno1dIvmG4v1Q70NlbJcp6bOS03TcokjNZ2o6VQliqyiRLKcxe23dI+WDM2Pw10XQhlibIDHhE1I/pM92j3UgNSOhKakdGFXpU3eF1Iq/LCjB4n5vlKEaXbjh9eMfCXUDwxhQEJtumbpR4JyB4j/mRDc08wqNpWnHjOonWqq+aKCk0T3KKbdpeUburyw9YzRYFRTt7bywHtxx+vD78YwXnvmFOZtV88mcxAFSFc2yAdvZgikmeICI/7Yf1xgrg+GfkZix57I3Q/EMQ6pEC0alZnzZqbPuQrAs7njSdtUSIbjG4rf0qf8or1hndPBxLGcU+vt5janqW/mEos6txcTSQITpy6PsXwLHRw8Bw/DH7/wAYjXD3kjIs96xnDCbTuaSdtJ2oOFsWBjrOcDLsswPHC0MMPHlL64aZMOZRi0J9EGjq+sayi6eaGz4osnYJzCcdyP3XYEn+rlixszZ0zqakpdUUtnHpGVtS7jMGyAoPUiTU3JqaawqDqXXDdzbhiQzHgqydmLFxL2Lqo2bhuncLk5gK+OOP4gYWxQFTU3OOHOrFpHIKhRmSM4SwSWwcS5PBMk+28b0scSAjHHq7MP4RiJcDc8Fe1rD3VcFHNcmXFOupknSK9OMSSJF5OnjZskmrduJPvA7VCL3Ux+GEVFZQUBXcydvqXoJo4keCCmIzSZs00+9F7rdFO0iHm9oVvlh7y9y7a1hLmGYOY00Xqp+5ASaN3w4YNGWH3JoDjp9n4YDgPliTTWaqNXTYGyYt8cMMARJDsTxSEPAcOzD6x/CNcEUrhd2g8N1mklYwgNuVT9QcO9Ey1u6Wk7hMHCaZXJa6hJp/l1C2kMam+jsTWlOWPdVVhNVOePhUIQEbrVBEdo8u22MxVVN35ruX4rYis4uvLxu5ubt7buX+saR+j/mSj6hnK5DbiU7eY9nb29mPs4w41J/EA5j5W3DxeW58FvUZgpZzQ3TZ8RN7SLqhMK56fjDbM1z0vHqhbideRo5hF5haN3kUBVx9RR0NDlyoIF2R0M1ktZl//9k= + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_26}: name: Arthur Gomez @@ -194,7 +194,7 @@ parent_id: base.res_partner_16 use_parent_address: True function: Technical Director - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_28}: name: Benjamin Flores @@ -202,7 +202,7 @@ use_parent_address: True function: Business Executive email: ben@nebula.ar - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_29}: name: George Wilson @@ -217,7 +217,7 @@ use_parent_address: True function: Functional Consultant email: jones@thinkbig.com - image: /9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCACCAFcDASIAAhEBAxEB/8QAHQAAAQQDAQEAAAAAAAAAAAAABQAEBgcCAwgBCf/EAD4QAAEDAwIDBQYDBgQHAAAAAAECAwQABREGIQcSMRMiQVFxIzJhgZGxCBTBJEJSYnKhQ3OC0RUWJTM0dLL/xAAaAQACAwEBAAAAAAAAAAAAAAABAgMEBQAG/8QAKREAAgICAgEBBwUAAAAAAAAAAAECEQMhBBJBMQUTIjJRcaEUM2HB8f/aAAwDAQACEQMRAD8A6jtr6S052qwnkcKQSfCs+3QJezgUj+XemMdIVElZAOHzRpLQS+ypIAyEnYfChVsHgwX2i04bYcxkbnamtybmIiLW4W0oOxSDk0beHcH9Q+9Mr8P+nq9RRSObG8a3uuNIU5Nd5du6kBO1JVqj85Kgte/7xzRGH/4zfoK9VgE0XRwxTEYR7rSfpWYQlPgBWxahWsmmSAZJwK8KgSKxzkVik94b+NGjrPZf/b/1f70qUkZSgfzfoaVA4Dwz+yzP881I2gC2ycfuJqOQh+zTf89VSJg4YZ/yxSJ/Ew+De/7v+ofemd/GLav1FPX90D1H3FM7/j/hrnqKNgNsUgRUKJAASMk03VLjLdLbclla+vKlwE49M1zz+J3i/MsKVaOsMn8rJ5EGXIbPtE5GezHkCOp+Ncxw9X6nhXNu72qdIivx1dx5Cjt9eo9aVy3okUNbPpD13BrE9K5o/Dpx/uV6vsLSWsEtuLfSliNNSk85dGw7Tffm8/A48K6Ze2+tSKViNUYA7GvE++PWkPdNYoPfHrTCm1/q3/V+hpVkTl5kfzH/AOTSpAgWAAY08537Y5FHEg9gyck5QKB21oCPNcyclwij0aMlxDXO6rHIDgVGn8Q1aNiW1EhXaHw2ptfmiLY4VLzuNqclrsFDlcz8CetNr8paras8gAJHjTWccezuFbmteI2oX7jcnYqWbk+2pWO0cVyrICfp0PhVkaS4K6TtNqkxpMd2d2iCkqd3IJ8iKM8YUaj05f2LtpCNbz+ejqfmIksqUFuJwMgp93IAyfMfGn8q1zp8m2z0XeUyFNoUtgOpCSSkEgJKSCN/gRis2U5d3Fs9Dx8UPdxnGO2v9Oe9S6Kc0pxCZZsUV2S8p9t+HyJworznl9O71ziu0nXO0SHMY58Kx5ZGaqPXD1js046nuhdCbRAePO0CpW4GwSOpyMDy5j4VYemZbkzSlomOL51vwmHVK8yptJP3q1xMjn6+DO9o4Y4mmvPgKg901igFTgAOKwSruHevGle0G9XGZnkc9msPtDn6k/Y0qw7YB5rcnBPh8KVR9hhhblfsUsHIPOTgijkSQhDTZKXDhsA8qCaCQFJFvk4UT31EUctivYMkJJ9l+opV8w3gyeltFIX2D+fMoxihd7eUm1u45ykkYynpRuWr2OMHB6kUGnntWlNk8yCc4J2otnJNkP4x2WfqLQ2LYt5iZGST3ButojCx8cYB+RqGaUkKvmjRFnXRTtwCEgrSyVBko93lUrx+Q61Obkic7Icb53VpKClI6DJG1Qi86PvDiUXCxXBENQOJEVZ5e1J2KkH+I7ZSfHJrOy28lpG7wsihj6Sf2CEW1tageVbZbYfbdR2DqCchWdiM1ZbduYt0FmFAZDcWOkNtNJGAhKRgAfAChugbALVbmpDyUKlrRjuq5g35jPirzPyqTs7qWc5TkD6datcTE8Ubfko+0eRHNNJePIClS2YUdbst1EZtJwVvKCEj5namsa9W0ugpnw1j+WSg/rRu4lmSyqM+0l1EhJQW1oC0KQdjzA7EHpVDca/w6Wq8Q3rxoQNWa6NoU4qCglMWTgZwkf4S/LHdPkOtWmzO6l2t3KGp1BEuN4/4yaVfNZKHTapkhx2WXWyhLaQTsSrfm8tgdqVIOfTCW203FcLaAnI8Kf2dWYkcnb2R+4po6kLa7PBIOxxTVEtSW0x2spQ2CkZ97510VsARu04oKA2nmbyQpWNs+X3pryg45VAhXTfqKbKK17KUtQ64ztWKUlO6Tg+VMo/Ua9aHEllsslSQN87+maB3mI+7e4D7PKGYzbry0826lFHKnbyGT8zRzmBirB9aBmUlOoXwTlCWQgjwB8f0qNxSlstca3LX8hezW8QJD0qM+4pEk87yFKJSV4A5gCTg4GNsZ8R40USSAhsHbB5jQy3SedZbQRyN5ByPE0RCsg4zv8PCpWVp32dmjZbrazslbmE/0JGactq7VKjk+916Yx4CtEzlRGDxIQpAISScbnCR96125chLbTb/AC7A5KRtjw60AVqzlz8UHDFqxzlX2yRlqi366JcktNo7kd0MuqPolZJUPIhQ8qVdQ3y2wbrBMa5MCTG5gotKGwI6Hz8T9aVc02BEc1hq9FltDKWG2FXCSoflmnF4C9sqAJGCryB/Shml9XNXuW8ZC0tOKCSI6m+Rxg4wQsddzvnH+9UDxj1u9JlLadhCNBjzHCw52uSpHMQMjHlv1+lS7hxdZ2uIkWTbJTEj8jES26tai3PZWRgLQrGFNj+EnqOo8c/F7+Wa09fg1H+mjgqS3+S/gQE715zozucVCTeb2wfyiork5TSB2jyMAZA35jsObrsKjznEq2ouD0FcgNy2FcrrJ3Ug+RArTRkstooDiOXIIqPwLc9lwvJWp9xRLm2SCTmhmm9YxLi52TDqi9/AUH7U0Q9qu3PzJd0ckuwy4lDSmFBvtPNayd0jHQAjGPGq/Ik4JNKy9wlbauia2kohpkIlIW0vtjylXRxPKNx9sfCisd0FHcyQPIVH9Nur1FFe7B2M6y0sJ7gVgbfxH3vpQjivo67TtNB/T0dl69w8uQ/2gtKCsHHKrpkK5Tg7HGDUWLPKdfDoPIwwg3ct/QdcZUXyVw5ucXT7Mt26Odl+WEUHtAQ4hWRjp7vWpHo6fPumnYsy52WTapi0+2iyiC42oHByRsQeoPkfCsLXefzGn7fMnxnUSZMVp19gN5U24UgqBHhhWR8q3x7tGcSsMtSnAjPOpLKuROOuVHAGPWrTTKd6CK+6B7pGcdelKo61qS1SXlMRZ0Z94DmUhL6SoDzIBJ+1KmSoBW3EngHG1ioJTfVW1tKwUDsi9yJ3JATlIzk7H1zUi4Q8GdOcPEPORrjcbnMfbDbj8gpQAnbZKEjAGw6k1YLEhLqi3khwdQfH0rcn1+lJGKj6Bbb9SJ8RtMX256VmQNJ3KNBmvp5A5IBHKk9QlSRsryJG1cgaw4Oa007zv3KzyeyBJMlr2zZ+PMnOPnir/wBf8WuIdnvT9ntXDaSmQlfKy4+29JS+D7qkKaTyHO2xOR44oroC6cc5V1bdv9js7dodUC6mYtMeS0k9QhLRWDjwCsZ8cVIo0rEqyHcB7ToTTOmxKuetI8u9SwFuJRIcKIicbISMe9v3lfIbDeT6m1pw6hl6FP4p2+EeXlcjvrKjgjoUkZ/tVrW92I0+ptqG1FcUo5LSEpyfiQKBcR+Htg13bHI1zbU1K7MoZmspSXmsjGRzAhQ+ByPTrS2mSOMoNXoEaFvWnJcJTmntTwrylaUukx3UFSU4wCUpOUg56GpXJuchuMyphxPOp5CVc4yCjPeH0zvXJt20DxA4FzJl6tENm+wnEpZQ9HRyJW11PapHebUMbdU9d/Ctz3HPVt3tlqtrWnIFkhzw5Gl3O4OGS01zd0LKUhPKBnxO+aXHvSVHZnTtyuy6eNt2ZdbjaZtF4nWlbZblS5MBRU8O97JgHO3PhSiMjKUjzqD6o0fdNcJDepjrBxhAUgJi3ltEZQJ2UWSBjbGQc+NT62mLCYitNhg8/Zl+R2aed9XZpQXFH+LZPyxjYURckJYjqU+vJQo5x4+W3jU+kqIkyPaR0VZNK6ciW2KjlQynCld3vKJJJJxk9fOlW6bKDr5dOQegGTgD0pUHIWyRan1jAi2qTLs8G4X2Yw2pbTUFrZagNhzqwkD0JqB2n8SmnINiDmt7XLtF4SspXDhcsoEeBCgRg46g9COtWAlWwGcD7VzhxM0VBuWtJt2uVqehB90kNhPIhYGwVkbZOMnHnQURe7JzdfxaaOAKLTpTUNwUenalphP3Uf7VGp34ktY3gJasXDmC0kKyhUiW86R8kBI/vQOBYrJbkgRrXGSR4lGVfU0UQ4Eju9xI6DGKbogqck7Q4b4l8b7jjsl2CyJVsOwgpKx81qWf7VW3FLi1r+0ajfsT2vJ92djpSJC4knsWkOEZU2OQDJT0Pxz5Ud4k6jk2PSMqVCcUia4QzHUnqlav3h8QAT64qh9ItsPy3HZHMUt94t9kpwr+ORnB9aiyz6aRYwweWVyZZ2nb1/zRbnJMpya5LQ4EqL8xbucjPRXpVjvWduJoqE442VMfm2Gnk8uQptxzlVkeXe3qhI1wkQXjOs/M2XUnlbSnPNscd3z+FdTcHLtIuPDGxXCSsKkyI2XnOQJKlBagdvl4UuDLadi8vF1kmiU6ft4sunoVmU8t9ERsIQVqyQkbpBPmBgfKt78knqon1OaaOyNjvTF5/fdVOVrHb8jfrSoNJlY6GlRo7sWinpSdZafjOtvtIdQUnKVpBH0NKlRCUJf0pbuTqW0hCQs4CRgULeJydzSpVKgIrnjitabNacKUP2p7of5BVcQfZiWpvuKLTgynY+FKlVPP85pcX0JeEIbm2kNpSgZR7ox4V0lw120FZv8A1h9zSpVBxfmZJz/219/6DT3Sh8qlSq8ZANk9aVKlXAP/2Q== + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_31}: name: Edward Foster @@ -231,21 +231,21 @@ parent_id: base.res_partner_21 use_parent_address: True function: Sales Manager - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_33}: name: Morgan Rose parent_id: base.res_partner_21 use_parent_address: True function: Financial Manager - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_34}: name: Kevin Clarke parent_id: base.res_partner_21 use_parent_address: True function: Knowledge Manager - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_35}: name: Peter Mitchell @@ -261,7 +261,7 @@ use_parent_address: True function: Chief Executive Officer (CEO) email: mark@yourcompany.com - image: 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 + image: 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 - !record {model: 'res.partner', id: base.res_partner_main2}: name: Roger Scott @@ -270,4 +270,4 @@ use_parent_address: True function: Chief Operations Officer (COO) email: roger@yourcompany.com - image: /9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCACIAGADASIAAhEBAxEB/8QAHQAAAgICAwEAAAAAAAAAAAAAAAgGBwQFAQIDCf/EAEgQAAECBAQDBQMGCQsFAAAAAAECAwAEBREGBxIhEzFBCCJRYXEJFIEVI5GhscQWMjNShZSkwdEXGCVCQ2JkgtPU4WVyhJLw/8QAGQEAAgMBAAAAAAAAAAAAAAAAAAIBAwUE/8QAIBEAAgIBBQEBAQAAAAAAAAAAAAECEQMEEiExQRMiUf/aAAwDAQACEQMRAD8AcuCCCAAggjhRsLwAcmOLm8QjMbMygYLb4E0pc5UVDuSbFivlcFX5ieW58YonEmf+L5x3TTBJUpoKtdtAcVtzuVXHPyhJZIx7HjjlIa3UPERzCgSXaLx1IOcWbFOn2kiykOMabG+wuixueQ2POLmypzxw7jOaTSpxv5Hq6lFKGHl3beI5hC7Dcfmnf1gjkiwljki2YI6pUSbGO0OIEEEEABBBBAAREM2MYt4Lwg9VAhLs26tMvJtKvZbyr2v5AXJ8hEuVyiss+qS5UZKhu7qZl548RIFx3kEAn6CPjCzdRbQ0FcqFPxFVJh6fmJudKpyovu8V55RvqUo7/DnbewsNojDb0zNgzEwwFBPinmSdht6xctUoEkJlSCw3pTtpSmwEa1qgSDCgltoDSrUAeV4y3lNSOBkNkKM9UXC0n5sJTZKdPI3I/G+EYc7h6qUucQ+G1jvXSpPMc7EHmNz0i1adJtNJASnvE84kBprM00EKQmwTc332EJHLKx5adJF3ZRV1/EeXtIq02oqmnGeG+o81LQdJJ8yRf4xLYg2SssJLBxlkJKUIm3CkeF9J+0mJyDGtB3FMyJqpNBBBBDihBBBAARqsVyjU5Q32HFJTexSpRtZQIt/D4xtYjeZkjMVDBc81K3L7WiYQBzVw1hZHxCSPjCy6Hxq5pN0L3iScpsrVJpt6abC0uG4BJt03tGLKpZmtKpc8W97WHOMDNSkCr1CbfCnEiYUFtoZPDCQd77dSD1vGLgOiP0aWWpTyyVuA2KydGx5X5RkTj6jZxuXCaMmo1+Tp88mTfdZllhSUq1d5QKuQIHKJlheek5lrQ2+Xl3sboKfLrEMfw61LVV2dSErU8sLUCAbqHXz9Yl1BaUXEuKHeVzMJwqoepPsklHrdSo2IKTJsVFJlveG0rldQTrQ4qyieqlb3F+QSfGLvR1AGwijGcOTFXx5RZ1Ms84iWcSriJR3EDVdZJ8bWEXmjmY0dJup2Z2t2fnb36doIII6zhCCCCAAjhYBFiNo5gIvABQebOH3aLMpmQkKYd1cIp6C5sn1AIiAU6delE8R1CXWi5xFpCSVAjkPC3lDI5oUY1fC7yG2+I4z84lI5kdQPOFdnZR0zDiH35pQSs2Q2QlI+q8Z2fHtlfhrabLvjTN4FzM4sTCnHOCkXSXAlGm5JN7bdbRLKK2FMIIUNwCCLbxCaNKsFGh2RC18tbiuIfriZ0pxElLoQL6RYhIjk9OqT/hbuXKiqlvJJP5QEelrfuiVAWih5rMtWCWpabXJom5WYm2ZV9OvSUBZICk+dyNuvlF202oydRbcckplt9LbimnNB3QtJspKh0I8I1sE1KHBj6nHKM7fplwQQRcc4QGNRjDEdGwnQJiu16ebk5CXF1uK3JJ5JSBuVHkAIoSvdrXC0trTSsN1ScUL6VPuIYB8OWo/V/wAADIlUdHXUNNqcdWhDaRdS1GwA8SekI1intVZgz63Pk00+jsn8RLEvxFgf9zl7nzAEVVjPNTHmMmjKVzE9RmpQ82OJoaPqlNgYmiaHqxjn5lnh0vNGvt1SZaCtTNPHHsQORWO4N9uZPlFOYsqCZitVBxDIl1h8qWwNtF7KsPEWIPxEKa/MFEspsKNtJAAO/KGIx7PuyWLaA5NMqlXqph2TdmWz0eSgJP1WHwjm1SuFrw69HW5ok1KqLZXdCgL7HaNnN1aXl2gp5y3x3iANzKmrqQvnuLRiT804WFuOqUdtt4yeWaiVEtkivMDG1Mw6yg/J8vMInJ1fQNtKCvpJsnzjV4Kz3mMFZx4wXNsLn6HU6s4p5pCrLQpB0cRvoTpTuDzAG9xFn5aURnAuUtSxXOpCJ6blFzjyiN220pJQj6N/Uwjzk04+4uYcJ4jylOKJ6lRuftjY0+H541fbMvV5N8j6Y4Izby/xgtDFFxLJrm1gESr5LDxPgErtf4Xicg3j5L8ZaFBaVEFJ2I2t5w43YDxFW6zJ4ukqpVp6el5ASIlW5h9TiWQv3jVpuTa+lP0CL6OMkHb1WpGT9KKTa9fZH7PMQi77xTtcw8fb9NsnqOPHELI/Z5mETmFd7y6QWB5uOEmw2uYCrRa3OOjm0dVK5RDAyJNaVTbHGJ4fFRr2v3dQvt6Xi+sey9XxPNvVJ2b41Wps5NOLYKbH3RWjQGjyKUBP4tgbEneKGpCQ5VZNtZslcw2lXoVi/wBUOfUcNN/LK6jLtqJW2FbDmEi1vUpIHwiPn9ItHXp5KLZXmD6PO4gmZeQktKnnRzKu6mwJJJ6C1vpiQ1HDMlQZ1hzEE9LOtMrS4uUbJ4jwBFxysBbx8ItHLjD9Ppz01V22EtuPJ4aVAWskbm3xt57Rr8ZyElMYrkZmcWCygpW4g/1gk339bW38YqxaGMVcuWdctRbpdGu7XOK2KTlY/Rqe6A7U0IRttpYuL29bgQkN+nL0hie1NPTc5QhUpyzbk9ONoaZJ/JtJClAW5dBf0ELjq3+2OjI+TNyLk99W+xhuPZym5x5+jvvMKFqATf6Ibz2cdyMd3/6d95hbKyXe0HVoyboq/DEkvf093mYRed2fI84eX2hytOSlJ2uPwiZB/VpmEXdN3ASbkpSfqiCTlwXAjxVyBj2cVZIjGB7tvCAKNthFPExVSUaQoGdZuD1GsXh+VI1JbKE97SNx0hDMv068b0VP+Nb+2HyC1hmX3sk6Lxbi6ZbA202BLU9pppekJSBpTzB3JMaJxlsJLihdw97Urcxtak4VpWpJFyCBGqmV/M94AKGxi4sFw7Vc2gTFEkkElauO+5c89wkfviiySDtFodpmc4+Y4l0qumXkm0jyKipR/dFVKVa5+Ajlm/0UTfJ6lWpVughwPZw8sefo77zCeI6eMOH7OHljz9HfeYhCkr9ohq/kUpBT0xExf093mYRcHU2ydt0CHn9oirTkrR79cRsj9mmYRhlpxElLKcQpBUi6bi10knceX8DACOz4u0CIwSqyx4coy5s6G0pPONc8sakkeMQSSvLBPEzAoiLXvNJP2w9D2oMydjccVIIHp/xCR5LMl7Muji2yHCs+VgYdWUeLskwu17u39NjF+LplkD2qM0r3ZzSN7dOhMa2dmjwVoUkgnr/96R41yZcTK6UJspTiANPXvD+EYL824tJbcbIUQR9UWdlgqGdk0ZvM2sKBPzbiGhf+6hIiDKN1nwTt8esb7MaZL2OK9MncmfeA/wDYj90R1u4QAeo3jkl2znfZlNdIcL2bqwo4+35fJ33qE7b5CHC9m2kBWPyBa/yd96gRBcnavywr+bGXdPw7hycpkpNy1XbnVrn3FobLaWXkEAoQs6ruJ6WsDv40DP8AZLzPnZGlMPVvCGuQlPdtQmpjvAOLUP7DwXb4QQQxBrJvsb5nurJTXsHgec3M/wChGG52Lc01Hav4N/XJn/bwQRFBZKsuOyhmJhvECalO1nCriUo0p4M1MEi535sjwi/JPLiuMSzDJm6cQi+qzi/Da3cggh4ycehlJox5nLGvOutqTN0yyHArdxfT/JGGrKvFGh4++0hS1klF3XLC/wDkggifoyfpIX2v9jzM+o1ibnW67g9KH5hx0BU3M37yid/mPOML+Zfmlv8A0/g39cmf9vBBFdC2erXYzzPSLKr2Dz/5cz/oRffZJyaxPlJ+E34Rz9Hm/lX3Tge4POL08LjatWttFvyibWvyPKCCCiLP/9k= + image: iVBORw0KGgoAAAANSUhEUgAAAFYAAABOCAYAAAC60+EBAAAgAElEQVR4XoWdeXRlV3Xm95ufnvQ0jyWVVPPkqnLZGA9gTAwmBIgzdAgLSFbS3STd6ZW1uv9IJ/RKhxACdK+kSdIJHRIIk0kIGAIkNsYYT+CpXK5yDa55nlSaxye9eerfd+690rOwQSyhkvR0373f2Wfvb3977+PQK9P1erhuqx+hmoUtZOFwyP0sHvF+qe/DfA35Lw7Xa+7n5VDd6vUQn3Wr8aOq+7dZveb9fVR/xIe+DX7GS3Ql7xcxs2KxbFFeGIlErFwqWjgUsVg4ws+LVo0l3XVr5apVigXLZpZsenzMrl+7YlMTk/byCy9YLpvlBXVLRGOWz2UtxD3FkzFbXFzUHVi5XLahoSFbWlq0QqFgXV0d7r0Ghwasd2TQ9u27xYbWj/CzmEV4P91ntVq3WCxhyVTCFhYWLB6P8/uQLXN9Xa9SqXBfNYtFSrxfhM8EGEV5rIh7rNCJKcHQgKvVeFEALBcHSH2vT667AqxuXhhX+OqAq/JpPsjcmK4qMHnLVWAd4mG3CB64gJovWEtLkxVKFXfDqVSTLsTP8zxYjGtEuXbNxq6P2qGDB+yVwy87QMuFPD8X2BnTLSRjcfdOS4t8zz9SXLNYLlm5GmbRogBVtSwL0NHZ6cAdGxuzoZEhG9owbDt37rQ77nqzNTU1W75Qso6OTmtuTVskHHNAOgC5l2Ix764RiUUtkUg4TKqVogM2HIqBTdT9W8+9CiyWqg9Zq0DTHzmDCiw0zG/4eQQL9H7nLwBg6i8dWMINxGru397fA7/3lZ+B/cq/ZRV6SQTLCGOtxbL3/rFYGOvkZ7xHe6vZ2LUFO3r0qD37wx/ZubOnrYoVR7Hm3HLG5ufnrbM94R66JZmwesUDL8T19OBa6CoLqY9srgDIFQDnojxjgZ0R4e/00dreZrfffqfFEnGbm5uzLdt22M6bdlkymbQEYHu7sca1au6rexYWqlgqYRRpH9goFhvnmbznDp2YZvMG3/CHgXXyeD6AHsh6ULD1Pp0Fe5Ya8796Vuhbo1wCD6WPKjYbAOu2mLNqbxH00RQP2+JSyT2UdlGhUAckXlc0u3zxkl0+dcxefumgvfLKUX5WsOZUyuo8VAmrq1bLlkiG2Y5RS8axSizU7Syst1gpu12Ubk5YJ1aayeZsbj5juVLZItE4W7yF911yi6Rt3d7ZwftHbG5xzjZt2mT3vPWt1t7ebttv2uPud3l52VliNMK1eZ8wQETjuI5oiwcs34fZXYGLC52cqbCmPsoCGMsNtq9D3t+y7oadtWJN7iIe4HHZRfAi3zJXAOaGdPVg6we+uNpg0RW2uW44HI1YCUt12xp/fvTQIfv2N75hraGiTUxM2CJ+Tu8tH7y0sOjev62tzV07wd8mBCxAaztrhWbmFxwIsVDBdu/ebZNT0zYxOWs1gJxbWLIS1q2H6+nsYQuHLZfLWaIlZUsAGG9K2r1vf5sNDg5asqnFhjducM9aY4uF3H1WeZ8mrLXFyjXPJQSfwiwsRE/PeBaroOQs01nSqtsNrNmBzC+dn9XrsC59TWh7uAXwV4B/e77Wu0YFVxD8WzcW/Nu5DH6fxwqb5GOL+i5sSa576ugRe/zhh+wyW7+9KULwmLNlgpZ2UQz/JvAr1ZLVAEe+rRkgmpvxzfUqPjpluXzRro1NWFtrF3+TcyAsLuEi8IHCc5aFiWK1EXwvf+L+ZgkXEuM6up8iwL3xjttt05YtzpXcvG8f/r/CYtSso6sTS026Haag2tLSzTP5Tg6j9DYwwJ6Zq3jAyiKdf/W2qL443yI2EOCsP5SfZcsHCxElGq+sls8APF/r+V6BHFzRWa677uoi1LFYWWuuULHmJBEcX/i9b33dDjz9pPW2Ndv8zPiKXxOwVfxkhe0sj633bUu1AlDdgRsK16ytvdNm2fKnTp+39o5ua+lI27Vr19x2bU632czMjGMh7QQosY4Cwapa4b4AuYxLWCaYRmAAPX0D1jfQbzt27bV1g0N2/caoA3TX7j2WbuvAlTQ5ZhGLsUMAtlbnnvgqYB1LODvvWWwA6orh+XSqCoieeQvt1wLWh40F8F/KKgfBbDX6B+AqsHkf3nXjoF9y1AV/ja9ZmBi3/U89Zif3P2vVwjIPW3CBqKuj3W29fBa6NT3pFk6uoL212TEEgRvDX/f3rbPJ6Tl78eBRa2putSzvk4dh6EN0yoGZL7m/l0uLJVI2MTVpPb39trCUs0V8cWtbuy0sLmnpbAdArhsYZOHzDtQ33vUmZ9EhtmxrqwIhy12rQNHw6XX2p4tToHlp3nvSABTnZlcNylncq1mA54dXAp5ivR95dZ1XcVS+j/rW6QUzXIEPq48r0a1GoMFPJiIWWV60Y08/ZOePvcjronb++oR1E5y6OgGVqN/d1W4z45OOUwrsYrFkkXTKmmABcYJVFIsZ6B+02UzOvvXdxyzd1WdlrltaXLYQrkbUMAMImRxAF6vWBmddFBvCKAplODK7JZMrcl2CJy6mVo9YNwva2dNr+95wu23fs8dSbWneH7rFZxjoovFmdrCWAGBrBRhNyYEdury4ymM9QFeplr73SJDPFpyZ+/7Y/zfh6ScCG/Eu4ALUq4D1FwF2ZUs8TAqfdebgc3bl8DOWmxp17mImU7DudMxZaye8Mo2vTCaIxGzB2dlZ95qevk6XHBSwtDj0adPmrZhm1L79rw/b2OSUpfvbLQyoonV5/OQiAC5pu8tfEpjwhI6iFUp5B3gJ3lsD1IWlMn63YB2tbRZNNtkv/ur7rIKF9+Ae5A6bcQXtrS3YBQA7IkkyU4FbrwW2EdTg34EFen5j1VK97z3AHDtdY7GNKYfPxlYsvMG9etsTHyMadv3iOTu+/2kbP3XYuptiZHxRGZW1pxM8QNq62PY1Hn5keNjRIxF8+dMErAGnSAZIEGvvdn4xyiIdfuFZu3DurKVaUxZlO8Z4/Dkyr0XAK2K1+r6vq9vGp5dZ2KzjpVOzc7bEm8bw21PzWZvLZNkZBFY49i133GXDLFp7Txc/4/0Asa+b4Ah3DWFczhWwaLqOM74rGZZbtuQjFfDTlSjvJw7uxQ2AuvSWn1XwK43AesGq0Zd4gXHF6kVbVhyCEgF8I+/xT5/7ewvnMzZ54bRtW9frtr7+Sry5pTnltiRplg2uw4dOTrokpKenz6qLk1YhgIQ7eqxnw1YLY7VRGMPEpdM2ceU8BD/tvI746uT0FODO+0EnZgN9/XblyoTb2kne4/S583ZlbMoSsIn55RI7JmtZgls02cyClGzb7putb92grd+w3jo7muHSefws96V9LWZQg6kQLETzQleXAvtaTQ4afWjAcQMKFvFBClyl852+xa7y1eC3nj4QWLuX1a3+Tv9KxEJ24dQr9vd/+ec20tVmoULOtpDXNxOM2sUrM8sWgzV0d7ZaT3entaXTdu7cOVvHa5SqtuLbshEYQfc669q43ePEWNPMuVfsxrkTtnFkt9vmolQTE2M2g3uIECTlTkSdZPn9/f0sUpedOHXajp0+a7VEiy3DqSfm5i1fqmPJSzYFyNtuutl2oyss55ds65YRKCf0L+rx2IisDht1ARH2ELq27Fmss1qfV3kW5vNa3/q8GL7qa70/ICDo934S4L3CD1LBegVuwg94IX4eUDW3C/B1X/67/2uHnn7M2hJR2zSywTYNDliSnbB5qA/iXrScMiQI9Pqhfvhqs42Ojtqem/cCetaSChytnRbrH8Zqu73Nws9mXzlokxfP2o4dt9vM4qz19vfZAlRrFKuMKiXlNQmsdA6OPLJ+2Pr6etAgJuyVM2dsCb+LF7ar4+O4lVYs+bJdm5yzjdv32gjcNhIPsYti1j/Qw3UiztU4Csq/tWBx3IcHbGOU9xOAAOzYKv/yya8HaJBMlPR7X9EKgF3B1IHIkmin+GFQC6TkIuq/z+VzV+yv//cf2/LYRWtrSthOeOPG9UPW05KwbYM9BKRmW5ibgSItu8CVSiWdjx3ZscuKSxkrFysW7+Z169ZbGdKvXSNFbvLYy5YkE2vr22Cj49dsaMtGK5ONnX/5KEmN9AmsDOWqAHXqxXLb21rRGsp29ORxu4yriTan7cbUDAkDr4212JPPHrAsgS1GwHvbfW+1vv5OAIQiptocqBFiQgjPrcQjLjd2LeslCM4AGyw1+J6duvLhAlEg1vh2XgY4n/J6itYaiw1BZRzQLo31JUkfWG2bHzzyhD34D39j+amrtm3zBuS7TbZxw4jtGOm3wbYEUbmPhKBgJTKipcUFtpksImHp3l6rEd3D6Q6rslJhKFmRhxMVCwPQ9SNHbD2BDBO361cu2vpd2wwd0c49f8CaeU4FtVgach9pwZ8jxmi34iKOoqAdOn7cWlisBdLc6amMdfYN2ouHTuO3ULxgJhat2dvvu4fgmYILyGIJhShh2CvZdMxzBdezPo9t4K8r2Zf8VYBag2t8VZrrv3jVSr3kIPjw2RarKoC91M/ztV5a/PlP/z975DsP2rahddbWnLQtG7fYRnL0YSxioKOV4IN2gGlIucotZ53QkyJgRJJQHWGRAhTAE/F3aSoPXmALZzJz1rt+HVyOZAC/rQ+nz2IYSiwUvaNsWylUCalc+ZxjHfK5x06dsvGFedhDyPrZCUdOAmq81Y6duWRpxJq+gT7bvGnINm/cYFBe975Kl11GCcBJko7QaHZV3Vq12lU6pTRy7cdaYBtB1WsbgZXgIlD1N68CFguRxX7093/fLp48ZtuHB6wb+e6mnbusG+7Y29ZkQz0dAFnlRhNuu1XQawVsjG2KrOXtBAJbCBeSg6OG8GpNWEs5kwGwnLXw92UCjyJ2DEsui79KncOdkMu6XVTka0LZEbsC8cEmENEPIlNeg0Fkeb/Wth6bXmRBcUmnL16FjpXs1ttuhZ1A7Xq6rYbCpV0SJYDiIL37i+JjJ/KrwevHEHTuYdX6Xhvghrzff2kjsKuLFQgUnjuRwxfY/+djH7OZsctGHmBd6Va7dd+tliST6myK23Bvu8XwVxKxRaOUIYn848QAFBFEJi/xCOBLPIZEmSYhR0BU7h4W34S36n0k8SFLkelBD6UkIcrIVzuVDl8sq5b/nxy/YYdPnLDL4xPOFdSjABZOWBMAnzx/2SbRgO/5mbcQSNdhqew6QJVPFd9VtqgNXue+QlN5bahXfzQC00joGy119S985aXhEo1/jwdeFWmcG/B2QCDcfO6v/sIuQbfyC9O2GfJ/5xtvt2YAGWhvth75QUBUpBW1IpJp31kVP1bT9gNQWX1VbiyGh5OsB6ie05dkCbi8VsxZ9lEvFK0uLRVAq1hetVLCX3NNflbJZqxOhWAK5nD5xg0bnZm1caTGZQLWIhlY39AGuzQ6YWWsfDsi+JYtm0gSiqxhzaXXcbIzKS5CU5+huaIH7KvAbPCRFV+oDnBbC+5ag15rrSIFzmIa8HeJhi9TfvYv/9oOPPO4VXOLds9dd9neXXvYzhHb0NuN9VWsiSxILkTgRqhB1bHcqqTDJjIquCkCKVyTLU5uHAdEbfEabqGOVfL/FsFlCNgaOm4dMEP4VAEbAfy6qgFkTLq1ambB8mgVGdyItvsU35+AL88gK1y9Nmq9gyMWArwYyYLS2t6BXq+KwGJo0eMKWOwWSaMSlADWQ/H1gV3D6H1rWzHQn+xJHKAqRCrGrWDrr4aC2Kc/9Zf21KMPWTpu9u777rP1g8NE6bhtFWeFgAtQfcgyJTLzBPhXJLtmlHvABVEMDv8IeGxErLJAoOORyKZqFBdVn5IHqRGcwriKOkGuzL/j/LAK2BU+EyoHZZdtmYBVwCVoJ4xDzV5AbL+2WEAyJDsjWKqaUAPEQbi2EiNVPCpkX0oPvYXn3uDtTriaLZAcNib3a9yCSwBe58NZ708F1uO8HoH2+OyK9sB1P/7Hf2rPPfmo9UF93vPO+yDrG6yXksiGgS5rRfXO5ZawRCoWonVaIMAKJYm6WA9+gk/8LQ9YJ6GoYj1heC2vdgsgEMIKTKxuHeDck+QRXJaXLME1K7gAsY0YO6KEHFnASlV2EbMQsE8//7ydnVqyZQSeCs+5fsMWeGwzqS0cWqqcSkHImspKVNaJwl50nxWcQGgy95ORCX772v51rV714yuAR/SolStGcgNaTyUOPk37+Ec/aQeff9r621L2TsohWzdthRW0kFHVLBWpugzHVWDlY8WF5VsAs4q/rUqrCMWtua2FG0HhX1pGJ6CqIJfB75yAxwPEWIwSwCLX4k/hxIgu4sLyrXL5VcDOC1REmkZgn3lhvx0fm3OaqhxmCWfeMzBgu6goNBFop2dnSAmkJct6KQ+pcktwrUiIGV9+dfBaC+CqML0q1DTCJyuSwUubdNmk2/JB6stWJk0tZ8uuT0BcB5XN+YQC/LKzJW6PP/aIffRjn7SbqIzee+dtNoSa1RxmoynIqM6fRjWyhPV2r8eC2frFHIIMQMIaqvKVlRYrdaURYli4iRlrEvC9bbZcYFFiHdwQVAlRJsRnNkOtjLeXAF4t1Ug6YBF1BG0gyMEepseu4SqyFBY77cr4lD369HN2enIaf9pneSqTk3NL1tE9SKn8LugcOyBMeT0Hy3CuShVmLBbXI78fGvspwL6uH/B/4UQPl5Gp0O1VbyVIrKhh2sZYhawFXcNyUBv9LoFHpBiL7pmxP/nTj5OnT9v9pIo97OypKxfQARa8amqCSD27TOpJcGIR28mSdm0eti1bN8ExOyg2NlmpD/GG7Vu7MYm/5MGaqaRiXdUsb9wU5Tq8H+kre5+FEV/F0nEBUYAoL5C2UhYSR66yaHH8uiL92es37OEnfmSnr03Yzt07naSY45qJlk67nSpCujVpY6MXvd3H4zuNQE0d2lkkCT8VWL+h5XXxFZ3Sh9vuisJrqrg1VrrJbWNPH1vWg/GRJlqPXbluJ09fsIcfedT2799ve7ZtsNDyjC1R51IBUBRmoC1us0t5y9UIECxOGwLIYGfatm7AF3f12rYNg9a0ftBa1w2YzcxZle05Q9YlOjY1PmdX+Vm+kLXe3h7btHEElYwyt3wq1KuVABiGp4r3ZhF65qbHeYYynLhqN0gKvvW9x22xFLH1XH9ymloZ9yDlS66gk10zM3kNq6f4g7nGVcUQsCyWa9wYRSsIgHkt9F7PtwYBL1C9XFuSdrvAVXncMQHcBBplUkI0umYYzlh2NKeCehW2J7/7iD359At27JUTbK287d6+kSAWs3VIhLrZTJZS9xx8knL1ApXXEts5HaOkwrW3DI1YZ1unDW/os5vuuMM68H1GUBo7fYJumUNwTxYjX+Zvs3Zt9DoqVdS2bt1s27ZsRjyHH2NmnWR6rQgsiuaqWxVoAkmwjZax3tGFnH39375nuUizNbELKqUqAS1jI2iyu2+7DbcyYwvTN6yOS4g6YD2dIirWImDHc6s+9rVAXNszsBZ8JwP6bsCzVrlSjwEIbDoBLMEblQu4AAUhwK/hDlSj+saXv2IPf/the+qZZ+29v/pL9uY37rVYZclybM/Tp88QjakUTC3bPLyyDH9N0XzR14olQ+wHuvusgKS4cfcOe9+v/YZ1o4jx9DZ24pgdeOz7dobqQZgulcxijkiOm4DXqmegr7/X9uzYTCQq2uzkGNndoGvo6EfUieDb89l5AFy08VzZfvTycTtFjW1j7zprp8HjHDW4W99xn3UOD9n81A3LTGHh+UWKoFRrnVyI28ENCIQVVvB6lhmQz0ZG1kjPGksvDligbGzoUE0sQaSU/kK8kPuxGtuwBav77te/bt958EF75PuP2sc+9hG79+7brDB3w7KzU3aB9DFEzt3SvwH1vkjeXrE5fp6XT8T/9vevs+tj0/btJ562TcObbd9dd6Jyle3MgedsV2e33XTTTjs9PmrrUaam5hYANo6A0o5L6LWOFPJiERqHESTwdc24hJ7uDupuUuqoArCdX75w3R599qDNkr31IqqE82gWXT1296/8io2RSBSpRGSnxkg4clgsjStwbFUphKPHY/OvT2IdTRX3XNEAPHt9FbA+bQp6D7wOGS+Q6aMGDYpisRKqKYK6NL8CUG38+hkAPc62/e6j37Nf/nc/b++6902WsjxFviQgLlKCzlm6h2JeLGWdPJS6DfOQ+MmZSbhmyh770fP2dw88aPt27iOKT9iRSyftrz7yB/Yf73sH2dIl+/6Rl+zKyQtopmmbhyVcpLGujfrZnbfsQfuNuQVcWM5ZD7WvO95wi21EWJ/GirMYwbPHztrp0Wmbzs9bjCQhhX/d9+a32vZ777FrSwuWwR9nRq+xPVEIHFX2mgaFTRmOG5prEGFe2xW8GszVThYPbTyqRzd8H+Eo10oPmHgn6WQZCZhcPkv0TafxV3l8LFvxxSeesEuXL9hLh16y3Xu22Qd+6d1WW562GFSrCBDz+MflpWvOV3a0dVkbwayNrpkS/nAegfrTX3zA3nTPz9n7P/ghmxy7Yb/xXz9kH3j32+39RO0kjRozlaydPXLeMDYrwHen8dVq2CiTdIjSSZbsWL/RHvveo87vfuCXfwH9t9km5pfsS9/+nt3IlCyTn7N33PJG+9V33G/xzi577splZ8WL+NckWd48Ptb1cSl157mr3FtFfQfzyEKvl846i9PmbjDqtVlaY1dLYxBcWSTJg1JJ1OPKWpTVEslDpbmR537wmI0ePmjpoR57av+P7L3veZft6VlndZQnEk+LAU5IvVpEbEl6EpEzBCiVQ6amZ+0HTzxln/rox6yyjmotbuNT//NPLIW137d3j7Vzz7378KXRFFUGKrlafLartukyaegEsuAYzSF7+Nv08E77xd/6b5ZFGnzDbbfbeQKg3JULwsUF+6P/8bu2ZbjTQgcu2VJLrz3SVIEOFiyWoeJboPgYiEGoZ1LYHAWTVvDjYDUK1Z4tvt5rXKr5OnKh+zv01DAKUYjsRZqT02fVY0UK+vyTT9j4i8/ZzjtvtWMXTtCMMWYb4Kb33H6HrYenLiPCtDRTBdX1oUCuYqAWTgqMn/j4/6bZba998Dd/0xZrS0T3pP3LF75Cz9YV+73f+h3LUb+aojRehB1IBFcxUUFKASZKIEyqiwXrtPlZK4aT9p8//An7+nd/YC0szD1vvh1x3eua+VlcxO4dQ3bjynEr7L9g+97zXjs60m2Z+ZxlSSJiKRQy0Sxcn15fJtCqUhuaya2a42tpBrWVCsGP67KuTUfk0gHvgR98+p7BK+DCE2NELUmQTtDD+hTZDz33nBVfOWQp/Gj/5kFX18pDxC9S8MuT0rbDH6tYYg/csx3emyVa5xYydvLwKzZBMvDvAVVBKjbcbWV01IOPP2kPoTt89MN/ZE3JtGVTUaNPxW5cvWqzri2JHA5xJk31tz3dwmuSFqaIODmxYB/8D78LCynZG27di9i+hW6aOTt78YK978677WffchugzduZh5+znpvvtBfoya1RC9O9VqI007FQ2qEllDPxYwfsRPanqCgBQg1fX6W3AqwHamOQa1gECSREdEl6InY1uWSVRRCcT1OXyhx8FkEFXsrDSFcY6usle4pbhtUfhewvkDKWUKOkPLUBrlqWLp27aDu2bbOO9i7brHJ0lb7Xq5esFyHnzz79Kdu182a7//73Wa23k93C+0kh0w3iRpap2JYRsPO4l3mKlBtwGz94/Fn7x6983X7nQ79tk6NXbM8tO+3UpfN2mBLNZlqI3vvOt1nPzhGrnrhuU/E2+0EpY5UlAuniPNpw0eOvfte4utIdsOMrfQWryAU1L/eTn1BB8H7f2Jq5moUFVwuRTtYJWko1pRBJJ5VooV7q6xcv2vKJ/XRRT0H2U7aO2YA0gokam7t6IfxURJ3ir2If4ObRSkevXUdgrpHiVmwb4LZs2kEax7zBS/utjQRv/6kjdvbCVduwfpvlaKJbv2kbDcRtrm8giRzpeB8aQ5HEY5IOwnNXLtnnP/sle+fb3mkx3mvfTVtt49YRe/CRh22Ctvt7b73Duthn3cM91hlts1dmsvbDpTmrEwhDYQSYMmmwgEWc14fr/F4rwrwul3X4vbZ8qO3V+BFUBoKXK5utFFCqEEkKiAU1gNZfCNhFAtDlFx+3DPQpyg1uHuxDRCFjg660kDpmaGaLsp1lBUo/5xFRtJAhqVdw4y2UwKudCCSFBWtRDWth1mYK0DGEk8GOdURvs/OTM7R1zlhWeixuqQkQWti60mXzqGHPPP0EvQe7rIMW+tuhYSP0CpyhH+FHLx+zHbfcZj9HzxZ9oJTWkRhzIfv+iXN2BqkwCU0Lx5HSySiDCoeTDMUMHLBrXMGPVQgatIAVK2zAWBRjLbCeIXvitnZhGbqUhjcWyBAqEmMIRPK5CizHn3rEZq5dtiSdeut7W+G7qm1UELw3WBeNGHU02QJbtwmNtrqMqEwQPE9Rb9Nmul7wn8kdW2wZ4FIAGGarW1cTJeyXLA4Z3Xn7LRaiDUmBrwpFyiAdLsgvsghqkqszUHLh3CnLwEK2bduCZLmejZGxc+cv2tkb03bPfT9vm954qzqVkRMX7Oy5a3YY375Ek3MU2raQm6Ixun01sDulDx7L+71uShsA3Ajcys8arDesRv81H4HV6sfSDGo49TZkvhzAlqFfBSlLmlfAgi+/9IydpJafqOdIU9WWPoDcGrcuGtxS8ZQVIIiaMZCfrgLEEjl8Dhmyu6vfUrS5VzrRyeDI5dOXSIdxG/1Mvty4bvXxWZvCn9bRJ5RxNdOQIbLpVKgUbIBsZXps3M6ePcfW38Jr2nATRbt+9bJdvHzdhrbutZtvu8cWMIguAlK2ukxvwTG7hCA0zcK30BVuySIGknJFSVlp0PIqqw3NLDewAmeJnp8MhjMaGzYCS1xroWuThkZ3EAtLzcJM6xrV8QRjSXZuVgpRJZ+ltkST8eWjB2zvliEb6Gm3VqhRD4EpFqNHAAlWETiVpiV9JmOHXnqZzuyU7bplLz3uaLLpPlp+mO+6dHfxKrwAABzVSURBVNGatMjyo1imvlb5foFcvkybZh43UmX7VsU15Qfx85qCuWnvboQT6QiLNoFLunDlKgjErY8a1xvecq8irxOCjl65YhcZg1p2PBXLxJVosRW0BKxjBOgfzvikFUxlVvsK6r6OGgDnpkRWOgO9n/6Yq1ihY6twBwbtXAFdUB6wIufqfhawmumi3sTXEFz16vGjdoyC4kh32oYGmLGinNyG6NHRjM5KNUFDbVYK2Y2L1+3ggZdc9rTzpm325rvvsnIEnZWa1ySUqgygqlmF1fix+yZEcoIf1+LNXEkGPuVALiBqq8tb40ntNDMDMwXJPCrYVZKHMsHRbDtp8vCW7U7Fuj4zbReo2E6iHRd8zSokK8W/yhGKvzoOG7RwwpRCkxnJz6vlaOcYGwD0Qs3rfwQJwlrFQZdxi4dWoAKO1zjnVTAFqla4ApfFdm3x+lV76fFHrIUAsXG4z2syprF3oKMX7ks/FOygym2OXh9n5usV/OIZmjva6UG4mR6vmIvuz8OJL2NV6xiI++Vf+3XbQE6/RMIhvVWTPTHFAlQ115iB5lB17w87ANw8oEt/mCZZICJR9Wgi+XgDLKLZLs1O2PXJcZuhnFMUV5UOIO8OwEUWssxzaeKmALCB0blC4+QCg1V6dKHsRhcb2tllaz+Nbvkpb6M7aPSxqw0fWK1aSKE7cgMlHlDAqiUyh6Bx7EdPoDQV6Flts3X9PTbQ1WWdDGNEkpRRKKGUubfJ2Xk7dfyUzZCKcgEeLGut8TwTNctMHHbbm95yj/UNj1gBv54krwcZghEFRjUaMzgWVvEQYboqa3XvX7EsIAuY8yQDqmPJzNYROLdt3+V01cePHbbrtH8W1U1DVqaamIJhDCPREF8ZDUId4TKUoK7nduLY7JJritMc6I+Dq8G5VWt9vWrua2Vcweqt1MyClnn5V+iKgK0BbA6atQRQlw4TwHj4ONMeQ4P9SIHr6SugSxt3kKfyWsAvTUDPzp4+Z4skDjUie2Z2GrmsYPfe+3ZHmSL0qhIWKV+TSCDYSKKIigOzQ6gm4g6WUdYAgeYMWZu2r9rnBdY1AlkzQx2L+OEEvQwjdG8nqLE9D/WanJpCpau5uVoBqGRDap56ydQ8ooURmJIN9SHDCV2dnAF7r69TUyUSKmS5wbBrMPShP1gbpJylN1jsWuAFrgYqdBPudwoYUn/wZ2VK1RWcfZ6sKUMT2zhZTgpYKpWc9ZExbd24kZIOGRgW3QK4MRhChSbg6Ykpu3rpkusNUKo7dNMGuqwRuQG0AH1LJoj4JCNlf3qwSuql5oyQRh1ZxHIOQDWsDCjqYlwmmMlt5gBmHlCn4c6j+NN+yvAaOVqESUgECqF5KHWtsEhyZ45W4Y/lSoJsSyV+/dxZ7Pkro25A1k3xqc2chwmrdi9F1bmFVR/7WsC6XqUGjSB4TWCxddX0pfaot0p8EitVnahM4U6+NltCxptbtBsnT+FjacdEnNEwnHpk+9VKuTRli/N0dVPe7W3r5Toh+mVnXSdNR0ebpagIYHryalgqoCoDovWnTJlbtE3lcu1EujXQDsneGOnMMeWoErhGR9X1Iq+JSmnXGRjJa6iExCGGn5fFZiX+SFlzZXvuX4PRZH4V5hI03ahnaBT7VVFxCcLJcxfrapoVZYkTfVXCVQ1Io+0OWD8qNX5ttExdRN8Hw7trqVjVU3/dm9VZyUqZyRRALWmGS0GsOmdhOOWlI6/QtxpB9lOvqUG7em375i0scsH+9cFv2cTFcQqLvfDhZlvHHEL3QLctZOZtEL67DLBpKVeksEWCZZKFiVENUFJQwgeqYVljrnXeNwuweRIC8W+VU5bhqHIHV9gJM2zpIolLigWdlZVi+aJQmlGQcCQLF6NTOu0qu5prwa2Jcjn/GuCgAHf48Av1WJw6EkMQcdLIMP92c/vONVAafI0CQwCkNxFNWqcLcgNV+qA0cwAN99wKb0ZK4LEBapZutSllFPJYTHGR5j9Rn1mJ8Hbp5BkLMdjWQwBRn9UgvVE7d2639KZhm754zU4/d8yWRmetBdqmwWiCN9fj9egLZcAJU+xTlSKPC5iBk5ab6FjEmjfBU7v6aKFnsYoaRZJwgrWlscYM+X6+QKGSYbkC93oBjdaw1DhzDuKo6pKRkqvnw1bd/YumZXE5BaYb3XPhR5LsEp23IM1Yr6mqpXT//ifrcbZQgp7TeJN8GekaFMUB6+bvPattBDgQGvS1gu/SVhGoNSzSbXvXOq5OZ3wdNSSnfAlYBQoBm8NqIO5qeiiXVHsi4lMKz+ES0tJKcQn9jPqMjAxb7+YR8nuaMiZ4/dSiRQClCb0hpAExXQsuKdORXOeIOku5xHtW0V1TcNTWliQjRJ3uHrOUwYtQKy2yCpwCtlZnIWgnmmJWdwwf287BEEsEqBTtQkomSiyinlNTh5qgzFMtzi4z3ahEQ61ESiecuiWLlZsACwH71FMP1RPUj5pamA/lM85DCNgoFqcoh59wu1sXDwKYWxX/syL6Aj90AOM/3TwpNxNlSzmLlUUr02DbqO2xSNDJUgld5rOov4ViCdgyVjBH81kEy5NW2kXbUA8dh8MjlLmZ58rOZW2WUaEy/q8Zy+xmQlBnKWiqJa7xHxkAP49QuqGrjqYNUja1ws9CzfCxixQhcwQuZzDqI+OelhkOmYSjZhHQx5iQiXR0WKK/i46XebQNSuRYRI6gpfldPa8GlbMBsAQuuYUw282LTavAllWaefT7/1xP4gZSCB6pFH6KrrqYgNWnVH+sZ21w8hy4nx+LwgBqCeupVAusGqvl6JuXdESwWrcIftqnzCgP3cnStllUACM/V+lGFrIwRlMEQkoPrexpOKPq/nsZidekjOZfC2zDIr6vSPNv1HVwc/YAPkHVAdGrKJ3aCjp1dIkavjpKVA/BMSuksxNwZZ1noGvJSPIIOqJbU1CpSWjcHP61b+tWqhaAiYFI901i1QUqvxpe9rJFXAHzXkv0OxRR7GRrccam3GJpWoXdosAmShZ6+JEv15vIMJoBtinFiqG8x1HtPYtFBlO92vczAcCNwKqMLLItf6lpvRoP6xp9/QxOi6PeKL2ZQPWGhPFpjm4pv2ZRWP02egAKzMCqQtDC1lKTRBfCyS4aLDq7u91pGM7nwxGzRG8BrK5BddTofIEEIMax0AiBS+fUVLGgJqy2Mpth9mCB91THitdXpjEm9cHquzy+8gx9sDH8agyLzVMTV8CNE0jrys5Eg3lP9wloRYJWDnAL7KxqhZYjfi+Got0ZcNgSvDv00L9+tp4A2FRLOw0R7TjiFtwBx4GIKahzuoHIBv721a6ACE+kzwOW+Kl8lrcSnusQu3Cpo59PF7UIEiz8zKdMANKYuzirNOgiEVtZVQoQpcHesnenO/EiQRalGQIV61Tk04KJmEeIyuqB1SxCFEtV13dNKj47J0qRL0fFNcMsl8rTiuo6mkSnZWiCWwzo9Jlz+N6C7bn1jXaRtJail82RUXUANKuO0qE4QsOIervwzfKzBarMZVyQBPuoq6DAePxESq9TQhP69oOfrieJkKkWOCEBTPmxnHFcTbs8nPqQXCLgtrffUOSr5AK4RKQtUPWURXg+k22gSkFAPfyjQQSkMhwPVO9TXLBa8yqoSuPVkVgHZPnbJrVFctObUbz27rrJ+Vk3Cyw2z72pNzbHDlBVVqJvTdyVHaCGkRr3s4yVlnAdbSQRmhNTQ4XKOxoXFa/NEfQWcBGnT12wm2+9xdZt3GxHLpyzKtnVLDSuiesneGZ1uSqREWCO/PPsskgplG7qUrekGQYxB4ypjCUXlHl986t/4QFLa2OTAzblyrlJrCAGP/NO5vFADXLhILuQr8qRa2uLKzCUiLqOcglUgcDXgmiYFsDdnCe+yEL1VTchv6xDbRRpkwDGPrEKWVFK783W6x/ptC1kQf0Aq0MfdBhDVbsJv1oRoOAc5+/1cGX8fFJsQaUbfOeCBuFaEzYPjWrBVeQAUgf0yEWMcgLHYU7yWDe00X7+Pb9gZ+gXOIEWK2AjpMELzCA0aVJHZ8Bo1oD7D1yhVCy5AY9mepmW28WNwH7tgT8D2CQWizvgZgWqinmyWFlQ0J6okXWVeIPOajl0be+c8ni2ksDVzKosU9Hf0TNVCyDLcvrOFfhHQDkHz99JaRdRr/hiufivxI1mVXQBPzuXYcK6GU7bz9wXyQESYgo5samVvleCrNJYVw8T3dOMAV9dDFF6io6gAyPSzIGJiegwngzi9AxCzhy1rBuUb3QewfvefbfrC7u6sGwHz15g62ucsxU9AveB9Wcj4uaOFjlX4HQCVR90+INmz+iQCWKOy8h8thT6py/+r7rGaRQtEzSPNcla8bECVqPtohKas3KUwuenajZ2vgRAswSeLMzASWeA64DFJ7m0zgc2iJRFXutZrscqhKc3PeSPoiPBkfNZi+iTIjAPG+bBBpinWr+uz1GwZmhQggePE2TVNh8mKotLalxTzXZS45ThZUgEZJ3aGToLQTtpmgHlWfq4JmjJjLNAb/2Zt9lGqsJLLPqB06fhsbRy0iWzzELojITFeco4CsXisX4xWzRNx63ozC/51jyW61ExHXLWAOwDX/hE3Z1YoUMWdM4UIDaCqzZ11d+b/P5653dxDXksRMBm8GPLOHtFWVmsAFO0lzWq0FjlJrw39qxWGYtuIODF4squXOxqZJRNBCwqVRzLLUKJJmnlEa8dREqU1fYyAa6zs6RnqEMsjLDi2IJqHn72J1qlhc7innRmi3t/FvzChQt2AxfQP4jfvvU220qVN5wNkb4uUuO6aifp95rHnUglVlup5m3jnADnzqCRpQbqFS7Mu39YBbRP/24E1okwX/78x5jwYdu7ITDvUyA2QWMSoj3+v/VVI5LOFXBJ+VadkzIPYV9Uk5imASWGSKhQAHHiBaCy/fVV52DJt8pqva3viTw6kEE1Is9/e8Cm0SwkGdZxF9dpUtMoZhIaNITlDq9nghGtVvesj5Smr/1ZJy2smowdVxbn1RF+BEUdL5Xje4Gdbu+wt739HTYEPy5j0eE8oo76DXBfh0+dtMt0EMI/LaOCIxhEANrrbtFIlMY6Ebh5JjfL5Z8xs5Is+RbrgP3S5z7CAT40zQKoauOy0JRzCUn3b209WbKsWBmLi+AAkfVvdIIKqWQ1AVtiOziApGn7rKAq6sNd6M3yShHZmvJVTprEpQhY5zZEl0gmJDEK2DQqvpotcgS8OTVuQIXCMI72dJNLHNLEBHcID4c2uOE6FSm1g5h+CdySSi9VFn4WiiXhZPeem+1uDirrX7/eK29IbUOXlVAtvaDMjR88cdoOMTMbb+vmvZm7bZKPFQUgHui5VDkAWLkIzUgUWUTPVWhn8px+8hT6wmf+0AMWi5VLcIGMLKZFvkzA4ntTchFqGvZJv1Pe8UM6q2psesIBK24o/xkwh+AUDQHpNAVcgbZLEYcfFHZ1PbGAKr/XUISAVZhvhl+205PqwiX3pMMeF2bwjzNYHr2xrnEZID3/D1OACcgd6DrOFeHjPRKNW+HN1HI/DBe++2futd5NW1zTsXQNZUp5ZEnVrjJIiW2tPTZHBfgfvv5v9viBY3SJM4i8rQ+2EoJ+KXR711aioNOdxJhKJDqropTODvL7Cr746Q/XNWfq3ACW2uw+U0TTZi+IkcmklN34HSpO4PWBlZOfpsdUoApcbXd3ZqHP6fTVWah8HIB6W8Z5Qweufh8AK5BUxVACkCJZ0ISMWuy9cpFnjYvsjoX5acDIkFpy2hvWIi7cSAdlJBq9d/fOoqjXdhO+dA/NF+s3b2MneS4qht8uEuBqJDZKSPQZIcLHOQVpP6B+8jOfp5O8Yp3MzGpKp5OdQj2W+8a9KHZIYJLfFTtYEamkjfh67Jf/5sN1abEaphC/E6jKeFoA1jWNIRbLv64FVv5Vh9TImrSV1F6ph18Rgrl5vaFOXnPAaluy0sExfGUA1gNGNMnHV3UAClgpQ/Kv0l0DYLULHAfWCZyafEFnld6QYUy+StbntF6CpD5i/pCFex7u++Y9ezn17S4yKvoKlB5hJGX8sFtZVaVJUQvqsIHZKJVWnYzSrT1/4oz94Sf/zHKxdhtCmBnobuV+9AwkNOw0HQhVwMA0UL364cUf59r+8TN/UNdNtJKr68AwcVl9L3fg2EKSjmqioSfmytTZDjhzzZBq2+WQ/xQo1GUiEJUQyCVkAUHBI0QLp3MBFASLarpwwdSrsbkBY9Xm9TOqeJrVKrnSUMjSdM/1N7W6+pVAK3D9EteL6WQMTSHCBpS2aksGHX7yz4rmSse3Iqjs2rWLcrp6ZNVyDZYa8xQp1dktblGVxOCXJxfJ8tixNO1WwyxeutM+8ucP2NMvXLFaiyaBdChljP4yWS4xKCl3Jo2ECcdEt2d0omViJaJ+mhN+6KufdAmCLDQAVd9rKznuqqkSx1+95EBVVqdT+rm+MicvUQBUvjpQ+Z2sOCee65QggHXnUak4yXb3/ZCLsHXaIGsaecfPk1bPks4+QTvmLVt22H13vhn3oh5/sjFdXye+AaaAjVAp0JZXaip+HWQ/SiI2Ui/btGEjh+lQqa2jQYgs03nitf17tbcwVqWFyNKQ19xL/xfMIcJr4pwd88PnD9l//8RnLNzU7zp3pEsLA5WN4nSot7bGqMulGUlKE/SmndtUe6homZiPG/l84fv/4HismIAA1b8FqIKVpxV4bCCQAQWs+GJw4q9EFy8oAba+AqB8r1yDovME9SodBCGr1gkXqg9pATXvqp/VmpmqCeF2wp2MtBfsa9/8jhszup/xz2GOxQuFGNXEIpRZ6dAGN63tJrY5GQ4Ll6XoOrpXlWy2b91hAxpNEh0TaYdhuAKp6qMqOWvLqHSi7aqdwqLXa3TKFJh+IfEohjvst3/vT+wKB0iUdN4h3QGa7FZgddkjJaUkC9pNT29XN12MnTqvkUAoF6ESueJCnUnwUy9+07ECcdagz1Pfy0o86sRAmD9TIFRchUAcldXz6lxeUFJC4BR8HkanBDumAMATOkAXuqSHT/Iezu8y/6/t1czQRY4tWsqFqbxO2wvPHaHlPWn/5bc/RCChgjo/xY0j57G1BWxZOqc2G8JPReVsHSgBtD09PVQbRtwxTwJB9yOgpYjV1Kflhpx9Twg7ceCKFSibopu7vHxD4zP06XbaJz/1z/bQU4esTrd3ltGoFnqzvDITiYyrd3mNHjopSfhsWNfMAZTNGIMONsOwJEbluNa1E49RyPQazwSobkjfe7NaSha9g8z0EZyvKfUqOHRHETvY2iL6sl6RcXesHRY2UZh1HFdtQbJgCejNSJN18nTNsl64UbLDR46jRjGjdfWG/e5/+pAbpFucH2W4Y4IpxH7HqbVLZLEuePApV6C290402620AslKXZqNwu+SHJ1loGCI+O1ldV6lWPk9kdQLXnyfx1Wl6FAsVPP2lW88ap974HG+X28Xx65a1wAxh54zJTRKtLSMupYev6KqCQATz2gWacE1EPiRL8S1a7iE0PTFZ73TON12X1WwgtF310En7cGf2tblVdsJOK1z2i7T8liAlB9P1PZ019nStLuBeXjiFDWtSoXtVY1ydhYt8ZeuIttl+fms29Yj5O0f/MV3cSjEHMc7RziDcMFaafZt54yYGNs4z8KowquT5TpoVO5iNmsQn+gCq5IL7j8pmgj3dgNlonqSFeXd/YMfPGsVqB6LiBC0s9C2hx7/of3F3z7AKXEDvC8iEf9Lo4y5407UBOf0VlV+ZWVEf19/DZU4yYjaXa2uU+Mo0eMi2tMsZmb0JWePwVxWIGY7MMXP1IOlSOe4mlfqXj2ARyD7MwgNHTNB950sKEvknNOJQFKEIik7f3XSnvzhYTt6/CK5PGLJdNlG6KC+ePmUO3Dnd97/PgY1GIvlKJM6wUSwCFjJmDoRIwyoOs6pC27ZTZEwTlDVsypzbNYhPDjTEpmR47OA5kbctcF07wJVuoR7Ym+QusAQ86M/eNE++8C36eBG1iYRyHEUYBuBVNVcr57lLVqd9w7SV5cUuGY/hHUlJn4Kr+lGKWqh3MRhXuNFyuDDgchNOH+qiKrV9oH1Vl+5vl9+8Y/Yc/7Y9X95ao/X9OZVLCVMX2N08qnnD3K4wjG7wIHm2SJdJTj5NoCZx0JjTTXbuq7Lfv3d72FWNupS2Rw3nIoWHbdugu5IZWuH8rSj8rdw801op3EdWaJeCGmzPuuQ6uUlMl6VwH24re9RLecaFMi45wce+Zb9zd9+w1Id22j5xBDKswRX9Ap6xupF3CLDey6lcUbF3/vnjq1os1i20pxajTpblaKoRG4Ceih7A2D1vr4O4J3aq4jppXwhHdaFNKfKgHRNXTCB+hTh51L0SxyLRDJJ1BQv9KQ7vUaH5Kg0cnEhbs9ziNhTTx+wS1fG3ZndEajcEgR/knS4xhwWtRRafzJ2C+Py73/XzyIwKzhA3KFyFZqVOygQ3sRsQCvZj2pe0lxlvQJc3d86IFc1saqqo+qmkeVKcSIjrKDbhvDJSRo4OCTBnSwXGxjmtPpJ+9LXvmHfeu7ESubkDKlB1HeDcUT5AMQgdW38vnHOLTjY3al1ubEjDlhlEm6DrADrRfxASxWPTZPe6qv+2wXKtd3saFQUg5yZ7ecOBadDMA6xv3J90o5zAOO3Hn2G09YW3PhmlVWN0kwssUdFxAx5vw4kTxOB88sLNkwvwQfufw9nxqbc7+P4qiLgt/H7W/btZpC40ztuhE93ijHW19Xd64KiPqRraNu6KikAJRTAVPrBaLIE0CZcQ5jOmefgqZ//6r/YKeZ1SzoK2v/wghzxxg/gzi02nCvQCGjwN0rRV/694jJZIA9YHUa72oOl4zpDPpVShqRI6lbTmbaUHqwGXqgxzmpp0TvEK8UBuAgi47N5e/7wKXv62UN2iukVJRPSZCNh1Cos3Y8ZroPG/QcbUPM1hDpPb2o/Pa+/+SvvtX7a1seQC5McD9VWzjjJbhezBpvpitFx0+5MbF97WGQ6UMfqN5M1BmcuxnSMlKI3ix8Ok9uTtka6Bmx+MW9f+Op3CFTPWAZNNYLQo8QjANSxoQZQ1zarvNpSPUBfH9gbx5w1B6Od4qfiqdqesljV7Wo4cc3rK8NRUU5NCpUqOiUVUlV2NaU9ObNkzx08zuGKRzhRbZxDEwgeWK4OtsjTm6UbUFej0wcUCNRXJctiRctyBYjjrezxu/dxaCRDbTqyZffeXeilOYZWrkJp0rab8wnTfl+AE3oArhlwJLo7F8WJcW7eyu9tENNQrAix6I/+8EX7yje/Z9dmOAaKNFv3JFqm5wy2/1pQBZzXWL1aHA0kwlWQV6P26n/jQRbrA+v9N2KURYhAA67fk1Uqc7Q9F0/oZF8WSSUOJ/Nx9rU0hXM0Kx7gPwDx9LMv0lE9gfWSucFTQyLeKmFQWlFKqw+vpI7u4Ga9KESi8EdhCnmElCRncbeQLm7pYixoO0edDnWj8G/gOq32Cq30VVSlW269mezK46sKivoadd03XoQOkVZK/lTzRlgaLVZ76NSoffEfv2YvHVfvQCeLiCsj5VYFWAJOGNe0tljaGMTdfz9GG9Wnk2uBDazaWW+jK8iOHsViPQIVrILnCpy4x00wp0oUFg90dXylukzrTUxzZOhlbvrB522MiJ9DmGlnQltvpJEf1YR0vnXFn9gLrEF6ZkDlXBc04kcWlT4ETWmnSrAZsn3/W263fduH+XuEkZZBO3nqOAnGBEBvtpFNG7wH9cVzatr4UrpbVDoHhASFRiW8B15+2Z7+4TP21JErFBD5j/CQ5amcozpYmhmFbtjFMpWPKido6CNwB/r3Cg4+oCtO1P9d8JrGBWgEVv/+/4BJFvE0ISFzAAAAAElFTkSuQmCC From 49722c77c05375ad2f04c716cda3599f1c5bd5e8 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Mon, 3 Sep 2012 18:04:05 +0530 Subject: [PATCH 176/581] [IMP] add received & delivered subtype in stock bzr revid: fka@tinyerp.com-20120903123405-7rmte2src1xtdghp --- addons/stock/stock.py | 2 +- addons/stock/stock_data.xml | 24 +++++++++++++----------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 0bc455a149c..ed20bbec2c5 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -1394,7 +1394,7 @@ class stock_picking(osv.osv): 'internal': 'moved', } for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("Products have been %s.") % (type_dict.get(obj.type, 'move done')), subtype="closed", context=context) + self.message_post(cr, uid, [obj.id], body=_("Products have been %s.") % (type_dict.get(obj.type, 'move done')), subtype=type_dict.get(obj.type), context=context) def ship_cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): diff --git a/addons/stock/stock_data.xml b/addons/stock/stock_data.xml index 3539d5b5056..f83b0ada388 100644 --- a/addons/stock/stock_data.xml +++ b/addons/stock/stock_data.xml @@ -171,27 +171,29 @@ watch your stock valuation, and track production lots upstream and downstream (b Mail: mail.message.subtype --> - + - - moved - + + delivered + + - - closed - + + received + + - + - + - + - + From df3aa41ac443d22511dc4cf4732629e109c15ef1 Mon Sep 17 00:00:00 2001 From: "Randhir Mayatra (OpenERP)" Date: Tue, 4 Sep 2012 12:47:54 +0530 Subject: [PATCH 177/581] [IMP] add subtype data in hr module bzr revid: rma@tinyerp.com-20120904071754-d99h6iey5nzrjf08 --- addons/hr_holidays/hr_holidays.py | 12 +++--- addons/hr_holidays/hr_holidays_data.xml | 38 +++++++++++++++++++ addons/hr_recruitment/hr_recruitment.py | 14 +++---- addons/hr_recruitment/hr_recruitment_data.xml | 36 +++++++++++++++++- .../hr_timesheet_invoice.py | 8 ++-- .../hr_timesheet_invoice_data.xml | 28 ++++++++++++++ 6 files changed, 118 insertions(+), 18 deletions(-) diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index 759170224bd..e0358efe0d9 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -364,32 +364,32 @@ class hr_holidays(osv.osv): def create_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): self.message_post(cr, uid, ids, - _("The request has been created and is waiting confirmation."), context=context) + _("The request has been created and is waiting confirmation."),subtype="new", context=context) return True def holidays_confirm_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids): self.message_post(cr, uid, [obj.id], - _("The request has been submitted and is waiting for validation by the manager."), context=context) + _("The request has been submitted and is waiting for validation by the manager."), subtype="submitted", context=context) def holidays_first_validate_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): self.message_post(cr, uid, [obj.id], - _("The request has been approved. A second validation is necessary and is now pending."), context=context) + _("The request has been approved. A second validation is necessary and is now pending."), subtype="pending", context=context) def holidays_validate_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids): if obj.double_validation: self.message_post(cr, uid, [obj.id], - _("The request has been double validated. The validation process is now over."), context=context) + _("The request has been double validated. The validation process is now over."), subtype="double validated", context=context) else: self.message_post(cr, uid, [obj.id], - _("The request has been approved. The validation process is now over."), context=context) + _("The request has been approved. The validation process is now over."), subtype="closed", context=context) def holidays_refuse_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids): self.message_post(cr, uid, [obj.id], - _("The request has been refused. The validation process is now over."), context=context) + _("The request has been refused. The validation process is now over."), subtype="cancelled", context=context) class resource_calendar_leaves(osv.osv): diff --git a/addons/hr_holidays/hr_holidays_data.xml b/addons/hr_holidays/hr_holidays_data.xml index 1e534093eb3..3b927b60419 100644 --- a/addons/hr_holidays/hr_holidays_data.xml +++ b/addons/hr_holidays/hr_holidays_data.xml @@ -49,5 +49,43 @@ Once validated, they are visible in the employee's calendar. HR officers can def True brown + + + new + + + + + submitted + + + + + pending + + + + + double validated + + + + closed + + + + cancelled + + + + + + + + + + + + diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index 82f2c9c3a21..578ebde9162 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -457,14 +457,14 @@ class hr_applicant(base_stage, osv.Model): """ Override of the (void) default notification method. """ if not stage_id: return True stage_name = self.pool.get('hr.recruitment.stage').name_get(cr, uid, [stage_id], context=context)[0][1] - return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), context=context) + return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), subtype="stage change", context=context) def case_get_note_msg_prefix(self, cr, uid, id, context=None): return 'Applicant' def case_open_send_note(self, cr, uid, ids, context=None): message = _("Applicant has been set in progress.") - return self.message_post(cr, uid, ids, body=message, context=context) + return self.message_post(cr, uid, ids, body=message, subtype="in progress", context=context) def case_close_send_note(self, cr, uid, ids, context=None): if context is None: @@ -472,23 +472,23 @@ class hr_applicant(base_stage, osv.Model): for applicant in self.browse(cr, uid, ids, context=context): if applicant.emp_id: message = _("Applicant has been hired and created as an employee.") - self.message_post(cr, uid, [applicant.id], body=message, context=context) + self.message_post(cr, uid, [applicant.id], body=message, subtype="closed", context=context) else: message = _("Applicant has been hired.") - self.message_post(cr, uid, [applicant.id], body=message, context=context) + self.message_post(cr, uid, [applicant.id], body=message, subtype="closed", context=context) return True def case_cancel_send_note(self, cr, uid, ids, context=None): msg = 'Applicant refused.' - return self.message_post(cr, uid, ids, body=msg, context=context) + return self.message_post(cr, uid, ids, body=msg, subtype="cancelled", context=context) def case_reset_send_note(self, cr, uid, ids, context=None): message =_("Applicant has been set as new.") - return self.message_post(cr, uid, ids, body=message, context=context) + return self.message_post(cr, uid, ids, body=message, subtype="new", context=context) def create_send_note(self, cr, uid, ids, context=None): message = _("Applicant has been created.") - return self.message_post(cr, uid, ids, body=message, context=context) + return self.message_post(cr, uid, ids, body=message, subtype="new", context=context) class hr_job(osv.osv): diff --git a/addons/hr_recruitment/hr_recruitment_data.xml b/addons/hr_recruitment/hr_recruitment_data.xml index 84289da7bae..a567489751a 100644 --- a/addons/hr_recruitment/hr_recruitment_data.xml +++ b/addons/hr_recruitment/hr_recruitment_data.xml @@ -460,6 +460,40 @@ You can automatically receive job application though an email gateway, see the H - + + + + new + + + + + closed + + + + cancelled + + + + + stage change + + + + + in progress + + + + + + + + + + + + diff --git a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py index a1562d53a61..4ed61119a5f 100644 --- a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py +++ b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py @@ -95,25 +95,25 @@ class account_analytic_account(osv.osv): def set_close(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state':'close'}, context=context) message = _("Contract has been closed.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="closed", context=context) return True def set_cancel(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state':'cancelled'}, context=context) message = _("Contract has been cancelled.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="cancelled", context=context) return True def set_open(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state':'open'}, context=context) message = _("Contract has been opened.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="open", context=context) return True def set_pending(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state':'pending'}, context=context) message = _("Contract has been set as pending.") - self.message_post(cr, uid, ids, body=message, context=context) + self.message_post(cr, uid, ids, body=message, subtype="pending", context=context) return True account_analytic_account() diff --git a/addons/hr_timesheet_invoice/hr_timesheet_invoice_data.xml b/addons/hr_timesheet_invoice/hr_timesheet_invoice_data.xml index 462888e0b39..5cc5024d591 100644 --- a/addons/hr_timesheet_invoice/hr_timesheet_invoice_data.xml +++ b/addons/hr_timesheet_invoice/hr_timesheet_invoice_data.xml @@ -16,5 +16,33 @@ 50% 50.0 + + + closed + + + + pending + + + + + open + + + + cancelled + + + + + + + + + + + + From d473fb95a3c9acf4048b8bd218f1837d4a1057dd Mon Sep 17 00:00:00 2001 From: "jri@openerp.com" <> Date: Tue, 4 Sep 2012 10:15:27 +0200 Subject: [PATCH 178/581] Order of the views is already defined in open_view_employee_list_my's view_mode. This code added nothing and made it more difficult to override the order in inherited modules. bzr revid: jri@openerp.com-20120904081527-379csy03p4hq1g51 --- addons/hr/hr_view.xml | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/addons/hr/hr_view.xml b/addons/hr/hr_view.xml index 99d7af027e9..79a26091651 100644 --- a/addons/hr/hr_view.xml +++ b/addons/hr/hr_view.xml @@ -198,25 +198,6 @@ - - - kanban - - - - - tree - - - - - - - form - - - - From 61118d78473a91cdc13ef753c5509fdf62d25e63 Mon Sep 17 00:00:00 2001 From: "Randhir Mayatra (OpenERP)" Date: Tue, 4 Sep 2012 14:26:26 +0530 Subject: [PATCH 179/581] [IMP] add subtype data into project and project_issue module bzr revid: rma@tinyerp.com-20120904085626-klbtc8hrrksi4gy9 --- addons/project/project.py | 4 +-- addons/project/project_data.xml | 8 +++--- addons/project_issue/project_issue.py | 6 ++--- addons/project_issue/project_issue_data.xml | 27 ++++++++++++++++++++- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index ae70dcc1dd4..26e42a73539 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -525,11 +525,11 @@ def Project(): def set_cancel_send_note(self, cr, uid, ids, context=None): message = _("Project has been cancelled.") - return self.message_post(cr, uid, ids, body=message, subtype="cancel", context=context) + return self.message_post(cr, uid, ids, body=message, subtype="cancelled", context=context) def set_close_send_note(self, cr, uid, ids, context=None): message = _("Project has been closed.") - return self.message_post(cr, uid, ids, body=message, subtype="close", context=context) + return self.message_post(cr, uid, ids, body=message, subtype="closed", context=context) def write(self, cr, uid, ids, vals, context=None): # if alias_model has been changed, update alias_model_id accordingly diff --git a/addons/project/project_data.xml b/addons/project/project_data.xml index 88afc08b961..c2e51fa8049 100644 --- a/addons/project/project_data.xml +++ b/addons/project/project_data.xml @@ -99,12 +99,12 @@ - - close + + closed - - cancel + + cancelled diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index 9cc97ec470b..52bb2d2d687 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -500,7 +500,7 @@ class project_issue(base_stage, osv.osv): def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Override of the (void) default notification method. """ stage_name = self.pool.get('project.task.type').name_get(cr, uid, [stage_id], context=context)[0][1] - return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), context=context) + return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), subtype="stage change", context=context) def case_get_note_msg_prefix(self, cr, uid, id, context=None): """ Override of default prefix for notifications. """ @@ -508,11 +508,11 @@ class project_issue(base_stage, osv.osv): def convert_to_task_send_note(self, cr, uid, ids, context=None): message = _("Project issue converted to task.") - return self.message_post(cr, uid, ids, body=message, context=context) + return self.message_post(cr, uid, ids, body=message, subtype="converted", context=context) def create_send_note(self, cr, uid, ids, context=None): message = _("Project issue created.") - return self.message_post(cr, uid, ids, body=message, context=context) + return self.message_post(cr, uid, ids, body=message, subtype="new", context=context) def case_escalate_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): diff --git a/addons/project_issue/project_issue_data.xml b/addons/project_issue/project_issue_data.xml index ddb0d575e63..2501bd821d2 100644 --- a/addons/project_issue/project_issue_data.xml +++ b/addons/project_issue/project_issue_data.xml @@ -30,7 +30,32 @@ v3.0 - + + + + new + + + + + stage change + + + + + converted + + + + + + + + + + + + mail.group From 93f5c6b6a9265e30c7b7addb7eceeef57dbb7fb6 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Tue, 4 Sep 2012 15:01:11 +0530 Subject: [PATCH 180/581] [IMP]add unit test for message subtype bzr revid: sgo@tinyerp.com-20120904093111-hj291blbbkg39cey --- addons/mail/mail_thread.py | 1 - addons/mail/tests/test_mail.py | 35 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 2d31a9ad3ba..241e6674b17 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -656,7 +656,6 @@ class mail_thread(osv.Model): subtype_ids = subtype_obj.search(cr, uid, [('default', '=', 'true'),('model_ids.model', '=', self._name)]) if subtype_ids: self.message_subscribe_udpate_subtypes(cr, uid, ids, partner_ids, subtype_ids, context=context) - # TDE: temp, must check followers widget return [] # return [follower.id for thread in self.browse(cr, uid, ids, context=context) for follower in thread.message_follower_ids] diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py index fd4b116b364..c27b3c6f68e 100644 --- a/addons/mail/tests/test_mail.py +++ b/addons/mail/tests/test_mail.py @@ -83,6 +83,7 @@ class test_mail(common.TransactionCase): self.mail_message = self.registry('mail.message') self.mail_notification = self.registry('mail.notification') self.mail_followers = self.registry('mail.followers') + self.mail_message_subtype = self.registry('mail.message.subtype') self.res_users = self.registry('res.users') self.res_partner = self.registry('res.partner') @@ -534,3 +535,37 @@ class test_mail(common.TransactionCase): msg1.refresh() self.assertEqual(5, len(group_pigs.message_ids), 'group should contain 5 messages') self.assertEqual(2, len(msg1.child_ids), 'msg1 should have 2 children now') + + def test_60_message_subtype(self): + """ Tests designed for message_subtype. """ + cr, uid = self.cr, self.uid + self.res_users.write(cr, uid, [uid], {'signature': 'Admin', 'email': 'a@a'}) + user_admin = self.res_users.browse(cr, uid, uid) + group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id) + + # 0 - Admin + p_a_id = user_admin.partner_id.id + # Subscribe #1, + self.mail_group_model_id = self.ir_model.search(cr, uid, [('model','=', 'mail.group')])[0] + subtype_ids = self.mail_message_subtype.search(cr, uid, []) + self.mail_message_subtype.write(cr,uid,subtype_ids,{'model_ids':[(4,self.mail_group_model_id )]}) + group_pigs.message_subscribe_users([uid]) + + # Mail data + _subject = 'Pigs' + _mail_subject = '%s posted on %s' % (user_admin.name, group_pigs.name) + _body1 = 'Pigs rules' + _mail_body1 = 'Pigs rules\n
          Admin
          \n' + _mail_bodyalt1 = 'Pigs rules\nAdmin' + _body2 = 'Pigs rules' + _mail_body2 = 'Pigs rules\n
          Admin
          \n' + _mail_bodyalt2 = 'Pigs rules\nAdmin\n' + filter_subtype_id = self.mail_message_subtype.search(cr, uid, [('default','=',True)]) + # Post comment with body and subject, comment preference + msg_id = self.mail_group.message_post(cr, uid, [self.group_pigs_id], body=_body1, subject=_subject, msg_type='comment',subtype='email') + notif_ids = self.mail_notification.search(cr, uid, [('message_id', '=', msg_id)]) + self.assertTrue(len(notif_ids) >= 1,"subtype is email and show notification on wall") + # New post: test automatic subject, signature in html, add a partner, email preference, parent_id previous message + msg_id2 = self.mail_group.message_post(cr, uid, [self.group_pigs_id], body=_body2,subject=_subject, msg_type='email', subtype='other') + notif_ids2 = self.mail_notification.search(cr, uid, [('message_id', '=', msg_id2)]) + self.assertTrue(len(notif_ids2) == 0,"subtype is false cannot show notification on wall") From e50afb97b4f2c5183fc5d60db5736ed822a2710f Mon Sep 17 00:00:00 2001 From: "Randhir Mayatra (OpenERP)" Date: Tue, 4 Sep 2012 15:10:52 +0530 Subject: [PATCH 181/581] [IMP] make changes into hr module for subtype data bzr revid: rma@tinyerp.com-20120904094052-5povh2fua010g3ej --- addons/hr_holidays/hr_holidays.py | 10 ++++----- addons/hr_holidays/hr_holidays_data.xml | 22 ++++--------------- addons/hr_recruitment/hr_recruitment.py | 4 ++-- addons/hr_recruitment/hr_recruitment_data.xml | 8 +++---- 4 files changed, 15 insertions(+), 29 deletions(-) diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index e0358efe0d9..4136abbb2f7 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -370,26 +370,26 @@ class hr_holidays(osv.osv): def holidays_confirm_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids): self.message_post(cr, uid, [obj.id], - _("The request has been submitted and is waiting for validation by the manager."), subtype="submitted", context=context) + _("The request has been submitted and is waiting for validation by the manager."), context=context) def holidays_first_validate_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): self.message_post(cr, uid, [obj.id], - _("The request has been approved. A second validation is necessary and is now pending."), subtype="pending", context=context) + _("The request has been approved. A second validation is necessary and is now pending."), context=context) def holidays_validate_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids): if obj.double_validation: self.message_post(cr, uid, [obj.id], - _("The request has been double validated. The validation process is now over."), subtype="double validated", context=context) + _("The request has been double validated. The validation process is now over."), context=context) else: self.message_post(cr, uid, [obj.id], - _("The request has been approved. The validation process is now over."), subtype="closed", context=context) + _("The request has been approved. The validation process is now over."), subtype="approved", context=context) def holidays_refuse_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids): self.message_post(cr, uid, [obj.id], - _("The request has been refused. The validation process is now over."), subtype="cancelled", context=context) + _("The request has been refused. The validation process is now over."), subtype="refused", context=context) class resource_calendar_leaves(osv.osv): diff --git a/addons/hr_holidays/hr_holidays_data.xml b/addons/hr_holidays/hr_holidays_data.xml index 3b927b60419..ad337b72c62 100644 --- a/addons/hr_holidays/hr_holidays_data.xml +++ b/addons/hr_holidays/hr_holidays_data.xml @@ -55,26 +55,12 @@ Once validated, they are visible in the employee's calendar. HR officers can def
          - - submitted - - - - - pending - - - - - double validated + + approved - - closed - - - - cancelled + + refused diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index 578ebde9162..99d522703d3 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -475,12 +475,12 @@ class hr_applicant(base_stage, osv.Model): self.message_post(cr, uid, [applicant.id], body=message, subtype="closed", context=context) else: message = _("Applicant has been hired.") - self.message_post(cr, uid, [applicant.id], body=message, subtype="closed", context=context) + self.message_post(cr, uid, [applicant.id], body=message, subtype="hired", context=context) return True def case_cancel_send_note(self, cr, uid, ids, context=None): msg = 'Applicant refused.' - return self.message_post(cr, uid, ids, body=msg, subtype="cancelled", context=context) + return self.message_post(cr, uid, ids, body=msg, subtype="refused", context=context) def case_reset_send_note(self, cr, uid, ids, context=None): message =_("Applicant has been set as new.") diff --git a/addons/hr_recruitment/hr_recruitment_data.xml b/addons/hr_recruitment/hr_recruitment_data.xml index a567489751a..818b5f5adef 100644 --- a/addons/hr_recruitment/hr_recruitment_data.xml +++ b/addons/hr_recruitment/hr_recruitment_data.xml @@ -467,12 +467,12 @@ You can automatically receive job application though an email gateway, see the H - - closed + + hired - - cancelled + + refused From 10313331e8f10c148bb9acc602d34822d4bbbae2 Mon Sep 17 00:00:00 2001 From: "Randhir Mayatra (OpenERP)" Date: Tue, 4 Sep 2012 15:26:49 +0530 Subject: [PATCH 182/581] [IMP] make chnages into subtype data in hr bzr revid: rma@tinyerp.com-20120904095649-ye94bntdm8ia5jrd --- addons/hr_recruitment/hr_recruitment.py | 2 +- addons/hr_recruitment/hr_recruitment_data.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index 99d522703d3..2ff594aa820 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -472,7 +472,7 @@ class hr_applicant(base_stage, osv.Model): for applicant in self.browse(cr, uid, ids, context=context): if applicant.emp_id: message = _("Applicant has been hired and created as an employee.") - self.message_post(cr, uid, [applicant.id], body=message, subtype="closed", context=context) + self.message_post(cr, uid, [applicant.id], body=message, subtype="hired", context=context) else: message = _("Applicant has been hired.") self.message_post(cr, uid, [applicant.id], body=message, subtype="hired", context=context) diff --git a/addons/hr_recruitment/hr_recruitment_data.xml b/addons/hr_recruitment/hr_recruitment_data.xml index 818b5f5adef..30ff9118584 100644 --- a/addons/hr_recruitment/hr_recruitment_data.xml +++ b/addons/hr_recruitment/hr_recruitment_data.xml @@ -471,7 +471,7 @@ You can automatically receive job application though an email gateway, see the H hired - + refused From d90d78171bb257cc4c65ca935d3f43814e31de67 Mon Sep 17 00:00:00 2001 From: "Randhir Mayatra (OpenERP)" Date: Tue, 4 Sep 2012 18:34:23 +0530 Subject: [PATCH 183/581] [IMP] make changes into the subtype data for project module bzr revid: rma@tinyerp.com-20120904130423-928mhaatxuxfbwi4 --- addons/base_status/base_stage.py | 6 +++--- addons/project_issue/project_issue.py | 2 +- addons/project_issue/project_issue_data.xml | 8 ++++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/addons/base_status/base_stage.py b/addons/base_status/base_stage.py index 26afe548217..fdbc41cd8ac 100644 --- a/addons/base_status/base_stage.py +++ b/addons/base_status/base_stage.py @@ -401,13 +401,13 @@ class base_stage(object): def case_close_send_note(self, cr, uid, ids, context=None): for id in ids: msg = _('%s has been closed.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context)) - self.message_post(cr, uid, [id], body=msg, context=context) + self.message_post(cr, uid, [id], body=msg, subtype="closed", context=context) return True def case_cancel_send_note(self, cr, uid, ids, context=None): for id in ids: - msg = _('%s has been canceled.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context)) - self.message_post(cr, uid, [id], body=msg, context=context) + msg = _('%s has been cancelled.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context)) + self.message_post(cr, uid, [id], body=msg, subtype="cancelled", context=context) return True def case_pending_send_note(self, cr, uid, ids, context=None): diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index 52bb2d2d687..833c7dbb460 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -508,7 +508,7 @@ class project_issue(base_stage, osv.osv): def convert_to_task_send_note(self, cr, uid, ids, context=None): message = _("Project issue converted to task.") - return self.message_post(cr, uid, ids, body=message, subtype="converted", context=context) + return self.message_post(cr, uid, ids, body=message, context=context) def create_send_note(self, cr, uid, ids, context=None): message = _("Project issue created.") diff --git a/addons/project_issue/project_issue_data.xml b/addons/project_issue/project_issue_data.xml index 2501bd821d2..6ee704c6b39 100644 --- a/addons/project_issue/project_issue_data.xml +++ b/addons/project_issue/project_issue_data.xml @@ -42,11 +42,15 @@ - - converted + + cancelled + + closed + + From ef747c7143eb0ce04d505dc1c24eae0d8b83f688 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Wed, 5 Sep 2012 11:00:31 +0530 Subject: [PATCH 184/581] [IMP]improve test case bzr revid: sgo@tinyerp.com-20120905053031-dqtcfyr1na9j7zpk --- addons/mail/tests/test_mail.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py index bc8a0e5c085..45583d46fa3 100644 --- a/addons/mail/tests/test_mail.py +++ b/addons/mail/tests/test_mail.py @@ -566,10 +566,10 @@ class test_mail(common.TransactionCase): _mail_bodyalt2 = 'Pigs rules\nAdmin\n' filter_subtype_id = self.mail_message_subtype.search(cr, uid, [('default','=',True)]) # Post comment with body and subject, comment preference - msg_id = self.mail_group.message_post(cr, uid, [self.group_pigs_id], body=_body1, subject=_subject, msg_type='comment',subtype='email') + msg_id = self.mail_group.message_post(cr, uid, [self.group_pigs_id], body=_body1, subject=_subject, type='comment',subtype='email') notif_ids = self.mail_notification.search(cr, uid, [('message_id', '=', msg_id)]) self.assertTrue(len(notif_ids) >= 1,"subtype is email and show notification on wall") # New post: test automatic subject, signature in html, add a partner, email preference, parent_id previous message - msg_id2 = self.mail_group.message_post(cr, uid, [self.group_pigs_id], body=_body2,subject=_subject, msg_type='email', subtype='other') + msg_id2 = self.mail_group.message_post(cr, uid, [self.group_pigs_id], body=_body2,subject=_subject, type='email', subtype='other') notif_ids2 = self.mail_notification.search(cr, uid, [('message_id', '=', msg_id2)]) self.assertTrue(len(notif_ids2) == 0,"subtype is false cannot show notification on wall") From 3476daf79fad6a05feefd76379c262bfd9d4a4a7 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Wed, 5 Sep 2012 15:01:35 +0530 Subject: [PATCH 185/581] [IMP]Add mail_subtype.rst file in mail bzr revid: fka@tinyerp.com-20120905093135-ydsqq62gnkcifqyv --- addons/mail/doc/index.rst.inc | 1 + addons/mail/doc/mail_subtype.rst | 70 ++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 addons/mail/doc/mail_subtype.rst diff --git a/addons/mail/doc/index.rst.inc b/addons/mail/doc/index.rst.inc index c4b87cc18f9..4b01d3ec7bd 100644 --- a/addons/mail/doc/index.rst.inc +++ b/addons/mail/doc/index.rst.inc @@ -11,3 +11,4 @@ Mail Module documentation topics mail_needaction_howto mail_partner mail_state + mail_subtype diff --git a/addons/mail/doc/mail_subtype.rst b/addons/mail/doc/mail_subtype.rst new file mode 100644 index 00000000000..e63b67936cd --- /dev/null +++ b/addons/mail/doc/mail_subtype.rst @@ -0,0 +1,70 @@ +.. _mail_message_subtype: + +OpenChatter Pi (3.1415): Message Subtype +======================================== + + To overcome the problems of crowdy walls in system notification, We have added features of **Message Subtype** in mail. + +mail.message.subtype +++++++++++++++++++++ +``mail.message.subtype`` has following fields: + + - ``Name``: fields.char(' Message Subtype ', size = 128,required = True,help = 'Subtype Of Message'), + - ``model_ids``: fields.many2many('ir.model','mail_message_subtyp_message_rel','message_subtype_id', 'model_id', 'Model',help = "link some subtypes to several models, for projet/task"), + - ``default``: fields.boolean('Default', help = "When subscribing to the document, users will receive by default messages related to this subtype unless they uncheck this subtype"), + +mail.followers +++++++++++++++ + +In ``mail.followers`` we have added additional many2many field subtype ids : + + - ``subtype_ids``: fields.many2many('mail.message.subtype','mail_message_subtyp_rel','subscription_id', 'subtype_id', 'Subtype',help = "linking some subscription to several subtype for projet/task") + +mail.message +++++++++++++ + +In mail_message we have added additional field subtype_id which Indicates the Type of Message + + - ``subtype_id``: fields.many2one('mail.message.subtype', 'Subtype') + +mail.thread ++++++++++++ + + - In **message_post** method add the *subtype_id* field as parameter and set as default subtype 'Other'. + + def message_post(self, cr, uid, thread_id, body='', subject=False, msg_type='notification', parent_id=False, attachments=None, subtype='other', context=None, ``**kwargs``): + + - In **message_subscribe** method add the *subtype_ids* field as parameter.In this method if subtype_ids is None, it fatch the default true subtypes in mail.message.subtypes otherwise pass selected subtypes. + For update subtypes call **message_subscribe_udpate_subtypes** method + + def message_subscribe(self, cr, uid, ids, partner_ids,subtype_ids = None, context=None): + + - Add **message_subscribe_udpate_subtypes** method to update the subtype_ids in followers. + + def message_subscribe_udpate_subtypes(self, cr, uid, ids, user_id, subtype_ids,context=None): + followers_obj = self.pool.get('mail.followers') + followers_ids = followers_obj.search(cr, uid, [('res_model', '=', self._name), ('res_id', 'in', ids)]) + return followers_obj.write(cr, uid, followers_ids, {'subtype_ids': [(6, 0 , subtype_ids)]}, context = context) + +For Each Addons: +++++++++++++++++ + + - Add data of subtypes for each addons module. + - Add subtype field as parameter in **message_post** Method for each addons module. + +How It Works: ++++++++++++++ + + - In addons module when we Follow a Perticular document It display under the followers button. + - In sybtypes there are 3 default subtypes for each addons + 1) Email + 2) Comment + 3) Other + - In document display a default subtypes(which are true) related a perticular model_ids wise. + + Example:- + If I have open crm.lead, It display only subtypes of crm.lead + + - When we select subtype it update subtype_ids(which are checked) in mail.follower where match res_model & res_id of the current documents. + - when message created update subtype_id of that message in mail.message. + - In Feeds display only those notifications of documents which subtypes are selected From dc331c76eeeba1c4f1dadb07a2c6ccbdef28ff6f Mon Sep 17 00:00:00 2001 From: "Bhumi Thakkar (Open ERP)" Date: Wed, 5 Sep 2012 16:01:36 +0530 Subject: [PATCH 186/581] [IMP] If not journal_id then return {} and parent is removed. bzr revid: bth@tinyerp.com-20120905103136-pp94j3xnb64c2edo --- addons/account/account_bank_statement.py | 2 ++ .../account_bank_statement_view.xml | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py index 8df291a98d1..85826e13b69 100644 --- a/addons/account/account_bank_statement.py +++ b/addons/account/account_bank_statement.py @@ -455,6 +455,8 @@ class account_bank_statement(osv.osv): return res and res[0] or 0.0 def onchange_journal_id(self, cr, uid, statement_id, journal_id, context=None): + if not journal_id: + return {} balance_start = self._compute_balance_end_real(cr, uid, journal_id, context=context) journal_data = self.pool.get('account.journal').read(cr, uid, journal_id, ['default_debit_account_id', 'company_id'], context=context) diff --git a/addons/account_bank_statement_extensions/account_bank_statement_view.xml b/addons/account_bank_statement_extensions/account_bank_statement_view.xml index 30b2778817c..1c076426752 100644 --- a/addons/account_bank_statement_extensions/account_bank_statement_view.xml +++ b/addons/account_bank_statement_extensions/account_bank_statement_view.xml @@ -76,7 +76,7 @@ - + @@ -100,7 +100,7 @@ - + From d3edae5084b9c4a0a60fa0992c7e517ceb0b3bc7 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 6 Sep 2012 12:25:03 +0530 Subject: [PATCH 187/581] [IMP]:improved yml bzr revid: apa@tinyerp.com-20120906065503-h8rziczo7ri31z3o --- addons/crm/test/process/crm_message_subtype.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/crm/test/process/crm_message_subtype.yml b/addons/crm/test/process/crm_message_subtype.yml index 705d3cc2fc4..ee78553c913 100644 --- a/addons/crm/test/process/crm_message_subtype.yml +++ b/addons/crm/test/process/crm_message_subtype.yml @@ -9,7 +9,7 @@ - I have add the sub_type name email with default true - - !record {model: mail.message.subtype, id: mail_subtype_lead_email }: + !record {model: mail.message.subtype, id: mail.mail_subtype_email }: name: email model_ids: - crm.model_crm_lead @@ -17,7 +17,7 @@ - I have add the sub_type name comment with default true - - !record {model: mail.message.subtype, id: mail_subtype_lead_comment }: + !record {model: mail.message.subtype, id: mail.mail_subtype_comment }: name: comment model_ids: - crm.model_crm_lead From c028143bcf6e33592ff4c344ff990285ad48a178 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 6 Sep 2012 12:33:34 +0530 Subject: [PATCH 188/581] [IMP]:improved yml bzr revid: apa@tinyerp.com-20120906070334-bf4fvtr3kz055qfh --- addons/crm/crm_lead_data.xml | 2 +- addons/crm/test/process/crm_message_subtype.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/crm/crm_lead_data.xml b/addons/crm/crm_lead_data.xml index 6f6562657ce..168aa62f714 100644 --- a/addons/crm/crm_lead_data.xml +++ b/addons/crm/crm_lead_data.xml @@ -160,7 +160,7 @@ - + won diff --git a/addons/crm/test/process/crm_message_subtype.yml b/addons/crm/test/process/crm_message_subtype.yml index ee78553c913..6c0038a7fb8 100644 --- a/addons/crm/test/process/crm_message_subtype.yml +++ b/addons/crm/test/process/crm_message_subtype.yml @@ -1,7 +1,7 @@ - I have add the sub_type name other with default false - - !record {model: mail.message.subtype, id: mail_subtype_lead_won }: + !record {model: mail.message.subtype, id: mail.mail_subtype_won }: name: won model_ids: - crm.model_crm_lead From 87bb5e31bff85fd3d5abe685d5271970c53c403b Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 6 Sep 2012 12:35:09 +0530 Subject: [PATCH 189/581] [IMP]:improved yml bzr revid: apa@tinyerp.com-20120906070509-u7ueba94sr10dqcg --- addons/crm/test/process/crm_message_subtype.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/crm/test/process/crm_message_subtype.yml b/addons/crm/test/process/crm_message_subtype.yml index 6c0038a7fb8..3dd042c1279 100644 --- a/addons/crm/test/process/crm_message_subtype.yml +++ b/addons/crm/test/process/crm_message_subtype.yml @@ -27,7 +27,7 @@ - !python {model: mail.followers}: | ids = self.search(cr, uid, [('res_model', '=', 'crm.lead'),('res_id', '=', ref('crm_case_1'))]) - self.write(cr, uid, ids, {'subtype_ids': [(6,0,[ref('mail_subtype_lead_won')])]}) + self.write(cr, uid, ids, {'subtype_ids': [(6,0,[ref('mail.mail_subtype_won')])]}) - I have change the lead into mark won - @@ -43,6 +43,6 @@ I have check the subtype as won in feeds - !python {model: mail.followers}: | - followers_ids =self.search(cr, uid, [('res_model', '=','crm.lead'),('res_id', '=', ref('crm_case_1')),('subtype_ids', 'in',[ref('mail_subtype_lead_won')])]) + followers_ids =self.search(cr, uid, [('res_model', '=','crm.lead'),('res_id', '=', ref('crm_case_1')),('subtype_ids', 'in',[ref('mail.mail_subtype_won')])]) if len(followers_ids): assert followers_ids, 'lead is in won' From 70c1c3df658c38e477108c40c8344bd0d967cd1e Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 6 Sep 2012 12:38:01 +0530 Subject: [PATCH 190/581] [IMP]:hide subtype when unfollowing bzr revid: apa@tinyerp.com-20120906070801-9fulnfblrrdxhetx --- addons/mail/static/src/js/mail_followers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js index 5d7b2ec5116..90318664474 100644 --- a/addons/mail/static/src/js/mail_followers.js +++ b/addons/mail/static/src/js/mail_followers.js @@ -95,7 +95,7 @@ openerp_mail_followers = function(session, mail) { else { this.$el.find('button.oe_mail_button_follow').show(); this.$el.find('button.oe_mail_button_unfollow').hide(); - // this.$el.find('ul.oe_mail_recthread_subtype').hide() + this.$el.find('ul.oe_mail_recthread_subtype').hide() } }, update_subtype: function (){ From 330abd29996e4b439c0d7cd59b9ace89fc7119f8 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 6 Sep 2012 15:07:54 +0530 Subject: [PATCH 191/581] [IMP]:improved indentation bzr revid: apa@tinyerp.com-20120906093754-gvly9tnpbc6mzhxs --- addons/mrp_repair/mrp_repair_data.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/mrp_repair/mrp_repair_data.xml b/addons/mrp_repair/mrp_repair_data.xml index 337a4113382..b45b7ec3105 100644 --- a/addons/mrp_repair/mrp_repair_data.xml +++ b/addons/mrp_repair/mrp_repair_data.xml @@ -1,7 +1,6 @@ - - + new @@ -44,5 +43,5 @@ - + From 4707ee56a9e6f2d5b4af389a1adba8fd83f0dac4 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 6 Sep 2012 15:11:23 +0530 Subject: [PATCH 192/581] [IMP]add context to the method bzr revid: sgo@tinyerp.com-20120906094123-ua4zxhot0z3wgd7g --- addons/mail/mail_message.py | 2 +- addons/mail/mail_thread.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index 3ef731b766b..be1fbe78176 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -335,7 +335,7 @@ class mail_message(osv.Model): missing_follow_ids = [] if message.subtype_id: for p_id in missing_notified: - follow_ids = followers_obj.search(cr, uid, [('partner_id','=',p_id),('subtype_ids','in',[message.subtype_id.id]),('res_model','=',message.model),('res_id','=',message.res_id)]) + follow_ids = followers_obj.search(cr, uid, [('partner_id','=',p_id),('subtype_ids','in',[message.subtype_id.id]),('res_model','=',message.model),('res_id','=',message.res_id)], context=context) if follow_ids and len(follow_ids): missing_follow_ids.append(p_id) message.write({'partner_ids': [(4, p_id) for p_id in missing_follow_ids]}) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 7fc6c79bd9a..4d627712742 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -600,9 +600,9 @@ class mail_thread(osv.AbstractModel): values = kwargs subtype_obj = self.pool.get('mail.message.subtype') if subtype: - subtypes = subtype_obj.name_search(cr, uid, subtype) + subtypes = subtype_obj.name_search(cr, uid, subtype,context=context) if len(subtypes): - subtype_browse = subtype_obj.browse(cr, uid, subtypes[0][0]) + subtype_browse = subtype_obj.browse(cr, uid, subtypes[0][0],context=context) if self._name in [model.model for model in subtype_browse.model_ids]: values['subtype_id']=subtype_browse.id values.update({ @@ -636,7 +636,7 @@ class mail_thread(osv.AbstractModel): self.write(cr, uid, ids, {'message_follower_ids': [(4, pid) for pid in partner_ids]}, context=context) if not subtype_ids: subtype_obj = self.pool.get('mail.message.subtype') - subtype_ids = subtype_obj.search(cr, uid, [('default', '=', 'true'),('model_ids.model', '=', self._name)]) + subtype_ids = subtype_obj.search(cr, uid, [('default', '=', 'true'),('model_ids.model', '=', self._name)],context=context) if subtype_ids: self.message_subscribe_udpate_subtypes(cr, uid, ids, partner_ids, subtype_ids, context=context) if context and context.get('read_back'): @@ -690,7 +690,7 @@ class mail_thread(osv.AbstractModel): def message_subscribe_udpate_subtypes(self, cr, uid, ids, user_id, subtype_ids,context=None): followers_obj = self.pool.get('mail.followers') - followers_ids = followers_obj.search(cr, uid, [('res_model', '=', self._name), ('res_id', 'in', ids)]) + followers_ids = followers_obj.search(cr, uid, [('res_model', '=', self._name), ('res_id', 'in', ids)], context=context) return followers_obj.write(cr, uid, followers_ids, {'subtype_ids': [(6, 0 , subtype_ids)]}, context = context) #overright or add new one # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From f36dd4c891710bb3ddb6e097f80ef0b9b6c26134 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Thu, 6 Sep 2012 16:29:14 +0530 Subject: [PATCH 193/581] [IMP]:improved test case bzr revid: apa@tinyerp.com-20120906105914-iwoi15ghgtibt2lr --- addons/mail/data/mail_data.xml | 5 ++++- addons/mail/mail_thread.py | 2 +- addons/mail/tests/test_mail.py | 4 +--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/addons/mail/data/mail_data.xml b/addons/mail/data/mail_data.xml index b241cb095de..80aff038dac 100644 --- a/addons/mail/data/mail_data.xml +++ b/addons/mail/data/mail_data.xml @@ -15,13 +15,16 @@ other - + + email + comment + diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 4d627712742..42581654ace 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -562,7 +562,7 @@ class mail_thread(osv.AbstractModel): self.message_post(cr, uid, [id], message, context=context) def message_post(self, cr, uid, thread_id, body='', subject=False, - type='notification', parent_id=False, attachments=None, subtype='other', context=None, **kwargs): + type='notification', parent_id=False, attachments=None, subtype='comment', context=None, **kwargs): """ Post a new message in an existing thread, returning the new mail.message ID. Extra keyword arguments will be used as default column values for the new mail.message record. diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py index a8c1d6b7cf1..8cf0e25ecbb 100644 --- a/addons/mail/tests/test_mail.py +++ b/addons/mail/tests/test_mail.py @@ -616,9 +616,7 @@ class test_mail(common.TransactionCase): # 0 - Admin p_a_id = user_admin.partner_id.id # Subscribe #1, - self.mail_group_model_id = self.ir_model.search(cr, uid, [('model','=', 'mail.group')])[0] - subtype_ids = self.mail_message_subtype.search(cr, uid, []) - self.mail_message_subtype.write(cr,uid,subtype_ids,{'model_ids':[(4,self.mail_group_model_id )]}) + group_pigs.message_subscribe_users([uid]) # Mail data From 6977a136498ccd320f5dbcc0caa9e476db5ada86 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Fri, 7 Sep 2012 17:12:16 +0530 Subject: [PATCH 194/581] [IMP]resolve error bzr revid: sgo@tinyerp.com-20120907114216-5qbzq1y80ut9d6mx --- addons/mail/mail_message_subtype.xml | 9 +++++++++ addons/mail/static/src/js/mail_followers.js | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/addons/mail/mail_message_subtype.xml b/addons/mail/mail_message_subtype.xml index 8de3224470f..0bfdc2cad95 100644 --- a/addons/mail/mail_message_subtype.xml +++ b/addons/mail/mail_message_subtype.xml @@ -47,6 +47,15 @@ mail.message.subtype form tree,form + +

          + Click to create a message subtype. +

          + OpenERP's message subtype allows to ease and fasten the + subtype which helps to decrease over crowdy wall comments which displays + only those. +

          +
          Date: Fri, 7 Sep 2012 17:42:58 +0530 Subject: [PATCH 195/581] [IMP]improve code bzr revid: sgo@tinyerp.com-20120907121258-r48mymwh9yvxlrqi --- addons/mail/static/src/js/mail_followers.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js index 53f2117fa04..c2d4f31c159 100644 --- a/addons/mail/static/src/js/mail_followers.js +++ b/addons/mail/static/src/js/mail_followers.js @@ -117,8 +117,9 @@ openerp_mail_followers = function(session, mail) { follower_read.then(function (follower_record){ if(follower_record.length != 0){ _(follower_record[0].subtype_ids).each(function (subtype_id){ - if(self.$el.find('.oe_msg_subtype_check[id=' + subtype_id + ']')[0]){ - self.$el.find('.oe_msg_subtype_check[id=' + subtype_id + ']')[0].checked=true} + var subtype_check = self.$el.find('.oe_msg_subtype_check[id=' + subtype_id + ']') + if(subtype_check.length > 0){ + subtype_check[0].checked=true} }); } }) From 741bbaa9f457577b25d8f6007b6aae34aedf2840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 7 Sep 2012 18:09:20 +0200 Subject: [PATCH 196/581] [WIP] mail_message.message_read(): WIP about having correct expandables. Will be updated next week. bzr revid: tde@openerp.com-20120907160920-4ijs93y9ogp39xma --- addons/mail/mail_message.py | 59 ++++++++++++++++++++++++---------- addons/mail/res_partner.py | 1 - addons/mail/tests/test_mail.py | 13 ++++---- 3 files changed, 49 insertions(+), 24 deletions(-) diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index 18a88bb0b61..90ccc8a2f24 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -167,7 +167,24 @@ class mail_message(osv.Model): 'child_ids': [], } - def message_read_tree_flatten(self, cr, uid, messages, current_level, level, context=None): + def message_read_tree_get_expandable(self, cr, uid, parent_message, last_message, domain=[], current_level=0, level=0, context=None): + """ . """ + base_domain = [('id', '<', last_message['id'])] + if parent_message and current_level < level: + base_domain += [('parent_id', '=', parent_message['id'])] + elif parent_message: + base_domain += [('id', 'child_od', parent_message['id'])] + if domain: + base_domain += domain + extension = { 'type': 'expandable', + 'domain': base_domain, + 'thread_level': current_level, + 'context': context, + 'id': -1, + } + return extension + + def message_read_tree_flatten(self, cr, uid, parent_message, messages, current_level, level, domain=[], context=None): """ Given a tree with several roots of following structure : [ {'id': 1, 'child_ids': [ {'id': 11, 'child_ids': [...] },], @@ -186,28 +203,36 @@ class mail_message(osv.Model): child_ids = msg_dict.pop('child_ids', []) msg_dict['child_ids'] = [] return [msg_dict] + child_ids - # return sorted([msg_dict] + child_ids, key=itemgetter('id'), reverse=True) context = context or {} # Depth-first flattening for message in messages: if message.get('type') == 'expandable': continue - message['child_ids'] = self.message_read_tree_flatten(cr, uid, message['child_ids'], current_level + 1, level, context=context) + message['child_ids'] = self.message_read_tree_flatten(cr, uid, message, message['child_ids'], current_level + 1, level, domain, context=context) # Flatten if above maximum depth if current_level < level: return_list = messages else: - return_list = [] - for message in messages: - for flat_message in _flatten(message): - return_list.append(flat_message) - return sorted(return_list, key=itemgetter(context.get('sort_key', 'id')), reverse=context.get('sort_reverse', True)) + return_list = [flat_message for message in messages for flat_message in _flatten(message)] + # Add expandable + return_list = sorted(return_list, key=itemgetter(context.get('sort_key', 'id')), reverse=context.get('sort_reverse', True)) + if current_level <= level: + expandable = self.message_read_tree_get_expandable(cr, uid, parent_message, return_list and return_list[-1] or parent_message, [], current_level, level, context=context) + print 'expandable', expandable + return return_list - def message_read(self, cr, uid, ids=False, domain=[], thread_level=0, limit=None, context=None): - """ If IDs are provided, fetch these records. Otherwise use the domain - to fetch the matching records. - After having fetched the records provided by IDs, it will fetch the - parents to have well-formed threads. + def message_read(self, cr, uid, ids=False, domain=[], level=0, context=None, limit=None, tree_parent_id=False): + """ Read messages from mail.message, and get back a structured tree + of messages to be displayed as discussion threads. If IDs is set, + fetch these records. Otherwise use the domain to fetch messages. + After having fetch messages, their parents will be added to obtain + well formed threads. + + :param domain: optional domain for searching ids + :param level: level of threads to display, 0 being flat + :param limit: number of messages to fetch + :param tree_parent_id: if parent_id reached, stop searching for + further parents :return list: list of trees of messages """ limit = limit or self._message_read_limit @@ -221,8 +246,8 @@ class mail_message(osv.Model): for msg in messages: if len(result) < (limit - 1): record = self._message_dict_get(cr, uid, msg, context=context) - if thread_level and msg.parent_id: - while msg.parent_id: + if level and msg.parent_id: + while msg.parent_id != tree_parent_id: if msg.parent_id.id in tree: record_parent = tree[msg.parent_id.id] else: @@ -241,14 +266,14 @@ class mail_message(osv.Model): 'type': 'expandable', 'domain': [('id', '<=', msg.id)] + domain, 'context': context, - 'thread_level': thread_level, # should be improve accodting to level of records + 'thread_level': level, # should be improve accodting to level of records 'id': -1, }) break # Flatten the result if thread_level > 0: - result = self.message_read_tree_flatten(cr, uid, result, 0, thread_level, context=context) + result = self.message_read_tree_flatten(cr, uid, None, result, 0, thread_level, domain, context=context) return result #------------------------------------------------------ diff --git a/addons/mail/res_partner.py b/addons/mail/res_partner.py index 2988cee3d9c..4a6f98fa31d 100644 --- a/addons/mail/res_partner.py +++ b/addons/mail/res_partner.py @@ -41,5 +41,4 @@ class res_partner_mail(osv.Model): 'notification_email_send': lambda *args: 'comment' } - # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py index f45745f31dc..1f65c38f755 100644 --- a/addons/mail/tests/test_mail.py +++ b/addons/mail/tests/test_mail.py @@ -459,13 +459,13 @@ class test_mail(common.TransactionCase): cr, uid = self.cr, self.uid group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id) def _compare_structures(struct1, struct2, n=0): - # print '%scompare structure' % ('\t' * n) + print '%scompare structure' % ('\t' * n) self.assertEqual(len(struct1), len(struct2), 'message_read structure number of childs incorrect') for x in range(len(struct1)): - # print '%s' % ('\t' * n), struct1[x]['id'], struct2[x]['id'], struct1[x].get('subject') or '' + print '%s' % ('\t' * n), struct1[x]['id'], struct2[x]['id'], struct1[x].get('subject') or '' self.assertEqual(struct1[x]['id'], struct2[x]['id'], 'message_read failure %s' % struct1[x].get('subject')) _compare_structures(struct1[x]['child_ids'], struct2[x]['child_ids'], n + 1) - # print '%send compare' % ('\t' * n) + print '%send compare' % ('\t' * n) # ---------------------------------------- # CASE1: Flattening test @@ -490,7 +490,8 @@ class test_mail(common.TransactionCase): ]}, ] # Test: completely flat - new_tree = self.mail_message.message_read_tree_flatten(cr, uid, copy.deepcopy(tree), 0, 0) + new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), 0, 0, [('type', 'in', 'borderlands')]) + _compare_structures(new_tree, new_tree) self.assertEqual(len(new_tree), 10, 'message_read_tree_flatten wrong in flat') # Test: 1 thread level tree_test = [{'id': 2, 'child_ids': [ @@ -502,10 +503,10 @@ class test_mail(common.TransactionCase): {'id': 4, 'child_ids': []}, {'id': 3, 'child_ids': []}, ]}, ] - new_tree = self.mail_message.message_read_tree_flatten(cr, uid, copy.deepcopy(tree), 0, 1) + new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), 0, 1, [('type', 'in', 'borderlands')]) _compare_structures(new_tree, tree_test) # Test: 2 thread levels - new_tree = self.mail_message.message_read_tree_flatten(cr, uid, copy.deepcopy(tree), 0, 2) + new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), 0, 2, [('type', 'in', 'borderlands')]) _compare_structures(new_tree, tree) # ---------------------------------------- From 004b9c9a849f2f92e3ed4eb192531780e15a0a9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Sun, 9 Sep 2012 13:45:15 +0200 Subject: [PATCH 197/581] create invoice: changing journal changes company too lp bug: https://launchpad.net/bugs/1047884 fixed bzr revid: stephane.bidoul@acsone.eu-20120909114515-mbilk7jv2aj1mn9x --- addons/account/account_invoice.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index 15027b7a8f6..e925e87c136 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -503,8 +503,10 @@ class account_invoice(osv.osv): if journal_id: journal = self.pool.get('account.journal').browse(cr, uid, journal_id, context=context) currency_id = journal.currency and journal.currency.id or journal.company_id.currency_id.id + company_id = journal.company_id.id result = {'value': { 'currency_id': currency_id, + 'company_id': company_id, } } return result From 17edcf06301179bd9d7a7d05458e7d00c67a1d4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Sun, 9 Sep 2012 14:42:59 +0200 Subject: [PATCH 198/581] select account and taxes for the invoice's company instead of the user's default company when changing product or account This partially fixes lp:1048213 since the default account proposed when creating a new invoice line (in trunk only) is still from the user's company. lp bug: https://launchpad.net/bugs/1048213 fixed bzr revid: stephane.bidoul@acsone.eu-20120909124259-df6qo743sfogltf9 --- addons/account/account_invoice.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index e925e87c136..cd77b202e0e 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -1365,7 +1365,10 @@ class account_invoice_line(osv.osv): 'partner_id': fields.related('invoice_id','partner_id',type='many2one',relation='res.partner',string='Partner',store=True) } - def _default_account_id(self, cr, uid, ids, context=None): + def _default_account_id(self, cr, uid, context=None): + # XXX this gets the default account for the user's company, + # it should get the default account for the invoice's company + # however, the invoice's company does not reach this point prop = self.pool.get('ir.property').get(cr, uid, 'property_account_income_categ', 'product.category', context=context) return prop and prop.id or False @@ -1395,7 +1398,7 @@ class account_invoice_line(osv.osv): context = {} company_id = company_id if company_id != None else context.get('company_id',False) context = dict(context) - context.update({'company_id': company_id}) + context.update({'company_id': company_id, 'force_company': company_id}) if not partner_id: raise osv.except_osv(_('No Partner Defined !'),_("You must first select a partner !") ) if not product: @@ -1550,12 +1553,14 @@ class account_invoice_line(osv.osv): def onchange_account_id(self, cr, uid, ids, product_id, partner_id, inv_type, fposition_id, account_id): if not account_id: return {} - taxes = self.pool.get('account.account').browse(cr, uid, account_id).tax_ids + account = self.pool.get('account.account').browse(cr, uid, account_id) + taxes = account.tax_ids fpos = fposition_id and self.pool.get('account.fiscal.position').browse(cr, uid, fposition_id) or False tax_ids = self.pool.get('account.fiscal.position').map_tax(cr, uid, fpos, taxes) product_change_result = self.product_id_change(cr, uid, ids, product_id, False, type=inv_type, - partner_id=partner_id, fposition_id=fposition_id) + partner_id=partner_id, fposition_id=fposition_id, + company_id=account.company_id.id) unique_tax_ids = set(tax_ids) if product_change_result and 'value' in product_change_result and 'invoice_line_tax_id' in product_change_result['value']: unique_tax_ids |= set(product_change_result['value']['invoice_line_tax_id']) From 4deb1f84e7eb7f6cf23bc6dfe61c1d92b968d82d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Sun, 9 Sep 2012 17:24:38 +0200 Subject: [PATCH 199/581] hr_timesheet_invoice, bill task work: use the analytic account company for the generated invoice_cost_create This makes life much easiers for people generating billings for several companies. lp bug: https://launchpad.net/bugs/1047826 fixed bzr revid: stephane.bidoul@acsone.eu-20120909152438-qax5pv4ij76asmbv --- .../wizard/hr_timesheet_invoice_create.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py index 76314e1986a..e33e88203f8 100644 --- a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py +++ b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py @@ -79,17 +79,24 @@ class account_analytic_line(osv.osv): curr_invoice = { 'name': time.strftime('%d/%m/%Y')+' - '+account.name, 'partner_id': account.partner_id.id, + 'company_id': account.company_id.id, 'payment_term': partner.property_payment_term.id or False, 'account_id': partner.property_account_receivable.id, 'currency_id': account.pricelist_id.currency_id.id, 'date_due': date_due, 'fiscal_position': account.partner_id.property_account_position.id } - last_invoice = invoice_obj.create(cr, uid, curr_invoice, context=context) - invoices.append(last_invoice) - + context2 = context.copy() context2['lang'] = partner.lang + # set company_id in context, so the correct default journal will be selected + context2['force_company'] = curr_invoice['company_id'] + # set force_company in context so the correct product properties are selected (eg. income account) + context2['company_id'] = curr_invoice['company_id'] + + last_invoice = invoice_obj.create(cr, uid, curr_invoice, context=context2) + invoices.append(last_invoice) + cr.execute("SELECT product_id, to_invoice, sum(unit_amount), product_uom_id, name " \ "FROM account_analytic_line as line " \ "WHERE account_id = %s " \ From 38dfccaaa08d4ee8e73e88cc17430e95313591e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Sun, 9 Sep 2012 18:59:19 +0200 Subject: [PATCH 200/581] hr_timesheet_invoice: in invoice task work, use the account default tax if the product has no taxes defined lp bug: https://launchpad.net/bugs/1048305 fixed bzr revid: stephane.bidoul@acsone.eu-20120909165919-xgxu45ugq3944gvu --- .../wizard/hr_timesheet_invoice_create.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py index e33e88203f8..32ae652ca3d 100644 --- a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py +++ b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py @@ -122,11 +122,11 @@ class account_analytic_line(osv.osv): else: price = 0.0 - taxes = product.taxes_id - tax = fiscal_pos_obj.map_tax(cr, uid, account.partner_id.property_account_position, taxes) - account_id = product.product_tmpl_id.property_account_income.id or product.categ_id.property_account_income_categ.id - if not account_id: + general_account = product.product_tmpl_id.property_account_income or product.categ_id.property_account_income_categ + if not general_account: raise osv.except_osv(_("Configuration Error!"), _("Please define income account for product '%s'.") % product.name) + taxes = product.taxes_id or general_account.tax_ids + tax = fiscal_pos_obj.map_tax(cr, uid, account.partner_id.property_account_position, taxes) curr_line = { 'price_unit': price, 'quantity': qty, @@ -137,7 +137,7 @@ class account_analytic_line(osv.osv): 'product_id': product_id, 'invoice_line_tax_id': [(6,0,tax)], 'uos_id': uom, - 'account_id': account_id, + 'account_id': general_account.id, 'account_analytic_id': account.id, } From 5cf330f39a23157caa50d475add761ff93109f99 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Mon, 10 Sep 2012 11:19:03 +0530 Subject: [PATCH 201/581] [IMP]add help on subtype name bzr revid: sgo@tinyerp.com-20120910054903-22sveyi971arsl39 --- addons/mail/mail_message_subtype.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/mail/mail_message_subtype.py b/addons/mail/mail_message_subtype.py index ab41c83ed61..2330e34e1d3 100644 --- a/addons/mail/mail_message_subtype.py +++ b/addons/mail/mail_message_subtype.py @@ -27,8 +27,8 @@ class mail_message_subtype(osv.osv): _name = 'mail.message.subtype' _description = 'mail_message_subtype' _columns = { - 'name': fields.char(' Message Subtype ', size = 128, - required = True, help = 'Subtype Of Message'), + 'name': fields.char('Message Subtype ', size = 128, + required = True, help = 'Message subtype, gives a more precise type on the message, especially for system notifications. For example, it can be a notification related to a new record (New), or to a stage change in a process (Stage change). Message subtypes allow to precisely tune the notifications the user want to receive on its wall.'), 'model_ids': fields.many2many('ir.model', 'mail_message_subtyp_message_rel', 'message_subtype_id', 'model_id', 'Model', From dfa14420d212911bb5f87af19231a848c59cab07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 11 Sep 2012 14:01:17 +0200 Subject: [PATCH 202/581] [WIP] mail_message: continued work on message_read and expandables. bzr revid: tde@openerp.com-20120911120117-xeeercvglfwq3c9e --- addons/mail/mail_message.py | 69 +++++++++++++++---------------- addons/mail/static/src/js/mail.js | 2 +- addons/mail/tests/test_mail.py | 37 +++++++++-------- 3 files changed, 54 insertions(+), 54 deletions(-) diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index 90ccc8a2f24..230199569f4 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -147,6 +147,7 @@ class mail_message(osv.Model): def _message_dict_get(self, cr, uid, msg, context=None): """ Return a dict representation of the message browse record. """ + child_nbr = len(msg.child_ids) attachment_ids = [{'id': attach[0], 'name': attach[1]} for attach in self.pool.get('ir.attachment').name_get(cr, uid, [x.id for x in msg.attachment_ids], context=context)] author_id = self.pool.get('res.partner').name_get(cr, uid, [msg.author_id.id], context=context)[0] author_user_id = self.pool.get('res.users').name_get(cr, uid, [msg.author_id.user_ids[0].id], context=context)[0] @@ -165,6 +166,7 @@ class mail_message(osv.Model): 'author_user_id': author_user_id, 'partner_ids': partner_ids, 'child_ids': [], + 'child_nbr': child_nbr, } def message_read_tree_get_expandable(self, cr, uid, parent_message, last_message, domain=[], current_level=0, level=0, context=None): @@ -173,7 +175,7 @@ class mail_message(osv.Model): if parent_message and current_level < level: base_domain += [('parent_id', '=', parent_message['id'])] elif parent_message: - base_domain += [('id', 'child_od', parent_message['id'])] + base_domain += [('id', 'child_of', parent_message['id'])] if domain: base_domain += domain extension = { 'type': 'expandable', @@ -184,7 +186,7 @@ class mail_message(osv.Model): } return extension - def message_read_tree_flatten(self, cr, uid, parent_message, messages, current_level, level, domain=[], context=None): + def message_read_tree_flatten(self, cr, uid, parent_message, messages, domain=[], level=0, current_level=0, context=None, limit=None): """ Given a tree with several roots of following structure : [ {'id': 1, 'child_ids': [ {'id': 11, 'child_ids': [...] },], @@ -204,11 +206,14 @@ class mail_message(osv.Model): msg_dict['child_ids'] = [] return [msg_dict] + child_ids context = context or {} + limit = limit or self._message_read_limit # Depth-first flattening for message in messages: if message.get('type') == 'expandable': continue - message['child_ids'] = self.message_read_tree_flatten(cr, uid, message, message['child_ids'], current_level + 1, level, domain, context=context) + message['child_ids'] = self.message_read_tree_flatten(cr, uid, message, message['child_ids'], domain, level, current_level + 1, context=context) + for child in message['child_ids']: + message['child_nbr'] += child['child_nbr'] # Flatten if above maximum depth if current_level < level: return_list = messages @@ -216,12 +221,17 @@ class mail_message(osv.Model): return_list = [flat_message for message in messages for flat_message in _flatten(message)] # Add expandable return_list = sorted(return_list, key=itemgetter(context.get('sort_key', 'id')), reverse=context.get('sort_reverse', True)) - if current_level <= level: + if current_level == 0: + expandable = self.message_read_tree_get_expandable(cr, uid, parent_message, return_list and return_list[-1] or parent_message, [], current_level, level, context=context) + if len(return_list) >= limit: + print 'we need an expandable here' + print 'expandable', expandable + elif current_level <= level: expandable = self.message_read_tree_get_expandable(cr, uid, parent_message, return_list and return_list[-1] or parent_message, [], current_level, level, context=context) print 'expandable', expandable return return_list - def message_read(self, cr, uid, ids=False, domain=[], level=0, context=None, limit=None, tree_parent_id=False): + def message_read(self, cr, uid, ids=False, domain=[], level=0, context=None, limit=None, parent_id=False): """ Read messages from mail.message, and get back a structured tree of messages to be displayed as discussion threads. If IDs is set, fetch these records. Otherwise use the domain to fetch messages. @@ -231,7 +241,7 @@ class mail_message(osv.Model): :param domain: optional domain for searching ids :param level: level of threads to display, 0 being flat :param limit: number of messages to fetch - :param tree_parent_id: if parent_id reached, stop searching for + :param parent_id: if parent_id reached, stop searching for further parents :return list: list of trees of messages """ @@ -241,39 +251,28 @@ class mail_message(osv.Model): ids = self.search(cr, uid, domain, context=context, limit=limit) messages = self.browse(cr, uid, ids, context=context) + # key: ID, value: record + tree = {} result = [] - tree = {} # key: ID, value: record for msg in messages: - if len(result) < (limit - 1): - record = self._message_dict_get(cr, uid, msg, context=context) - if level and msg.parent_id: - while msg.parent_id != tree_parent_id: - if msg.parent_id.id in tree: - record_parent = tree[msg.parent_id.id] - else: - record_parent = self._message_dict_get(cr, uid, msg.parent_id, context=context) - if msg.parent_id.parent_id: - tree[msg.parent_id.id] = record_parent - if record['id'] not in [x['id'] for x in record_parent['child_ids']]: - record_parent['child_ids'].append(record) - record = record_parent - msg = msg.parent_id - if msg.id not in tree: - result.append(record) - tree[msg.id] = record - else: - result.append({ - 'type': 'expandable', - 'domain': [('id', '<=', msg.id)] + domain, - 'context': context, - 'thread_level': level, # should be improve accodting to level of records - 'id': -1, - }) - break + record = self._message_dict_get(cr, uid, msg, context=context) + while msg.parent_id and msg.parent_id.id != parent_id: + if msg.parent_id.id in tree: + record_parent = tree[msg.parent_id.id] + else: + record_parent = self._message_dict_get(cr, uid, msg.parent_id, context=context) + if msg.parent_id.parent_id: + tree[msg.parent_id.id] = record_parent + if record['id'] not in [x['id'] for x in record_parent['child_ids']]: + record_parent['child_ids'].append(record) + record = record_parent + msg = msg.parent_id + if msg.id not in tree: + result.append(record) + tree[msg.id] = record # Flatten the result - if thread_level > 0: - result = self.message_read_tree_flatten(cr, uid, None, result, 0, thread_level, domain, context=context) + result = self.message_read_tree_flatten(cr, uid, None, result, domain, level, context=context) return result #------------------------------------------------------ diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js index c02b81d0c4f..651a2642cc4 100644 --- a/addons/mail/static/src/js/mail.js +++ b/addons/mail/static/src/js/mail.js @@ -455,7 +455,7 @@ openerp.mail = function(session) { return this.message_display(this.options.message_data); } return this.ds_message.call('message_read', - [(initial_mode && this.options.message_ids) || false, fetch_domain, this.options.thread_level, undefined, fetch_context] + [(initial_mode && this.options.message_ids) || false, fetch_domain, this.options.thread_level, fetch_context] ).then(this.proxy('message_display')); }, diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py index 1f65c38f755..053e5697207 100644 --- a/addons/mail/tests/test_mail.py +++ b/addons/mail/tests/test_mail.py @@ -29,7 +29,7 @@ Received: by mail1.openerp.com (Postfix, from userid 10002) From: Sylvie Lelitre Subject: {subject} MIME-Version: 1.0 -Content-Type: multipart/alternative; +Content-Type: multipart/alternative; boundary="----=_Part_4200734_24778174.1344608186754" Date: Fri, 10 Aug 2012 14:16:26 +0000 Message-ID: <1198923581.41972151344608186760.JavaMail@agrolait.com> @@ -52,9 +52,9 @@ Content-Transfer-Encoding: quoted-printable =20 =20 - +

          Please call me as soon as possible this afternoon!

          - +

          --
          Sylvie

          @@ -153,7 +153,7 @@ class test_mail(common.TransactionCase): test_msg_id = '' mail_text = MAIL_TEMPLATE_PLAINTEXT.format(to='groups@example.com', subject='frogs', extra='', msg_id=test_msg_id) self.mail_thread.message_process(cr, uid, None, mail_text) - new_mail = self.mail_message.browse(cr, uid, self.mail_message.search(cr, uid, [('message_id','=',test_msg_id)])[0]) + new_mail = self.mail_message.browse(cr, uid, self.mail_message.search(cr, uid, [('message_id', '=', test_msg_id)])[0]) self.assertEqual(new_mail.body, '\n

          \nPlease call me as soon as possible this afternoon!\n\n--\nSylvie\n
          \n', 'plaintext mail incorrectly parsed') @@ -458,11 +458,12 @@ class test_mail(common.TransactionCase): # It will be updated as soon as we have fixed specs ! cr, uid = self.cr, self.uid group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id) + def _compare_structures(struct1, struct2, n=0): print '%scompare structure' % ('\t' * n) self.assertEqual(len(struct1), len(struct2), 'message_read structure number of childs incorrect') for x in range(len(struct1)): - print '%s' % ('\t' * n), struct1[x]['id'], struct2[x]['id'], struct1[x].get('subject') or '' + print '%s' % ('\t' * n), struct1[x]['id'], struct1[x]['child_nbr'], struct2[x]['id'], struct2[x]['child_nbr'], struct1[x].get('subject') or '' self.assertEqual(struct1[x]['id'], struct2[x]['id'], 'message_read failure %s' % struct1[x].get('subject')) _compare_structures(struct1[x]['child_ids'], struct2[x]['child_ids'], n + 1) print '%send compare' % ('\t' * n) @@ -473,24 +474,24 @@ class test_mail(common.TransactionCase): # Create dummy message structure import copy - tree = [{'id': 2, 'child_ids': [ - {'id': 6, 'child_ids': [ - {'id': 8, 'child_ids': []}, + tree = [{'id': 2, 'child_nbr': 1, 'child_ids': [ + {'id': 6, 'child_nbr': 1, 'child_ids': [ + {'id': 8, 'child_nbr': 0, 'child_ids': []}, ]}, ]}, - {'id': 1, 'child_ids':[ - {'id': 7, 'child_ids': [ - {'id': 9, 'child_ids': []}, + {'id': 1, 'child_nbr': 3, 'child_ids':[ + {'id': 7, 'child_nbr': 1, 'child_ids': [ + {'id': 9, 'child_nbr': 0, 'child_ids': []}, ]}, - {'id': 4, 'child_ids': [ - {'id': 10, 'child_ids': []}, - {'id': 5, 'child_ids': []}, + {'id': 4, 'child_nbr': 2, 'child_ids': [ + {'id': 10, 'child_nbr': 0, 'child_ids': []}, + {'id': 5, 'child_nbr': 0, 'child_ids': []}, ]}, - {'id': 3, 'child_ids': []}, + {'id': 3, 'child_nbr': 0, 'child_ids': []}, ]}, ] # Test: completely flat - new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), 0, 0, [('type', 'in', 'borderlands')]) + new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 0) _compare_structures(new_tree, new_tree) self.assertEqual(len(new_tree), 10, 'message_read_tree_flatten wrong in flat') # Test: 1 thread level @@ -503,10 +504,10 @@ class test_mail(common.TransactionCase): {'id': 4, 'child_ids': []}, {'id': 3, 'child_ids': []}, ]}, ] - new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), 0, 1, [('type', 'in', 'borderlands')]) + new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 1) _compare_structures(new_tree, tree_test) # Test: 2 thread levels - new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), 0, 2, [('type', 'in', 'borderlands')]) + new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 2) _compare_structures(new_tree, tree) # ---------------------------------------- From 6f0b0355df2ddc0541afa7510558491921b3e5bb Mon Sep 17 00:00:00 2001 From: Hardik Date: Wed, 12 Sep 2012 11:42:52 +0530 Subject: [PATCH 203/581] [FIX] Survey : traceback when click on answer survey lp bug: https://launchpad.net/bugs/1048954 fixed bzr revid: hsa@tinyerp.com-20120912061252-qul9z1eycawtgu4b --- addons/survey/survey.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/addons/survey/survey.py b/addons/survey/survey.py index dde3130e9c5..8eddab92689 100644 --- a/addons/survey/survey.py +++ b/addons/survey/survey.py @@ -145,10 +145,14 @@ class survey(osv.osv): return report def fill_survey(self, cr, uid, ids, context=None): - sur_obj = self.read(cr, uid, ids,['title'], context=context) + sur_obj = self.read(cr, uid, ids,['title', 'page_ids'], context=context) for sur in sur_obj: name = sur['title'] - context.update({'active':False,'survey_id': ids[0]}) + pages = sur['page_ids'] + if not pages: + raise osv.except_osv(_('Warning!'), _('You have to create question and answer for survey.')) + else: + context.update({'active':False,'survey_id': ids[0]}) return { 'view_type': 'form', 'view_mode': 'form', From 688f53badd3a8eb0d6bf354b11022d76a4a0e230 Mon Sep 17 00:00:00 2001 From: Robajz <> Date: Wed, 12 Sep 2012 14:49:34 +0530 Subject: [PATCH 204/581] [FIX]hr_payroll :set a domain on contract_id for fix lp:1045278 lp bug: https://launchpad.net/bugs/1045278 fixed bzr revid: mma@tinyerp.com-20120912091934-0bfop7t2b7s1mcuq --- addons/hr_payroll/hr_payroll_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hr_payroll/hr_payroll_view.xml b/addons/hr_payroll/hr_payroll_view.xml index 58484a91567..27b82385036 100644 --- a/addons/hr_payroll/hr_payroll_view.xml +++ b/addons/hr_payroll/hr_payroll_view.xml @@ -234,7 +234,7 @@ - + From ce39ffe9271261cdc52b76e3bc981d177f7a6693 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Wed, 12 Sep 2012 16:52:45 +0530 Subject: [PATCH 205/581] [IMP]changed as per new spec update and make it work for crm changes done in crm bzr revid: sgo@tinyerp.com-20120912112245-3cp03024fiqb47qs --- addons/crm/crm_lead.py | 18 ++-- addons/crm/crm_lead_data.xml | 28 +++--- addons/mail/data/mail_data.xml | 10 --- addons/mail/mail_message.py | 45 +++------- addons/mail/mail_message_subtype.py | 8 +- addons/mail/mail_message_subtype.xml | 5 +- addons/mail/mail_thread.py | 41 ++++++--- addons/mail/static/src/js/mail_followers.js | 64 +++++-------- addons/mail/tests/test_mail.py | 99 ++++++--------------- 9 files changed, 106 insertions(+), 212 deletions(-) diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index b7cc0f840d9..6b04be2244d 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -27,15 +27,13 @@ import time import tools from tools.translate import _ -from base.res.res_partner import format_address - CRM_LEAD_PENDING_STATES = ( crm.AVAILABLE_STATES[2][0], # Cancelled crm.AVAILABLE_STATES[3][0], # Done crm.AVAILABLE_STATES[4][0], # Pending ) -class crm_lead(base_stage, format_address, osv.osv): +class crm_lead(base_stage, osv.osv): """ CRM Lead Case """ _name = "crm.lead" _description = "Lead/Opportunity" @@ -107,12 +105,6 @@ class crm_lead(base_stage, format_address, osv.osv): return result, fold - def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): - res = super(crm_lead,self).fields_view_get(cr, user, view_id, view_type, context, toolbar=toolbar, submenu=submenu) - if view_type == 'form': - res['arch'] = self.fields_view_get_address(cr, user, res['arch'], context=context) - return res - _group_by_full = { 'stage_id': _read_group_stage_ids } @@ -842,7 +834,7 @@ class crm_lead(base_stage, format_address, osv.osv): def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Override of the (void) default notification method. """ stage_name = self.pool.get('crm.case.stage').name_get(cr, uid, [stage_id], context=context)[0][1] - return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), subtype="stage change",context=context) + return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), mail_subtype_new="crm_subtype_stage_change",context=context) def case_get_note_msg_prefix(self, cr, uid, lead, context=None): if isinstance(lead, (int, long)): @@ -852,16 +844,16 @@ class crm_lead(base_stage, format_address, osv.osv): def create_send_note(self, cr, uid, ids, context=None): for id in ids: message = _("%s has been created.")% (self.case_get_note_msg_prefix(cr, uid, id, context=context)) - self.message_post(cr, uid, [id], body=message, subtype="new", context=context) + self.message_post(cr, uid, [id], body=message, subtype_xml_id="crm_subtype_new", context=context) return True def case_mark_lost_send_note(self, cr, uid, ids, context=None): message = _("Opportunity has been lost.") - return self.message_post(cr, uid, ids, body=message,subtype="lost", context=context) + return self.message_post(cr, uid, ids, body=message,subtype_xml_id="crm_subtype_lost", context=context) def case_mark_won_send_note(self, cr, uid, ids, context=None): message = _("Opportunity has been won.") - return self.message_post(cr, uid, ids, body=message, subtype="won", context=context) + return self.message_post(cr, uid, ids, body=message, subtype_xml_id="crm_subtype_won", context=context) def schedule_phonecall_send_note(self, cr, uid, ids, phonecall_id, action, context=None): phonecall = self.pool.get('crm.phonecall').browse(cr, uid, [phonecall_id], context=context)[0] diff --git a/addons/crm/crm_lead_data.xml b/addons/crm/crm_lead_data.xml index 9b3f5d7ec75..252e843cf30 100644 --- a/addons/crm/crm_lead_data.xml +++ b/addons/crm/crm_lead_data.xml @@ -155,32 +155,24 @@
          - + new - + crm.lead - + won - + crm.lead - + lost - - - - stage change - + crm.lead - - - - - - - - + + stage change + crm.lead + diff --git a/addons/mail/data/mail_data.xml b/addons/mail/data/mail_data.xml index 80aff038dac..8e2af38f2ea 100644 --- a/addons/mail/data/mail_data.xml +++ b/addons/mail/data/mail_data.xml @@ -13,18 +13,8 @@ - - other - - - - - email - - comment - diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index 686f3e3d381..9e228083b1b 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -20,13 +20,11 @@ ############################################################################## import logging -import openerp import tools from email.header import decode_header from operator import itemgetter from osv import osv, fields -from tools.translate import _ _logger = logging.getLogger(__name__) @@ -37,7 +35,6 @@ def decode(text): text = decode_header(text.replace('\r', '')) return ''.join([tools.ustr(x[0], x[1]) for x in text]) - class mail_message(osv.Model): """ Messages model: system notification (replacing res.log notifications), comments (OpenChatter discussion) and incoming emails. """ @@ -60,10 +57,7 @@ class mail_message(osv.Model): for message in self.browse(cr, uid, ids, context=context): if not message.model or not message.res_id: continue - try: - result[message.id] = self._shorten_name(self.pool.get(message.model).name_get(cr, uid, [message.res_id], context=context)[0][1]) - except openerp.exceptions.AccessDenied, e: - pass + result[message.id] = self._shorten_name(self.pool.get(message.model).name_get(cr, uid, [message.res_id], context=context)[0][1]) return result def _get_unread(self, cr, uid, ids, name, arg, context=None): @@ -154,7 +148,7 @@ class mail_message(osv.Model): def _message_dict_get(self, cr, uid, msg, context=None): """ Return a dict representation of the message browse record. """ - attachment_ids = [{'id': attach[0], 'name': attach[1]} for attach in self.pool.get('ir.attachment').name_get(cr, uid, [x.id for x in msg.attachment_ids], context=context)] + attachment_ids = self.pool.get('ir.attachment').name_get(cr, uid, [x.id for x in msg.attachment_ids], context=context) author_id = self.pool.get('res.partner').name_get(cr, uid, [msg.author_id.id], context=context)[0] author_user_id = self.pool.get('res.users').name_get(cr, uid, [msg.author_id.user_ids[0].id], context=context)[0] partner_ids = self.pool.get('res.partner').name_get(cr, uid, [x.id for x in msg.partner_ids], context=context) @@ -313,15 +307,15 @@ class mail_message(osv.Model): def unlink(self, cr, uid, ids, context=None): # cascade-delete attachments that are directly attached to the message (should only happen - # for mail.messages that act as parent for a standalone mail.mail record). + # for mail.messages that act as parent for a standalone mail.mail record. attachments_to_delete = [] - for message in self.browse(cr, uid, ids, context=context): - for attach in message.attachment_ids: - if attach.res_model == self._name and attach.res_id == message.id: + for mail in self.browse(cr, uid, ids, context=context): + for attach in mail.attachment_ids: + if attach.res_model == 'mail.message' and attach.res_id == mail.id: attachments_to_delete.append(attach.id) if attachments_to_delete: self.pool.get('ir.attachment').unlink(cr, uid, attachments_to_delete, context=context) - return super(mail_message, self).unlink(cr, uid, ids, context=context) + return super(mail_message,self).unlink(cr, uid, ids, context=context) def notify(self, cr, uid, newid, context=None): """ Add the related record followers to the destination partner_ids. @@ -344,6 +338,9 @@ class mail_message(osv.Model): follow_ids = followers_obj.search(cr, uid, [('partner_id','=',p_id),('subtype_ids','in',[message.subtype_id.id]),('res_model','=',message.model),('res_id','=',message.res_id)], context=context) if follow_ids and len(follow_ids): missing_follow_ids.append(p_id) + subtype_record = self.pool.get('mail.message.subtype').browse(cr, uid, message.subtype_id.id,context=context) + if not subtype_record.res_model: + missing_follow_ids.append(p_id) message.write({'partner_ids': [(4, p_id) for p_id in missing_follow_ids]}) partners_to_notify |= extra_notified self.pool.get('mail.notification').notify(cr, uid, list(partners_to_notify), newid, context=context) @@ -354,25 +351,3 @@ class mail_message(osv.Model): default = {} default.update(message_id=False, headers=False) return super(mail_message, self).copy(cr, uid, id, default=default, context=context) - - #------------------------------------------------------ - # Tools - #------------------------------------------------------ - - def check_partners_email(self, cr, uid, partner_ids, context=None): - """ Verify that selected partner_ids have an email_address defined. - Otherwise throw a warning. """ - partner_wo_email_lst = [] - for partner in self.pool.get('res.partner').browse(cr, uid, partner_ids, context=context): - if not partner.email: - partner_wo_email_lst.append(partner) - if not partner_wo_email_lst: - return {} - warning_msg = _('The following partners chosen as recipients for the email have no email address linked :') - for partner in partner_wo_email_lst: - warning_msg += '\n- %s' % (partner.name) - return {'warning': { - 'title': _('Partners email addresses not found'), - 'message': warning_msg, - } - } diff --git a/addons/mail/mail_message_subtype.py b/addons/mail/mail_message_subtype.py index 2330e34e1d3..6eb349fc71e 100644 --- a/addons/mail/mail_message_subtype.py +++ b/addons/mail/mail_message_subtype.py @@ -29,15 +29,9 @@ class mail_message_subtype(osv.osv): _columns = { 'name': fields.char('Message Subtype ', size = 128, required = True, help = 'Message subtype, gives a more precise type on the message, especially for system notifications. For example, it can be a notification related to a new record (New), or to a stage change in a process (Stage change). Message subtypes allow to precisely tune the notifications the user want to receive on its wall.'), - 'model_ids': fields.many2many('ir.model', - 'mail_message_subtyp_message_rel', - 'message_subtype_id', 'model_id', 'Model', - help = "link some subtypes to several models, for projet/task"), + 'res_model': fields.char('Model',size = 128, help = "link subtype to model"), 'default': fields.boolean('Default', help = "When subscribing to the document, users will receive by default messages related to this subtype unless they uncheck this subtype"), } _defaults = { 'default': True, } - _sql_constraints = [ - ('name_uniq', 'unique (name)', 'The name of the message subtype must be unique !') - ] diff --git a/addons/mail/mail_message_subtype.xml b/addons/mail/mail_message_subtype.xml index 0bfdc2cad95..7d0eed2f4da 100644 --- a/addons/mail/mail_message_subtype.xml +++ b/addons/mail/mail_message_subtype.xml @@ -14,7 +14,7 @@ - + @@ -30,13 +30,12 @@ + - - diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 87c2e22d46b..23c038ce692 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -562,7 +562,7 @@ class mail_thread(osv.AbstractModel): self.message_post(cr, uid, [id], message, context=context) def message_post(self, cr, uid, thread_id, body='', subject=False, - type='notification', parent_id=False, attachments=None, subtype='comment', context=None, **kwargs): + type='notification', parent_id=False, attachments=None, subtype_xml_id='mail_subtype_comment', context=None, **kwargs): """ Post a new message in an existing thread, returning the new mail.message ID. Extra keyword arguments will be used as default column values for the new mail.message record. @@ -599,12 +599,13 @@ class mail_thread(osv.AbstractModel): values = kwargs subtype_obj = self.pool.get('mail.message.subtype') - if subtype: - subtypes = subtype_obj.name_search(cr, uid, subtype,context=context) - if len(subtypes): - subtype_browse = subtype_obj.browse(cr, uid, subtypes[0][0],context=context) - if self._name in [model.model for model in subtype_browse.model_ids]: - values['subtype_id']=subtype_browse.id + ref = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'mail', subtype_xml_id) + if subtype_xml_id: + subtype_browse = subtype_obj.browse(cr, uid, ref[1],context=context) + if self._name == subtype_browse.res_model: + values['subtype_id']=subtype_browse.id + else: + values['subtype_id']=subtype_browse.id values.update({ 'model': context.get('thread_model', self._name) if thread_id else False, 'res_id': thread_id or False, @@ -628,14 +629,20 @@ class mail_thread(osv.AbstractModel): partner_ids = [user.partner_id.id for user in self.pool.get('res.users').browse(cr, uid, user_ids, context=context)] return self.message_subscribe(cr, uid, ids, partner_ids, context=context) - def message_subscribe(self, cr, uid, ids, partner_ids, context=None): - """ Add partners to the records followers. """ + def message_subscribe(self, cr, uid, ids, partner_ids,subtype_ids = None, context=None): + """ Add partners to the records followers. + :param partner_ids: a list of partner_ids to subscribe + :param return: new value of followers if read_back key in context + """ + self.write(cr, uid, ids, {'message_follower_ids': [(4, pid) for pid in partner_ids]}, context=context) if not subtype_ids: subtype_obj = self.pool.get('mail.message.subtype') - subtype_ids = subtype_obj.search(cr, uid, [('default', '=', 'true'),('model_ids.model', '=', self._name)],context=context) + subtype_ids = subtype_obj.search(cr, uid, [('default', '=', 'true'),('res_model', '=', self._name)],context=context) if subtype_ids: self.message_subscribe_udpate_subtypes(cr, uid, ids, partner_ids, subtype_ids, context=context) - return self.write(cr, uid, ids, {'message_follower_ids': [(4, pid) for pid in partner_ids]}, context=context) + if context and context.get('read_back'): + return [follower.id for thread in self.browse(cr, uid, ids, context=context) for follower in thread.message_follower_ids] + return [] def message_unsubscribe_users(self, cr, uid, ids, user_ids=None, context=None): """ Wrapper on message_subscribe, using users. If user_ids is not @@ -645,8 +652,14 @@ class mail_thread(osv.AbstractModel): return self.message_unsubscribe(cr, uid, ids, partner_ids, context=context) def message_unsubscribe(self, cr, uid, ids, partner_ids, context=None): - """ Remove partners from the records followers. """ - return self.write(cr, uid, ids, {'message_follower_ids': [(3, pid) for pid in partner_ids]}, context=context) + """ Remove partners from the records followers. + :param partner_ids: a list of partner_ids to unsubscribe + :param return: new value of followers if read_back key in context + """ + self.write(cr, uid, ids, {'message_follower_ids': [(3, pid) for pid in partner_ids]}, context=context) + if context and context.get('read_back'): + return [follower.id for thread in self.browse(cr, uid, ids, context=context) for follower in thread.message_follower_ids] + return [] #------------------------------------------------------ # Thread state @@ -679,6 +692,6 @@ class mail_thread(osv.AbstractModel): def message_subscribe_udpate_subtypes(self, cr, uid, ids, user_id, subtype_ids,context=None): followers_obj = self.pool.get('mail.followers') followers_ids = followers_obj.search(cr, uid, [('res_model', '=', self._name), ('res_id', 'in', ids)], context=context) - return followers_obj.write(cr, uid, followers_ids, {'subtype_ids': [(6, 0 , subtype_ids)]}, context = context) #overright or add new one + return followers_obj.write(cr, uid, followers_ids, {'subtype_ids': [(6, 0 , subtype_ids)]}, context = context) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js index 2126d60edf0..b1d62b76a62 100644 --- a/addons/mail/static/src/js/mail_followers.js +++ b/addons/mail/static/src/js/mail_followers.js @@ -33,12 +33,20 @@ openerp_mail_followers = function(session, mail) { }, start: function() { - // use actual_mode property on view to know if the view is in create mode anymore + var self = this; + // NB: all the widget should be modified to check the actual_mode property on view, not use + // any other method to know if the view is in create mode anymore this.view.on("change:actual_mode", this, this._check_visibility); this._check_visibility(); this.fetch_subtype(); + this.$el.find('ul.oe_mail_recthread_subtype').click(function () {self.update_subtype();}) + this.$el.find('button.oe_mail_button_follow').click(function () { self.do_follow(); self.fetch_subtype();}) + .mouseover(function () { $(this).html('Follow').removeClass('oe_mail_button_mouseout').addClass('oe_mail_button_mouseover'); }) + .mouseleave(function () { $(this).html('Not following').removeClass('oe_mail_button_mouseover').addClass('oe_mail_button_mouseout'); }); + this.$el.find('button.oe_mail_button_unfollow').click(function () { self.do_unfollow(); }) + .mouseover(function () { $(this).html('Unfollow').removeClass('oe_mail_button_mouseout').addClass('oe_mail_button_mouseover'); }) + .mouseleave(function () { $(this).html('Following').removeClass('oe_mail_button_mouseover').addClass('oe_mail_button_mouseout'); }); this.reinit(); - this.bind_events(); }, _check_visibility: function() { @@ -46,40 +54,14 @@ openerp_mail_followers = function(session, mail) { if (this.view.get("actual_mode") !== "create"){this.fetch_subtype();} }, + destroy: function () { + this._super.apply(this, arguments); + }, + reinit: function() { this.$el.find('button.oe_mail_button_follow').hide(); this.$el.find('button.oe_mail_button_unfollow').hide(); - }, - - bind_events: function() { - var self = this; - this.$('button.oe_mail_button_unfollow').on('click', function () { self.do_unfollow(); }) - .mouseover(function () { $(this).html('Unfollow').removeClass('oe_mail_button_mouseout').addClass('oe_mail_button_mouseover'); }) - .mouseleave(function () { $(this).html('Following').removeClass('oe_mail_button_mouseover').addClass('oe_mail_button_mouseout'); }); - this.$el.on('click', 'button.oe_mail_button_follow', function () { self.do_follow(); self.fetch_subtype(); }); - this.$el.on('click','ul.oe_mail_recthread_subtype', function () {self.update_subtype();}) - this.$el.on('click', 'button.oe_mail_button_invite', function(event) { - action = { - type: 'ir.actions.act_window', - res_model: 'mail.wizard.invite', - view_mode: 'form', - view_type: 'form', - views: [[false, 'form']], - target: 'new', - context: { - 'default_res_model': self.view.dataset.model, - 'default_res_id': self.view.datarecord.id - }, - } - self.do_action(action, function() { self.read_value(); }); - }); - }, - - read_value: function() { - var self = this; - return this.ds_model.read_ids([this.view.datarecord.id], ['message_follower_ids']).pipe(function (results) { - return results[0].message_follower_ids; - }).pipe(this.proxy('set_value')); + // this.$el.find('ul.oe_mail_recthread_subtype').hide() }, set_value: function(value_) { @@ -89,11 +71,11 @@ openerp_mail_followers = function(session, mail) { this.$el.find('div.oe_mail_recthread_aside').hide(); return; } - return this.fetch_followers(value_ || this.get_value()); + return this.fetch_followers(value_); }, fetch_followers: function (value_) { - return this.ds_follow.call('read', [value_, ['name', 'user_ids']]).pipe(this.proxy('display_followers')); + return this.ds_follow.call('read', [value_ || this.get_value(), ['name', 'user_ids']]).then(this.proxy('display_followers')); }, /** Display the followers, evaluate is_follower directly */ @@ -103,7 +85,7 @@ openerp_mail_followers = function(session, mail) { var node_user_list = this.$el.find('ul.oe_mail_followers_display').empty(); this.$el.find('div.oe_mail_recthread_followers h4').html(this.options.title + ' (' + records.length + ')'); _(records).each(function (record) { - record.avatar_url = mail.ChatterUtils.get_image(self.session, 'res.partner', 'image_small', record.id); + record.avatar_url = mail.ChatterUtils.get_image(self.session.prefix, self.session.session_id, 'res.partner', 'image_small', record.id); $(session.web.qweb.render('mail.followers.partner', {'record': record})).appendTo(node_user_list); }); if (this.message_is_follower) { @@ -149,22 +131,22 @@ openerp_mail_followers = function(session, mail) { }, do_follow: function () { - var context = new session.web.CompoundContext(this.build_context(), {}); - return this.ds_model.call('message_subscribe_users', [[this.view.datarecord.id], undefined, context]).pipe(this.proxy('read_value')); + var context = new session.web.CompoundContext(this.build_context(), {'read_back': true}); + return this.ds_model.call('message_subscribe_users', [[this.view.datarecord.id], undefined, context]).pipe(this.proxy('set_value')); }, //fetch subtype from subtype model fetch_subtype: function () { var self = this - var subtype_object = this.sub_model.call('search', [[['model_ids.model','=',this.view.model]]]); + var subtype_object = this.sub_model.call('search', [[['res_model','=',this.view.model]]]); subtype_object.then(function (subtype_ids){ self.sub_model.call('read', [subtype_ids || self.get_value(),['name', 'default']]).then(self.proxy('display_subtype')); }); }, do_unfollow: function () { - var context = new session.web.CompoundContext(this.build_context(), {}); - return this.ds_model.call('message_unsubscribe_users', [[this.view.datarecord.id], undefined, context]).pipe(this.proxy('read_value')); + var context = new session.web.CompoundContext(this.build_context(), {'read_back': true}); + return this.ds_model.call('message_unsubscribe_users', [[this.view.datarecord.id], undefined, context]).pipe(this.proxy('set_value')); }, }); }; diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py index 5da3456abe9..0ed1d2b38c0 100644 --- a/addons/mail/tests/test_mail.py +++ b/addons/mail/tests/test_mail.py @@ -19,8 +19,6 @@ # ############################################################################## -import tools - from openerp.tests import common from openerp.tools.html_sanitize import html_sanitize @@ -31,7 +29,7 @@ Received: by mail1.openerp.com (Postfix, from userid 10002) From: Sylvie Lelitre Subject: {subject} MIME-Version: 1.0 -Content-Type: multipart/alternative; +Content-Type: multipart/alternative; boundary="----=_Part_4200734_24778174.1344608186754" Date: Fri, 10 Aug 2012 14:16:26 +0000 Message-ID: <1198923581.41972151344608186760.JavaMail@agrolait.com> @@ -54,9 +52,9 @@ Content-Transfer-Encoding: quoted-printable =20 =20 - +

          Please call me as soon as possible this afternoon!

          - +

          --
          Sylvie

          @@ -84,42 +82,15 @@ Sylvie """ -class TestMailMockups(common.TransactionCase): +class test_mail(common.TransactionCase): def _mock_smtp_gateway(self, *args, **kwargs): return True - def _init_mock_build_email(self): - self._build_email_args_list = [] - self._build_email_kwargs_list = [] - def _mock_build_email(self, *args, **kwargs): - self._build_email_args_list.append(args) - self._build_email_kwargs_list.append(kwargs) - return self._build_email(*args, **kwargs) - - def setUp(self): - super(TestMailMockups, self).setUp() - # Install mock SMTP gateway - self._init_mock_build_email() - self._build_email = self.registry('ir.mail_server').build_email - self.registry('ir.mail_server').build_email = self._mock_build_email - self._send_email = self.registry('ir.mail_server').send_email - self.registry('ir.mail_server').send_email = self._mock_smtp_gateway - - def tearDown(self): - # Remove mocks - self.registry('ir.mail_server').build_email = self._build_email - self.registry('ir.mail_server').send_email = self._send_email - super(TestMailMockups, self).tearDown() - - -class test_mail(TestMailMockups): - - def _mock_send_get_mail_body(self, *args, **kwargs): - # def _send_get_mail_body(self, cr, uid, mail, partner=None, context=None) - body = tools.append_content_to_html(args[2].body_html, kwargs.get('partner').name if kwargs.get('partner') else 'No specific partner') - return body + self._build_email_args = args + self._build_email_kwargs = kwargs + return self.build_email_real(*args, **kwargs) def setUp(self): super(test_mail, self).setUp() @@ -135,9 +106,10 @@ class test_mail(TestMailMockups): self.res_users = self.registry('res.users') self.res_partner = self.registry('res.partner') - # Mock send_get_mail_body to test its functionality without other addons override - self._send_get_mail_body = self.registry('mail.mail').send_get_mail_body - self.registry('mail.mail').send_get_mail_body = self._mock_send_get_mail_body + # Install mock SMTP gateway + self.build_email_real = self.registry('ir.mail_server').build_email + self.registry('ir.mail_server').build_email = self._mock_build_email + self.registry('ir.mail_server').send_email = self._mock_smtp_gateway # groups@.. will cause the creation of new mail groups self.mail_group_model_id = self.ir_model.search(self.cr, self.uid, [('model', '=', 'mail.group')])[0] @@ -147,11 +119,6 @@ class test_mail(TestMailMockups): self.group_pigs_id = self.mail_group.create(self.cr, self.uid, {'name': 'Pigs', 'description': 'Fans of Pigs, unite !'}) - def tearDown(self): - # Remove mocks - self.registry('mail.mail').send_get_mail_body = self._send_get_mail_body - super(test_mail, self).tearDown() - def test_00_message_process(self): cr, uid = self.cr, self.uid # Incoming mail creates a new mail_group "frogs" @@ -187,7 +154,7 @@ class test_mail(TestMailMockups): test_msg_id = '' mail_text = MAIL_TEMPLATE_PLAINTEXT.format(to='groups@example.com', subject='frogs', extra='', msg_id=test_msg_id) self.mail_thread.message_process(cr, uid, None, mail_text) - new_mail = self.mail_message.browse(cr, uid, self.mail_message.search(cr, uid, [('message_id', '=', test_msg_id)])[0]) + new_mail = self.mail_message.browse(cr, uid, self.mail_message.search(cr, uid, [('message_id','=',test_msg_id)])[0]) self.assertEqual(new_mail.body, '\n

          \nPlease call me as soon as possible this afternoon!\n\n--\nSylvie\n
          \n', 'plaintext mail incorrectly parsed') @@ -308,20 +275,18 @@ class test_mail(TestMailMockups): _attachments = [('First', 'My first attachment'), ('Second', 'My second attachment')] # CASE1: post comment, body and subject specified - self._init_mock_build_email() msg_id = self.mail_group.message_post(cr, uid, self.group_pigs_id, body=_body1, subject=_subject, type='comment') message = self.mail_message.browse(cr, uid, msg_id) - sent_emails = self._build_email_kwargs_list + sent_email = self._build_email_kwargs # Test: notifications have been deleted self.assertFalse(self.mail_mail.search(cr, uid, [('mail_message_id', '=', msg_id)]), 'mail.mail notifications should have been auto-deleted!') # Test: mail_message: subject is _subject, body is _body1 (no formatting done) self.assertEqual(message.subject, _subject, 'mail.message subject incorrect') self.assertEqual(message.body, _body1, 'mail.message body incorrect') - # Test: sent_email: email send by server: correct subject, body, body_alternative - for sent_email in sent_emails: - self.assertEqual(sent_email['subject'], _subject, 'sent_email subject incorrect') - self.assertEqual(sent_email['body'], _mail_body1 + '\n
          Bert Tartopoils
          \n', 'sent_email body incorrect') - self.assertEqual(sent_email['body_alternative'], _mail_bodyalt1 + '\nBert Tartopoils', 'sent_email body_alternative is incorrect') + # Test: sent_email: email send by server: correct subject, body; body_alternative + self.assertEqual(sent_email['subject'], _subject, 'sent_email subject incorrect') + self.assertEqual(sent_email['body'], _mail_body1, 'sent_email body incorrect') + self.assertEqual(sent_email['body_alternative'], _mail_bodyalt1, 'sent_email body_alternative is incorrect') # Test: mail_message: partner_ids = group followers message_pids = set([partner.id for partner in message.partner_ids]) test_pids = set([p_a_id, p_b_id, p_c_id]) @@ -331,16 +296,14 @@ class test_mail(TestMailMockups): notif_pids = set([notif.partner_id.id for notif in self.mail_notification.browse(cr, uid, notif_ids)]) self.assertEqual(notif_pids, test_pids, 'mail.message notification partners incorrect') # Test: sent_email: email_to should contain b@b, not c@c (pref email), not a@a (writer) - for sent_email in sent_emails: - self.assertEqual(sent_email['email_to'], ['b@b'], 'sent_email email_to is incorrect') + self.assertEqual(sent_email['email_to'], ['b@b'], 'sent_email email_to is incorrect') # CASE2: post an email with attachments, parent_id, partner_ids # TESTS: automatic subject, signature in body_html, attachments propagation - self._init_mock_build_email() msg_id2 = self.mail_group.message_post(cr, uid, self.group_pigs_id, body=_body2, type='email', partner_ids=[(6, 0, [p_d_id])], parent_id=msg_id, attachments=_attachments) message = self.mail_message.browse(cr, uid, msg_id2) - sent_emails = self._build_email_kwargs_list + sent_email = self._build_email_kwargs self.assertFalse(self.mail_mail.search(cr, uid, [('mail_message_id', '=', msg_id2)]), 'mail.mail notifications should have been auto-deleted!') # Test: mail_message: subject is False, body is _body2 (no formatting done), parent_id is msg_id @@ -348,11 +311,9 @@ class test_mail(TestMailMockups): self.assertEqual(message.body, html_sanitize(_body2), 'mail.message body incorrect') self.assertEqual(message.parent_id.id, msg_id, 'mail.message parent_id incorrect') # Test: sent_email: email send by server: correct subject, body, body_alternative - self.assertEqual(len(sent_emails), 2, 'sent_email number of sent emails incorrect') - for sent_email in sent_emails: - self.assertEqual(sent_email['subject'], _mail_subject, 'sent_email subject incorrect') - self.assertIn(_mail_body2, sent_email['body'], 'sent_email body incorrect') - self.assertIn(_mail_bodyalt2, sent_email['body_alternative'], 'sent_email body_alternative incorrect') + self.assertEqual(sent_email['subject'], _mail_subject, 'sent_email subject incorrect') + self.assertEqual(sent_email['body'], _mail_body2, 'sent_email body incorrect') + self.assertEqual(sent_email['body_alternative'], _mail_bodyalt2, 'sent_email body_alternative incorrect') # Test: mail_message: partner_ids = group followers message_pids = set([partner.id for partner in message.partner_ids]) test_pids = set([p_a_id, p_b_id, p_c_id, p_d_id]) @@ -362,8 +323,7 @@ class test_mail(TestMailMockups): notif_pids = set([notif.partner_id.id for notif in self.mail_notification.browse(cr, uid, notif_ids)]) self.assertEqual(notif_pids, test_pids, 'mail.message notification partners incorrect') # Test: sent_email: email_to should contain b@b, c@c, not a@a (writer) - for sent_email in sent_emails: - self.assertTrue(set(sent_email['email_to']).issubset(set(['b@b', 'c@c'])), 'sent_email email_to incorrect') + self.assertEqual(set(sent_email['email_to']), set(['b@b', 'c@c']), 'sent_email email_to incorrect') # Test: attachments for attach in message.attachment_ids: self.assertEqual(attach.res_model, 'mail.group', 'mail.message attachment res_model incorrect') @@ -450,14 +410,12 @@ class test_mail(TestMailMockups): self.assertEqual(compose.content_subtype, 'html', 'mail.compose.message incorrect content_subtype') # 2. Post the comment, get created message - parent_id = message.id mail_compose.send_mail(cr, uid, [compose_id]) group_pigs.refresh() message = group_pigs.message_ids[0] - # Test: mail.message: subject as Re:.., body in html, parent_id + # Test: mail.message: subject as Re:.., body in html self.assertEqual(message.subject, _msg_reply, 'mail.message incorrect subject') self.assertIn('Administrator wrote:
          Pigs rules
          ', message.body, 'mail.message body is incorrect') - self.assertEqual(message.parent_id and message.parent_id.id, parent_id, 'mail.message parent_id incorrect') # Test: mail.message: attachments for attach in message.attachment_ids: self.assertEqual(attach.res_model, 'mail.group', 'mail.message attachment res_model incorrect') @@ -501,7 +459,6 @@ class test_mail(TestMailMockups): # It will be updated as soon as we have fixed specs ! cr, uid = self.cr, self.uid group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id) - def _compare_structures(struct1, struct2, n=0): # print '%scompare structure' % ('\t' * n) self.assertEqual(len(struct1), len(struct2), 'message_read structure number of childs incorrect') @@ -673,10 +630,10 @@ class test_mail(TestMailMockups): _mail_bodyalt2 = 'Pigs rules\nAdmin\n' filter_subtype_id = self.mail_message_subtype.search(cr, uid, [('default','=',True)]) # Post comment with body and subject, comment preference - msg_id = self.mail_group.message_post(cr, uid, [self.group_pigs_id], body=_body1, subject=_subject, type='comment',subtype='email') + msg_id = self.mail_group.message_post(cr, uid, [self.group_pigs_id], body=_body1, subject=_subject, type='comment',subtype_xml_id='mail_subtype_comment') notif_ids = self.mail_notification.search(cr, uid, [('message_id', '=', msg_id)]) self.assertTrue(len(notif_ids) >= 1,"subtype is email and show notification on wall") # New post: test automatic subject, signature in html, add a partner, email preference, parent_id previous message - msg_id2 = self.mail_group.message_post(cr, uid, [self.group_pigs_id], body=_body2,subject=_subject, type='email', subtype='other') - notif_ids2 = self.mail_notification.search(cr, uid, [('message_id', '=', msg_id2)]) - self.assertTrue(len(notif_ids2) == 0,"subtype is false cannot show notification on wall") +# msg_id2 = self.mail_group.message_post(cr, uid, [self.group_pigs_id], body=_body2,subject=_subject, type='email', subtype='other') +# notif_ids2 = self.mail_notification.search(cr, uid, [('message_id', '=', msg_id2)]) +# self.assertTrue(len(notif_ids2) == 0,"subtype is false cannot show notification on wall") From 9b35e601fdccca7232ce4b32d2b829579a98ea8a Mon Sep 17 00:00:00 2001 From: "Mayur Maheshwari (OpenERP)" Date: Wed, 12 Sep 2012 16:53:42 +0530 Subject: [PATCH 206/581] [IMP]hr_payroll :improve domain bzr revid: mma@tinyerp.com-20120912112342-crdvwjejig5xuhx6 --- addons/hr_payroll/hr_payroll_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hr_payroll/hr_payroll_view.xml b/addons/hr_payroll/hr_payroll_view.xml index 27b82385036..71cdab50b7c 100644 --- a/addons/hr_payroll/hr_payroll_view.xml +++ b/addons/hr_payroll/hr_payroll_view.xml @@ -234,7 +234,7 @@ - + From 7cc4c99f84c893732ba4a0e1b15ddd1f70d9594b Mon Sep 17 00:00:00 2001 From: "Ajay Chauhan (OpenERP)" Date: Wed, 12 Sep 2012 17:25:28 +0530 Subject: [PATCH 207/581] [FIX] project_long_term: filtered phases with project_id on task form lp bug: https://launchpad.net/bugs/1048959 fixed bzr revid: cha@tinyerp.com-20120912115528-hjjt04o9we2fzea5 --- addons/project_long_term/project_long_term.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index 2eab5fa6ac6..12206c930eb 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -292,7 +292,7 @@ account_analytic_account() class project_task(osv.osv): _inherit = "project.task" _columns = { - 'phase_id': fields.many2one('project.phase', 'Project Phase'), + 'phase_id': fields.many2one('project.phase', 'Project Phase', domain="[('project_id', '=', project_id)]"), } project_task() From 6f0b8abe3159831e67434c5938bc867a98b462dd Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 11:05:40 +0530 Subject: [PATCH 208/581] [IMP]account,project,project_issue: changed as per new spec bzr revid: sgo@tinyerp.com-20120913053540-atfsrw8bkf16qo3t --- addons/account/account_invoice.py | 33 ++++++------- addons/account/data/account_data.xml | 26 +++++----- addons/account_voucher/account_voucher.py | 8 ++-- .../account_voucher/account_voucher_data.xml | 21 +++------ addons/analytic/analytic.py | 18 ++++++- addons/base_status/base_stage.py | 14 +++++- addons/project/project.py | 21 ++++----- addons/project/project_data.xml | 47 ++++++++++--------- addons/project_issue/project_issue.py | 4 +- addons/project_issue/project_issue_data.xml | 25 ++++------ 10 files changed, 109 insertions(+), 108 deletions(-) diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index 9dcbd877c67..8a7251b3856 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -395,23 +395,18 @@ class account_invoice(osv.osv): template_id = template and template[1] or False res = mod_obj.get_object_reference(cr, uid, 'mail', 'email_compose_message_wizard_form') res_id = res and res[1] or False - ctx = dict(context) - ctx.update({ - 'default_model': 'account.invoice', - 'default_res_id': ids[0], - 'default_use_template': True, - 'default_template_id': template_id, - }) + ctx = dict(context, active_model='account.invoice', active_id=ids[0]) + ctx.update({'mail.compose.template_id': template_id}) return { - 'view_type': 'form', - 'view_mode': 'form', - 'res_model': 'mail.compose.message', - 'views': [(res_id, 'form')], - 'view_id': res_id, - 'type': 'ir.actions.act_window', - 'target': 'new', - 'context': ctx, - 'nodestroy': True, + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'mail.compose.message', + 'views': [(res_id, 'form')], + 'view_id': res_id, + 'type': 'ir.actions.act_window', + 'target': 'new', + 'context': ctx, + 'nodestroy': True, } def confirm_paid(self, cr, uid, ids, context=None): @@ -1306,15 +1301,15 @@ class account_invoice(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id],body=_("%s created.") % (self._get_document_type(obj.type)), subtype="new", context=context) + self.message_post(cr, uid, [obj.id],body=_("%s created.") % (self._get_document_type(obj.type)), subtype_xml_id="analytic_subtype_new", context=context) def confirm_paid_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("%s paid.") % (self._get_document_type(obj.type)), subtype="paid", context=context) + self.message_post(cr, uid, [obj.id], body=_("%s paid.") % (self._get_document_type(obj.type)), subtype_xml_id="invoice_subtype_paid", context=context) def invoice_cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("%s cancelled.") % (self._get_document_type(obj.type)), subtype="cancelled", context=context) + self.message_post(cr, uid, [obj.id], body=_("%s cancelled.") % (self._get_document_type(obj.type)), subtype_xml_id="invoice_subtype_cancelled", context=context) account_invoice() class account_invoice_line(osv.osv): diff --git a/addons/account/data/account_data.xml b/addons/account/data/account_data.xml index bf3b3152552..22849a9b886 100644 --- a/addons/account/data/account_data.xml +++ b/addons/account/data/account_data.xml @@ -560,28 +560,24 @@ Invoice account.invoice
          - + new - + account.analytic.account - + + new + account.invoice + + + paid - + account.invoice - + cancelled - + account.invoice - - - - - - - - - diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index ae670b3d0b7..d2976882981 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -1045,8 +1045,6 @@ class account_voucher(osv.osv): # if the amount encoded in voucher is equal to the amount unreconciled, we need to compute the # currency rate difference if line.amount == line.amount_unreconciled: - if not line.move_line_id.amount_residual: - raise osv.except_osv(_('Wrong bank statement line'),_("You have to delete the bank statement line which the payment was reconciled to manually. Please check the payment of the partner %s by the amount of %s.")%(line.voucher_id.partner_id.name, line.voucher_id.amount)) currency_rate_difference = line.move_line_id.amount_residual - amount else: currency_rate_difference = 0.0 @@ -1295,17 +1293,17 @@ class account_voucher(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): message = "%s created." % self._document_type[obj.type or False] - self.message_post(cr, uid, [obj.id], body=message, subtype="new", context=context) + self.message_post(cr, uid, [obj.id], body=message, subtype_xml_id="voucher_subtype_new", context=context) def post_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): message = "%s '%s' is posted." % (self._document_type[obj.type or False], obj.move_id.name) - self.message_post(cr, uid, [obj.id], body=message, subtype="post", context=context) + self.message_post(cr, uid, [obj.id], body=message, subtype_xml_id="voucher_subtype_post", context=context) def reconcile_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): message = "%s reconciled." % self._document_type[obj.type or False] - self.message_post(cr, uid, [obj.id], body=message, subtype="reconcile", context=context) + self.message_post(cr, uid, [obj.id], body=message, subtype_xml_id="voucher_subtype_reconcile", context=context) account_voucher() diff --git a/addons/account_voucher/account_voucher_data.xml b/addons/account_voucher/account_voucher_data.xml index a99a8735842..dd46a83777e 100644 --- a/addons/account_voucher/account_voucher_data.xml +++ b/addons/account_voucher/account_voucher_data.xml @@ -13,27 +13,18 @@ If you want to use advanced accounting features, you should install the "Account Module eInvoicing & Payments has been installed.
          - - + + account.voucher - + post - + account.voucher - + reconcile - + account.voucher - - - - - - - - - diff --git a/addons/analytic/analytic.py b/addons/analytic/analytic.py index a44fcb01653..776df713b4e 100644 --- a/addons/analytic/analytic.py +++ b/addons/analytic/analytic.py @@ -96,6 +96,22 @@ class account_analytic_account(osv.osv): res[row['id']][field] = row[field] return self._compute_level_tree(cr, uid, ids, child_ids, res, fields, context) + def name_get(self, cr, uid, ids, context=None): + if isinstance(ids, (int, long)): + ids=[ids] + if not ids: + return [] + res = [] + for account in self.browse(cr, uid, ids, context=context): + data = [] + acc = account + while acc: + data.insert(0, acc.name) + acc = acc.parent_id + data = ' / '.join(data) + res.append((account.id, data)) + return res + def _complete_name_calc(self, cr, uid, ids, prop, unknow_none, unknow_dict): res = self.name_get(cr, uid, ids) return dict(res) @@ -281,7 +297,7 @@ class account_analytic_account(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("Contract for %s has been created.") % (obj.partner_id.name), subtype="new", context=context) + self.message_post(cr, uid, [obj.id], body=_("Contract for %s has been created.") % (obj.partner_id.name), subtype_xml_id="analytic_subtype_new", context=context) account_analytic_account() diff --git a/addons/base_status/base_stage.py b/addons/base_status/base_stage.py index 9bb2764d8bd..f72168cde46 100644 --- a/addons/base_status/base_stage.py +++ b/addons/base_status/base_stage.py @@ -362,17 +362,27 @@ class base_stage(object): msg = _('%s has been opened.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context)) self.message_post(cr, uid, [id], body=msg, context=context) return True + + def find_xml_id(self,cr,uid,ids,name,context=None): + subtype_obj = self.pool.get('mail.message.subtype') + irmodel_obj = self.pool.get('ir.model.data') + subtype_id = subtype_obj.search(cr,uid,[('res_model','=',self._name),('name','=',name)]) + ir_ids = irmodel_obj.search(cr,uid,[('model','=','mail.message.subtype'),('res_id','=',subtype_id)]) + ir_model_browse = irmodel_obj.browse(cr,uid,ir_ids) + return ir_model_browse.name def case_close_send_note(self, cr, uid, ids, context=None): for id in ids: msg = _('%s has been closed.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context)) - self.message_post(cr, uid, [id], body=msg, subtype="closed", context=context) + xml_id = self.find_xml_id(cr, uid, ids, name="closed", context) + self.message_post(cr, uid, [id], body=msg, subtype_xml_id=xml_id, context=context) return True def case_cancel_send_note(self, cr, uid, ids, context=None): for id in ids: msg = _('%s has been cancelled.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context)) - self.message_post(cr, uid, [id], body=msg, subtype="cancelled", context=context) + xml_id = self.find_xml_id(cr, uid, ids, name="cancelled", context) + self.message_post(cr, uid, [id], body=msg, subtype_xml_id=xml_id, context=context) return True def case_pending_send_note(self, cr, uid, ids, context=None): diff --git a/addons/project/project.py b/addons/project/project.py index e1dea8e70c5..412e14fd8fd 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -41,9 +41,8 @@ class project_task_type(osv.osv): 'case_default': fields.boolean('Common to All Projects', help="If you check this field, this stage will be proposed by default on each new project. It will not assign this stage to existing projects."), 'project_ids': fields.many2many('project.project', 'project_task_type_rel', 'type_id', 'project_id', 'Projects'), - 'state': fields.selection(_TASK_STATE, 'Related Status', required=True, - help="The status of your document is automatically changed regarding the selected stage. " \ - "For example, if a stage is related to the status 'Close', when your document reaches this stage, it is automatically closed."), + 'state': fields.selection(_TASK_STATE, 'State', required=True, + help="The related state for the stage. The state of your document will automatically change regarding the selected stage. Example, a stage is related to the state 'Close', when your document reach this stage, it will be automatically closed."), 'fold': fields.boolean('Hide in views if empty', help="This stage is not visible, for example in status bar or kanban view, when there are no records in that stage to display."), } @@ -514,23 +513,23 @@ def Project(): return project_id def create_send_note(self, cr, uid, ids, context=None): - return self.message_post(cr, uid, ids, body=_("Project has been created."), subtype="new", context=context) + return self.message_post(cr, uid, ids, body=_("Project has been created."), subtype_xml_id="project_subtype_new", context=context) def set_open_send_note(self, cr, uid, ids, context=None): message = _("Project has been opened.") - return self.message_post(cr, uid, ids, body=message, subtype="open", context=context) + return self.message_post(cr, uid, ids, body=message, subtype_xml_id="project_subtype_open", context=context) def set_pending_send_note(self, cr, uid, ids, context=None): message = _("Project is now pending.") - return self.message_post(cr, uid, ids, body=message, subtype="pending", context=context) + return self.message_post(cr, uid, ids, body=message, subtype_xml_id="project_subtype_pending", context=context) def set_cancel_send_note(self, cr, uid, ids, context=None): message = _("Project has been cancelled.") - return self.message_post(cr, uid, ids, body=message, subtype="cancelled", context=context) + return self.message_post(cr, uid, ids, body=message, subtype_xml_id="project_subtype_cancelled", context=context) def set_close_send_note(self, cr, uid, ids, context=None): message = _("Project has been closed.") - return self.message_post(cr, uid, ids, body=message, subtype="closed", context=context) + return self.message_post(cr, uid, ids, body=message, subtype_xml_id="project_subtype_closed", context=context) def write(self, cr, uid, ids, vals, context=None): # if alias_model has been changed, update alias_model_id accordingly @@ -728,7 +727,7 @@ class task(base_stage, osv.osv): When the case is over, the state is set to \'Done\'.\ If the case needs to be reviewed then the state is \ set to \'Pending\'.'), - 'categ_ids': fields.many2many('project.category', string='Tags'), + 'categ_ids': fields.many2many('project.category', string='Categories'), 'kanban_state': fields.selection([('normal', 'Normal'),('blocked', 'Blocked'),('done', 'Ready To Pull')], 'Kanban State', help="A task's kanban state indicates special situations affecting it:\n" " * Normal is the default situation\n" @@ -1231,10 +1230,10 @@ class task(base_stage, osv.osv): def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Override of the (void) default notification method. """ stage_name = self.pool.get('project.task.type').name_get(cr, uid, [stage_id], context=context)[0][1] - return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), subtype="stage change", context=context) + return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), subtype_xml_id="task_subtype_stage_change", context=context) def create_send_note(self, cr, uid, ids, context=None): - return self.message_post(cr, uid, ids, body=_("Task has been created."), subtype="new", context=context) + return self.message_post(cr, uid, ids, body=_("Task has been created."), subtype_xml_id="task_subtype_new", context=context) def case_draft_send_note(self, cr, uid, ids, context=None): msg = _('Task has been set as draft.') diff --git a/addons/project/project_data.xml b/addons/project/project_data.xml index 34608d3abeb..0544b6d4e78 100644 --- a/addons/project/project_data.xml +++ b/addons/project/project_data.xml @@ -85,43 +85,48 @@ - + new - + project.project - + + new + project.task + + + open - + project.project - + pending - + project.project - + closed - + project.project - + + closed + project.task + + cancelled - + project.project - + + cancelled + project.task + + + stage change - + project.task - - - - - - - - - diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index d3f47ba9b3e..83eddb83d5e 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -503,7 +503,7 @@ class project_issue(base_stage, osv.osv): def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Override of the (void) default notification method. """ stage_name = self.pool.get('project.task.type').name_get(cr, uid, [stage_id], context=context)[0][1] - return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), subtype="stage change", context=context) + return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), subtype_xml_id="issue_subtype_stage_change", context=context) def case_get_note_msg_prefix(self, cr, uid, id, context=None): """ Override of default prefix for notifications. """ @@ -515,7 +515,7 @@ class project_issue(base_stage, osv.osv): def create_send_note(self, cr, uid, ids, context=None): message = _("Project issue created.") - return self.message_post(cr, uid, ids, body=message, subtype="new", context=context) + return self.message_post(cr, uid, ids, body=message, subtype_xml_id="issue_subtype_new", context=context) def case_escalate_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): diff --git a/addons/project_issue/project_issue_data.xml b/addons/project_issue/project_issue_data.xml index 6ee704c6b39..f6c225a4d00 100644 --- a/addons/project_issue/project_issue_data.xml +++ b/addons/project_issue/project_issue_data.xml @@ -32,33 +32,24 @@ - + new - + project.issue - + stage change - + project.issue - + cancelled - + project.issue - + closed - - - - - - - - - - + project.issue From 8ca3f76711df87f17e2514dec84f63b82fee2ab7 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 11:59:28 +0530 Subject: [PATCH 209/581] [IMP]code improvement and other minor changes bzr revid: sgo@tinyerp.com-20120913062928-hvqnp116y49yrl4d --- addons/account/data/account_data.xml | 6 +----- addons/analytic/__openerp__.py | 3 ++- addons/analytic/analytic_data.xml | 10 ++++++++++ addons/base_status/base_stage.py | 11 +++++++---- addons/crm/crm_lead_data.xml | 5 +++++ 5 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 addons/analytic/analytic_data.xml diff --git a/addons/account/data/account_data.xml b/addons/account/data/account_data.xml index 22849a9b886..7689ca2c253 100644 --- a/addons/account/data/account_data.xml +++ b/addons/account/data/account_data.xml @@ -560,11 +560,7 @@ Invoice account.invoice - - new - account.analytic.account - - + new account.invoice diff --git a/addons/analytic/__openerp__.py b/addons/analytic/__openerp__.py index 10762a1d2be..d90b2fd62ac 100644 --- a/addons/analytic/__openerp__.py +++ b/addons/analytic/__openerp__.py @@ -38,7 +38,8 @@ that have no counterpart in the general financial accounts. 'security/analytic_security.xml', 'security/ir.model.access.csv', 'analytic_sequence.xml', - 'analytic_view.xml' + 'analytic_view.xml', + 'analytic_data.xml' ], 'demo': [], 'installable': True, diff --git a/addons/analytic/analytic_data.xml b/addons/analytic/analytic_data.xml new file mode 100644 index 00000000000..cfd3b5e9b78 --- /dev/null +++ b/addons/analytic/analytic_data.xml @@ -0,0 +1,10 @@ + + + + + new + account.analytic.account + + + + \ No newline at end of file diff --git a/addons/base_status/base_stage.py b/addons/base_status/base_stage.py index f72168cde46..4b1cc3c6946 100644 --- a/addons/base_status/base_stage.py +++ b/addons/base_status/base_stage.py @@ -367,21 +367,24 @@ class base_stage(object): subtype_obj = self.pool.get('mail.message.subtype') irmodel_obj = self.pool.get('ir.model.data') subtype_id = subtype_obj.search(cr,uid,[('res_model','=',self._name),('name','=',name)]) - ir_ids = irmodel_obj.search(cr,uid,[('model','=','mail.message.subtype'),('res_id','=',subtype_id)]) + ir_ids = irmodel_obj.search(cr,uid,[('model','=','mail.message.subtype'),('res_id','in',subtype_id)]) + xml_id = False ir_model_browse = irmodel_obj.browse(cr,uid,ir_ids) - return ir_model_browse.name + if ir_model_browse: + xml_id = ir_model_browse[0].name + return xml_id def case_close_send_note(self, cr, uid, ids, context=None): for id in ids: msg = _('%s has been closed.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context)) - xml_id = self.find_xml_id(cr, uid, ids, name="closed", context) + xml_id = self.find_xml_id(cr, uid, ids, name="closed", context=context) self.message_post(cr, uid, [id], body=msg, subtype_xml_id=xml_id, context=context) return True def case_cancel_send_note(self, cr, uid, ids, context=None): for id in ids: msg = _('%s has been cancelled.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context)) - xml_id = self.find_xml_id(cr, uid, ids, name="cancelled", context) + xml_id = self.find_xml_id(cr, uid, ids, name="cancelled", context=context) self.message_post(cr, uid, [id], body=msg, subtype_xml_id=xml_id, context=context) return True diff --git a/addons/crm/crm_lead_data.xml b/addons/crm/crm_lead_data.xml index 252e843cf30..633782ed233 100644 --- a/addons/crm/crm_lead_data.xml +++ b/addons/crm/crm_lead_data.xml @@ -174,5 +174,10 @@ crm.lead + + cancelled + crm.lead + + From 296ae6e24baa8918331d57c7c8e21b21a82cb4bc Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 12:11:01 +0530 Subject: [PATCH 210/581] [IMP]event:changed in event module as per new spec bzr revid: sgo@tinyerp.com-20120913064101-85pfg3kbbqnoufzx --- addons/event/event.py | 20 +++++++++---------- addons/event/event_data.xml | 39 ++++++++++++++++++++++++++----------- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/addons/event/event.py b/addons/event/event.py index 8c755456d9c..82c0390ee03 100644 --- a/addons/event/event.py +++ b/addons/event/event.py @@ -287,27 +287,27 @@ class event_event(osv.osv): def create_send_note(self, cr, uid, ids, context=None): message = _("Event has been created.") - self.message_post(cr, uid, ids, body=message, subtype="new", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="event_subtype_new", context=context) return True def button_cancel_send_note(self, cr, uid, ids, context=None): message = _("Event has been cancelled.") - self.message_post(cr, uid, ids, body=message, subtype="cancelled", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="event_subtype_cancelled", context=context) return True def button_draft_send_note(self, cr, uid, ids, context=None): message = _("Event has been set to draft.") - self.message_post(cr, uid, ids, body=message, subtype="new", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="event_subtype_new", context=context) return True def button_done_send_note(self, cr, uid, ids, context=None): message = _("Event has been done.") - self.message_post(cr, uid, ids, body=message, subtype="closed", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="event_subtype_closed", context=context) return True def button_confirm_send_note(self, cr, uid, ids, context=None): message = _("Event has been confirmed.") - self.message_post(cr, uid, ids, body=message, subtype="confirmed", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="event_subtype_confirmed", context=context) return True event_event() @@ -353,7 +353,7 @@ class event_registration(osv.osv): return self.write(cr, uid, ids, {'state': 'draft'}, context=context) def confirm_registration(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_('State set to open'), context=context) + self.message_post(cr, uid, ids, body=_('State set to open'),subtype_xml_id="registration_subtype_confirmed", context=context) return self.write(cr, uid, ids, {'state': 'open'},context=context) def create(self, cr, uid, vals, context=None): @@ -383,13 +383,13 @@ class event_registration(osv.osv): if today >= registration.event_id.date_begin: values = {'state': 'done', 'date_closed': today} self.write(cr, uid, ids, values) - self.message_post(cr, uid, ids, body=_('State set to Done'), subtype="closed", context=context) + self.message_post(cr, uid, ids, body=_('State set to Done'), subtype_xml_id="registration_subtype_closed", context=context) else: raise osv.except_osv(_('Error!'),_("You must wait for the starting day of the event to do this action.") ) return True def button_reg_cancel(self, cr, uid, ids, context=None, *args): - self.message_post(cr, uid, ids, body=_('State set to Cancel'), subtype="cancelled", context=context) + self.message_post(cr, uid, ids, body=_('State set to Cancel'), subtype_xml_id="registration_subtype_cancelled", context=context) return self.write(cr, uid, ids, {'state': 'cancel'}) def mail_user(self, cr, uid, ids, context=None): @@ -459,12 +459,12 @@ class event_registration(osv.osv): def create_send_note(self, cr, uid, ids, context=None): message = _("Registration has been created.") - self.message_post(cr, uid, ids, body=message, subtype="new", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="registration_subtype_new", context=context) return True def do_draft_send_note(self, cr, uid, ids, context=None): message = _("Registration has been set as draft.") - self.message_post(cr, uid, ids, body=message, subtype="new", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="registration_subtype_new", context=context) return True event_registration() diff --git a/addons/event/event_data.xml b/addons/event/event_data.xml index 608dcdb4e8f..814fd0b179c 100644 --- a/addons/event/event_data.xml +++ b/addons/event/event_data.xml @@ -12,34 +12,51 @@ automatic 100 - + + new + event.event - + closed + event.event - + cancelled + event.event - + confirmed + event.event - - - - - + + + + new + event.registration + - - + + closed + event.registration + + cancelled + event.event + + + + confirmed + event.registration + + From 66e8595b01b0c1d38190b1222d0955b710b6c1db Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 12:28:54 +0530 Subject: [PATCH 211/581] [IMP]changed in all hr module for subtype bzr revid: sgo@tinyerp.com-20120913065854-7y5jkls3q2jebduv --- addons/hr_holidays/hr_holidays.py | 6 ++-- addons/hr_holidays/hr_holidays_data.xml | 21 ++++---------- addons/hr_recruitment/hr_recruitment.py | 14 ++++----- addons/hr_recruitment/hr_recruitment_data.xml | 29 +++++++------------ .../hr_timesheet_invoice.py | 8 ++--- .../hr_timesheet_invoice_data.xml | 25 +++++----------- 6 files changed, 38 insertions(+), 65 deletions(-) diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index 4136abbb2f7..4e85313e2e4 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -364,7 +364,7 @@ class hr_holidays(osv.osv): def create_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): self.message_post(cr, uid, ids, - _("The request has been created and is waiting confirmation."),subtype="new", context=context) + _("The request has been created and is waiting confirmation."),subtype_xml_id="hr_holidays_subtype_new", context=context) return True def holidays_confirm_notificate(self, cr, uid, ids, context=None): @@ -384,12 +384,12 @@ class hr_holidays(osv.osv): _("The request has been double validated. The validation process is now over."), context=context) else: self.message_post(cr, uid, [obj.id], - _("The request has been approved. The validation process is now over."), subtype="approved", context=context) + _("The request has been approved. The validation process is now over."), subtype_xml_id="hr_holidays_subtype_approved", context=context) def holidays_refuse_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids): self.message_post(cr, uid, [obj.id], - _("The request has been refused. The validation process is now over."), subtype="refused", context=context) + _("The request has been refused. The validation process is now over."), subtype_xml_id="hr_holidays_subtype_refused", context=context) class resource_calendar_leaves(osv.osv): diff --git a/addons/hr_holidays/hr_holidays_data.xml b/addons/hr_holidays/hr_holidays_data.xml index ad337b72c62..8ddfb79a527 100644 --- a/addons/hr_holidays/hr_holidays_data.xml +++ b/addons/hr_holidays/hr_holidays_data.xml @@ -50,28 +50,19 @@ Once validated, they are visible in the employee's calendar. HR officers can def brown - + new - + hr.holidays - + approved - + hr.holidays - + refused - + hr.holidays - - - - - - - - - diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index 25be4f3c3f1..6d38c4e4e08 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -461,14 +461,14 @@ class hr_applicant(base_stage, osv.Model): """ Override of the (void) default notification method. """ if not stage_id: return True stage_name = self.pool.get('hr.recruitment.stage').name_get(cr, uid, [stage_id], context=context)[0][1] - return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), subtype="stage change", context=context) + return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), subtype_xml_id="hr_recruitment_subtype_stage_change", context=context) def case_get_note_msg_prefix(self, cr, uid, id, context=None): return 'Applicant' def case_open_send_note(self, cr, uid, ids, context=None): message = _("Applicant has been set in progress.") - return self.message_post(cr, uid, ids, body=message, subtype="in progress", context=context) + return self.message_post(cr, uid, ids, body=message, subtype_xml_id="hr_recruitment_subtype_in_progress", context=context) def case_close_send_note(self, cr, uid, ids, context=None): if context is None: @@ -476,23 +476,23 @@ class hr_applicant(base_stage, osv.Model): for applicant in self.browse(cr, uid, ids, context=context): if applicant.emp_id: message = _("Applicant has been hired and created as an employee.") - self.message_post(cr, uid, [applicant.id], body=message, subtype="hired", context=context) + self.message_post(cr, uid, [applicant.id], body=message, subtype_xml_id="hr_recruitment_subtype_hired", context=context) else: message = _("Applicant has been hired.") - self.message_post(cr, uid, [applicant.id], body=message, subtype="hired", context=context) + self.message_post(cr, uid, [applicant.id], body=message, subtype_xml_id="hr_recruitment_subtype_hired", context=context) return True def case_cancel_send_note(self, cr, uid, ids, context=None): msg = 'Applicant refused.' - return self.message_post(cr, uid, ids, body=msg, subtype="refused", context=context) + return self.message_post(cr, uid, ids, body=msg, subtype_xml_id="hr_recruitment_subtype_refused", context=context) def case_reset_send_note(self, cr, uid, ids, context=None): message =_("Applicant has been set as new.") - return self.message_post(cr, uid, ids, body=message, subtype="new", context=context) + return self.message_post(cr, uid, ids, body=message, subtype_xml_id="hr_recruitment_subtype_new", context=context) def create_send_note(self, cr, uid, ids, context=None): message = _("Applicant has been created.") - return self.message_post(cr, uid, ids, body=message, subtype="new", context=context) + return self.message_post(cr, uid, ids, body=message, subtype_xml_id="hr_recruitment_subtype_new", context=context) class hr_job(osv.osv): diff --git a/addons/hr_recruitment/hr_recruitment_data.xml b/addons/hr_recruitment/hr_recruitment_data.xml index 30ff9118584..dedeb20a3dc 100644 --- a/addons/hr_recruitment/hr_recruitment_data.xml +++ b/addons/hr_recruitment/hr_recruitment_data.xml @@ -462,38 +462,29 @@ You can automatically receive job application though an email gateway, see the H - + new - + hr.applicant - + hired - + hr.applicant - + refused - + hr.applicant - + stage change - + hr.applicant - + in progress - + hr.applicant - - - - - - - - - diff --git a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py index 4ed61119a5f..e3f54609e95 100644 --- a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py +++ b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py @@ -95,25 +95,25 @@ class account_analytic_account(osv.osv): def set_close(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state':'close'}, context=context) message = _("Contract has been closed.") - self.message_post(cr, uid, ids, body=message, subtype="closed", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="analytic_account_subtype_closed", context=context) return True def set_cancel(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state':'cancelled'}, context=context) message = _("Contract has been cancelled.") - self.message_post(cr, uid, ids, body=message, subtype="cancelled", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="analytic_account_invoice_subtype_cancelled", context=context) return True def set_open(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state':'open'}, context=context) message = _("Contract has been opened.") - self.message_post(cr, uid, ids, body=message, subtype="open", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="analytic_account_subtype_open", context=context) return True def set_pending(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state':'pending'}, context=context) message = _("Contract has been set as pending.") - self.message_post(cr, uid, ids, body=message, subtype="pending", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="analytic_account_subtype_pending", context=context) return True account_analytic_account() diff --git a/addons/hr_timesheet_invoice/hr_timesheet_invoice_data.xml b/addons/hr_timesheet_invoice/hr_timesheet_invoice_data.xml index 5cc5024d591..29a3233f509 100644 --- a/addons/hr_timesheet_invoice/hr_timesheet_invoice_data.xml +++ b/addons/hr_timesheet_invoice/hr_timesheet_invoice_data.xml @@ -17,32 +17,23 @@ 50.0 - + closed - + account.analytic.account - + pending - + account.analytic.account - + open - + account.analytic.account - + cancelled - + account.analytic.account - - - - - - - - - From 97026e96d30c103a6873f66da0e50b4f47ece37f Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 12:33:33 +0530 Subject: [PATCH 212/581] [IMP]changed in idea for subtype bzr revid: sgo@tinyerp.com-20120913070333-8mvke4g0h13r6e6d --- addons/idea/idea.py | 8 ++++---- addons/idea/idea_data.xml | 25 ++++++++----------------- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/addons/idea/idea.py b/addons/idea/idea.py index e33c9b99014..f8346ec2bba 100644 --- a/addons/idea/idea.py +++ b/addons/idea/idea.py @@ -67,21 +67,21 @@ class idea_idea(osv.osv): def idea_cancel(self, cr, uid, ids, context={}): self.write(cr, uid, ids, { 'state': 'cancel' }) - self.message_post(cr, uid, ids, body=_('Idea cancelled.'), subtype="cancelled", context=context) + self.message_post(cr, uid, ids, body=_('Idea cancelled.'), subtype_xml_id="idea_subtype_cancelled", context=context) return True def idea_open(self, cr, uid, ids, context={}): self.write(cr, uid, ids, { 'state': 'open'}) - self.message_post(cr, uid, ids, body=_('Idea accepted.'), subtype="open", context=context) + self.message_post(cr, uid, ids, body=_('Idea accepted.'), subtype_xml_id="idea_subtype_open", context=context) return True def idea_close(self, cr, uid, ids, context={}): - self.message_post(cr, uid, ids, body=_('Idea closed.'), subtype="closed", context=context) + self.message_post(cr, uid, ids, body=_('Idea closed.'), subtype_xml_id="idea_subtype_closed", context=context) self.write(cr, uid, ids, { 'state': 'close' }) return True def idea_draft(self, cr, uid, ids, context={}): - self.message_post(cr, uid, ids, body=_('Idea reset to draft.'), subtype="new", context=context) + self.message_post(cr, uid, ids, body=_('Idea reset to draft.'), subtype_xml_id="idea_subtype_new", context=context) self.write(cr, uid, ids, { 'state': 'draft' }) return True idea_idea() diff --git a/addons/idea/idea_data.xml b/addons/idea/idea_data.xml index 36ccf2e992e..b4f3f70d2dd 100644 --- a/addons/idea/idea_data.xml +++ b/addons/idea/idea_data.xml @@ -17,32 +17,23 @@ - + new - + idea.idea - + open - + idea.idea - + cancelled - + idea.idea - + closed - - - - - - - - - - + idea.idea From fa5f1e174e8e0c525edc6e5a43a3d0681a11d77c Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 12:44:30 +0530 Subject: [PATCH 213/581] [IMP]changed in mrp and mrp_operations for subtype bzr revid: sgo@tinyerp.com-20120913071430-o7bml82s6tgnwn4h --- addons/mrp/mrp.py | 10 +++---- addons/mrp/mrp_data.xml | 29 +++++++------------- addons/mrp_operations/mrp_operation_data.xml | 29 +++++++------------- addons/mrp_operations/mrp_operations.py | 10 +++---- 4 files changed, 30 insertions(+), 48 deletions(-) diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index 40d8d1b7e5f..bc0baae71e8 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -1044,27 +1044,27 @@ class mrp_production(osv.osv): # --------------------------------------------------- def create_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Manufacturing order has been created."), subtype="new", context=context) + self.message_post(cr, uid, ids, body=_("Manufacturing order has been created."), subtype_xml_id="mrp_subtype_new", context=context) return True def action_cancel_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order has been canceled.") - self.message_post(cr, uid, ids, body=message, subtype="cancelled", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="mrp_subtype_cancelled", context=context) return True def action_ready_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order is ready to produce.") - self.message_post(cr, uid, ids, body=message, subtype="ready", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="mrp_subtype_ready", context=context) return True def action_in_production_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order is in production.") - self.message_post(cr, uid, ids, body=message, subtype="production", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="mrp_subtype_production", context=context) return True def action_done_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order has been done.") - self.message_post(cr, uid, ids, body=message, subtype="closed", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="mrp_subtype_closed", context=context) return True def action_confirm_send_note(self, cr, uid, ids, context=None): diff --git a/addons/mrp/mrp_data.xml b/addons/mrp/mrp_data.xml index 6ee7cc82dd2..3740f03bdc8 100644 --- a/addons/mrp/mrp_data.xml +++ b/addons/mrp/mrp_data.xml @@ -27,38 +27,29 @@ From the Manufacturing Settings, you can choose to compute production schedules 1 - + new - + mrp.production - + ready - + mrp.production - + production - + mrp.production - + cancelled - + mrp.production - + closed - + mrp.production - - - - - - - - - diff --git a/addons/mrp_operations/mrp_operation_data.xml b/addons/mrp_operations/mrp_operation_data.xml index e2d7f9f0a56..812ce3da536 100644 --- a/addons/mrp_operations/mrp_operation_data.xml +++ b/addons/mrp_operations/mrp_operation_data.xml @@ -31,38 +31,29 @@ - + new - + mrp.production.workcenter.line - + started - + mrp.production.workcenter.line - + pending - + mrp.production.workcenter.line - + cancelled - + mrp.production.workcenter.line - + closed - + mrp.production.workcenter.line - - - - - - - - - diff --git a/addons/mrp_operations/mrp_operations.py b/addons/mrp_operations/mrp_operations.py index a18eb4141ba..6ed636850f1 100644 --- a/addons/mrp_operations/mrp_operations.py +++ b/addons/mrp_operations/mrp_operations.py @@ -224,7 +224,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been created for production order %s.") % (prod.id.name) - self.message_post(cr, uid, [workorder.id], body=message, subtype="new", context=context) + self.message_post(cr, uid, [workorder.id], body=message, subtype_xml_id="new", context=context) return True def action_start_send_note(self, cr, uid, ids, context=None): @@ -232,7 +232,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been started for production order %s.") % (prod.id.name) - self.message_post(cr, uid, [workorder.id], body=message, subtype="started", context=context) + self.message_post(cr, uid, [workorder.id], body=message, subtype_xml_id="started", context=context) return True def action_done_send_note(self, cr, uid, ids, context=None): @@ -240,7 +240,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been done for production order %s.") % (prod.id.name) - self.message_post(cr, uid, [workorder.id], body=message, subtype="closed", context=context) + self.message_post(cr, uid, [workorder.id], body=message, subtype_xml_id="closed", context=context) return True def action_pending_send_note(self, cr, uid, ids, context=None): @@ -248,7 +248,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order is pending for production order %s.") % (prod.id.name) - self.message_post(cr, uid, [workorder.id], body=message, subtype="pending", context=context) + self.message_post(cr, uid, [workorder.id], body=message, subtype_xml_id="pending", context=context) return True def action_cancel_send_note(self, cr, uid, ids, context=None): @@ -256,7 +256,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been cancelled for production order %s.") % (prod.id.name) - self.message_post(cr, uid, [workorder.id], body=message, subtype="cancelled", context=context) + self.message_post(cr, uid, [workorder.id], body=message, subtype_xml_id="cancelled", context=context) return True mrp_production_workcenter_line() From 2e7de7cf6fad0212d3d2a8953fba64d8b5aa77a2 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 12:50:05 +0530 Subject: [PATCH 214/581] [IMP]changed in mrp_repair for subtype bzr revid: sgo@tinyerp.com-20120913072005-cmlf91arfwpxnv6o --- addons/mrp_repair/mrp_repair.py | 14 +++++----- addons/mrp_repair/mrp_repair_data.xml | 37 ++++++++++----------------- 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/addons/mrp_repair/mrp_repair.py b/addons/mrp_repair/mrp_repair.py index 44624044090..202f9efd391 100644 --- a/addons/mrp_repair/mrp_repair.py +++ b/addons/mrp_repair/mrp_repair.py @@ -571,40 +571,40 @@ class mrp_repair(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _("Repair Order for %s has been created." % (repair.product_id.name)) - self.message_post(cr, uid, [repair.id], body=message, subtype="new", context=context) + self.message_post(cr, uid, [repair.id], body=message, subtype_xml_id="mrp_repair_subtype_new", context=context) return True def set_start_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _("Repair Order for %s has been started." % (repair.product_id.name)) - self.message_post(cr, uid, [repair.id], body=message, subtype="started", context=context) + self.message_post(cr, uid, [repair.id], body=message, subtype_xml_id="mrp_repair_subtype_started", context=context) return True def set_toinvoiced_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _("Draft Invoice of %s %s waiting for validation.") % (repair.invoice_id.amount_total, repair.invoice_id.currency_id.symbol) - self.message_post(cr, uid, [repair.id], body=message, subtype="pending", context=context) + self.message_post(cr, uid, [repair.id], body=message, subtype_xml_id="mrp_repair_subtype_pending", context=context) return True def set_confirm_send_note(self, cr, uid, ids, context=None): for repair in self.browse(cr, uid, ids, context): message = _( "Repair Order for %s has been accepted." % (repair.product_id.name)) - self.message_post(cr, uid, [repair.id], body=message, subtype="accepted", context=context) + self.message_post(cr, uid, [repair.id], body=message, subtype_xml_id="mrp_repair_subtype_accepted", context=context) return True def set_cancel_send_note(self, cr, uid, ids, context=None): message = _("Repair has been cancelled.") - self.message_post(cr, uid, ids, body=message, subtype="cancelled", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="mrp_repair_subtype_cancelled", context=context) return True def set_ready_send_note(self, cr, uid, ids, context=None): message = _("Repair Order is now ready to repair.") - self.message_post(cr, uid, ids, body=message, subtype="ready", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="mrp_repair_subtype_ready", context=context) return True def set_done_send_note(self, cr, uid, ids, context=None): message = _("Repair Order is closed.") - self.message_post(cr, uid, ids, body=message, subtype="closed", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="mrp_repair_subtype_closed", context=context) return True mrp_repair() diff --git a/addons/mrp_repair/mrp_repair_data.xml b/addons/mrp_repair/mrp_repair_data.xml index b45b7ec3105..6414e07f713 100644 --- a/addons/mrp_repair/mrp_repair_data.xml +++ b/addons/mrp_repair/mrp_repair_data.xml @@ -1,47 +1,38 @@ - + new - + mrp.repair - + started - + mrp.repair - + ready - + mrp.repair - + pending - + mrp.repair - + accepted - + mrp.repair - + cancelled - + mrp.repair - + closed - + mrp.repair - - - - - - - - - From 2e3f2e2458d71cdf693c6ec97e3d9cc28d4a6e75 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 12:59:49 +0530 Subject: [PATCH 215/581] [IMP]changed in procurement for subtype bzr revid: sgo@tinyerp.com-20120913072949-pny1yj3ke2gj2rr3 --- addons/procurement/procurement.py | 12 ++++----- addons/procurement/procurement_data.xml | 35 ++++++++++--------------- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py index 1cb695663df..dcb47f1af88 100644 --- a/addons/procurement/procurement.py +++ b/addons/procurement/procurement.py @@ -496,22 +496,22 @@ class procurement_order(osv.osv): return obj_id def create_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Procurement has been created."), subtype="new", context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been created."), subtype_xml_id="procurement_subtype_new", context=context) def confirm_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Procurement has been confirmed."), subtype="confirmed", context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been confirmed."), subtype_xml_id="procurement_subtype_confirmed", context=context) def running_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Procurement has been set to running."), subtype="running", context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been set to running."), subtype_xml_id="procurement_subtype_running", context=context) def ready_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Procurement has been set to ready."), subtype="ready", context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been set to ready."), subtype_xml_id="procurement_subtype_ready", context=context) def cancel_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Procurement has been cancelled."), subtype="cancelled", context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been cancelled."), subtype_xml_id="procurement_subtype_cancelled", context=context) def done_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Procurement has been done."), subtype="closed", context=context) + self.message_post(cr, uid, ids, body=_("Procurement has been done."), subtype_xml_id="procurement_subtype_closed", context=context) procurement_order() diff --git a/addons/procurement/procurement_data.xml b/addons/procurement/procurement_data.xml index 1f60977c4dd..950c487ae53 100644 --- a/addons/procurement/procurement_data.xml +++ b/addons/procurement/procurement_data.xml @@ -32,36 +32,29 @@ - - + + new + procurement.order - + confirmed - + procurement.order - + ready - + procurement.order - + running - + procurement.order - - + + cancelled + procurement.order - + closed - - - - - - - - - - + procurement.order \ No newline at end of file From ad6e9d96e4d6f0f33f48415e13ffebcaf7992b77 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 14:27:27 +0530 Subject: [PATCH 216/581] [IMP]changed in sale module for subtype update specification bzr revid: sgo@tinyerp.com-20120913085727-7swp0404g99fkf7l --- addons/stock/stock.py | 18 +++++++++++++----- addons/stock/stock_data.xml | 29 +++++++++++++---------------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index d577e69e237..50e85fa5191 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -1379,13 +1379,13 @@ class stock_picking(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("%s has been created.") % (self._get_document_type(obj.type)), subtype="new", context=context) + self.message_post(cr, uid, [obj.id], body=_("%s has been created.") % (self._get_document_type(obj.type)), subtype_xml_id="stock_in_subtype_new", context=context) def scrap_send_note(self, cr, uid, ids, quantity, uom, name, context=None): - return self.message_post(cr, uid, ids, body= _("%s %s %s has been moved to scrap.") % (quantity, uom, name), subtype="moved", context=context) + return self.message_post(cr, uid, ids, body= _("%s %s %s has been moved to scrap.") % (quantity, uom, name),context=context) def back_order_send_note(self, cr, uid, ids, back_name, context=None): - return self.message_post(cr, uid, ids, body=_("Back order %s has been created.") % (back_name), subtype="new", context=context) + return self.message_post(cr, uid, ids, body=_("Back order %s has been created.") % (back_name), subtype_xml_id="stock_in_subtype_new", context=context) def ship_done_send_note(self, cr, uid, ids, context=None): type_dict = { @@ -1393,12 +1393,20 @@ class stock_picking(osv.osv): 'in': 'received', 'internal': 'moved', } + xml_id_dict = { + 'out':'stock_out_subtype_delivered', + 'in' : 'stock_in_subtype_received' + } for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("Products have been %s.") % (type_dict.get(obj.type, 'move done')), subtype=type_dict.get(obj.type), context=context) + self.message_post(cr, uid, [obj.id], body=_("Products have been %s.") % (type_dict.get(obj.type, 'move done')), subtype_xml_id=xml_id_dict.get(obj.type), context=context) def ship_cancel_send_note(self, cr, uid, ids, context=None): + xml_id_dict = { + 'out':'stock_out_subtype_cancelled', + 'in' : 'stock_in_subtype_cancelled' + } for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("%s has been cancelled.") % (self._get_document_type(obj.type)), subtype="cancelled", context=context) + self.message_post(cr, uid, [obj.id], body=_("%s has been cancelled.") % (self._get_document_type(obj.type)), subtype_xml_id=xml_id_dict.get(obj.type), context=context) stock_picking() diff --git a/addons/stock/stock_data.xml b/addons/stock/stock_data.xml index f83b0ada388..a59642fa912 100644 --- a/addons/stock/stock_data.xml +++ b/addons/stock/stock_data.xml @@ -170,30 +170,27 @@ watch your stock valuation, and track production lots upstream and downstream (b - - + + new + stock.picking.in - + delivered - + stock.picking.out - + received - + stock.picking.in - - + + cancelled + stock.picking.in - - - - - - - - + + cancelled + stock.picking.out From 211c7c6a46930c9ceeedb06f93a28bd1bb273fc2 Mon Sep 17 00:00:00 2001 From: "Ajay Chauhan (OpenERP)" Date: Thu, 13 Sep 2012 14:31:17 +0530 Subject: [PATCH 217/581] [FIX] l10n_ch: solved the issue of unable to configure swiss chart lp bug: https://launchpad.net/bugs/1045842 fixed bzr revid: cha@tinyerp.com-20120913090117-whym4hu1q4w23p2m --- addons/l10n_ch/account_wizard.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/l10n_ch/account_wizard.py b/addons/l10n_ch/account_wizard.py index 7b80e3697ee..306207c612d 100644 --- a/addons/l10n_ch/account_wizard.py +++ b/addons/l10n_ch/account_wizard.py @@ -36,8 +36,9 @@ class WizardMultiChartsAccounts(osv.osv_memory): def execute(self, cr, uid, ids, context=None): """Override of code in order to be able to link journal with account in XML""" res = super(WizardMultiChartsAccounts, self).execute(cr, uid, ids, context) - path = addons.get_module_resource(os.path.join('l10n_ch','sterchi_chart','account_journal_rel.xml')) + path = addons.get_module_resource('l10n_ch','sterchi_chart','account_journal_rel.xml') tools.convert_xml_import(cr, 'l10n_ch', path, idref=None, mode='init', noupdate=True, report=None) + res.update({'type': 'ir.actions.act_window_close'}) return res WizardMultiChartsAccounts() From 986e5817d18b149c3d31cc8c123b878a3e6b62b9 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 14:32:12 +0530 Subject: [PATCH 218/581] [IMP]changed in sale module for subtype update specification bzr revid: sgo@tinyerp.com-20120913090212-8c9jgb38x1d6517j --- addons/sale/sale.py | 10 +++++----- addons/sale/sale_data.xml | 29 ++++++++++------------------- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/addons/sale/sale.py b/addons/sale/sale.py index 0af625ed7d9..0f01909ac7f 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -1032,7 +1032,7 @@ class sale_order(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("Quotation for %s has been created.") % (obj.partner_id.name), subtype="new", context=context) + self.message_post(cr, uid, [obj.id], body=_("Quotation for %s has been created.") % (obj.partner_id.name), subtype_xml_id="sale_subtype_new", context=context) def confirm_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): @@ -1040,7 +1040,7 @@ class sale_order(osv.osv): def cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("Sale Order for %s cancelled.") % (obj.partner_id.name), subtype="cancelled", context=context) + self.message_post(cr, uid, [obj.id], body=_("Sale Order for %s cancelled.") % (obj.partner_id.name), subtype_xml_id="sale_subtype_cancelled", context=context) def delivery_send_note(self, cr, uid, ids, picking_id, context=None): for order in self.browse(cr, uid, ids, context=context): @@ -1052,15 +1052,15 @@ class sale_order(osv.osv): self.message_post(cr, uid, [order.id], body=_("Delivery Order %s scheduled for %s.") % (picking.name, picking_date_str), context=context) def delivery_end_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Order delivered."), subtype="delivered", context=context) + self.message_post(cr, uid, ids, body=_("Order delivered."), subtype_xml_id="sale_subtype_delivered", context=context) def invoice_paid_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Invoice paid."), subtype="paid", context=context) + self.message_post(cr, uid, ids, body=_("Invoice paid."), subtype_xml_id="sale_subtype_paid", context=context) def invoice_send_note(self, cr, uid, ids, invoice_id, context=None): for order in self.browse(cr, uid, ids, context=context): for invoice in (inv for inv in order.invoice_ids if inv.id == invoice_id): - self.message_post(cr, uid, [order.id], body=_("Draft Invoice of %s %s waiting for validation.") % (invoice.amount_total, invoice.currency_id.symbol), subtype="pending", context=context) + self.message_post(cr, uid, [order.id], body=_("Draft Invoice of %s %s waiting for validation.") % (invoice.amount_total, invoice.currency_id.symbol), subtype_xml_id="sale_subtype_pending", context=context) def action_cancel_draft_send_note(self, cr, uid, ids, context=None): return self.message_post(cr, uid, ids, body=_('Sale order set to draft.'), context=context) diff --git a/addons/sale/sale_data.xml b/addons/sale/sale_data.xml index 2f4b81b27f4..4eca7f60c8f 100644 --- a/addons/sale/sale_data.xml +++ b/addons/sale/sale_data.xml @@ -50,37 +50,28 @@ If you need to manage your sales pipeline (leads, opportunities, phonecalls), you can install the module <i>CRM</i> from the top menu Settings. - + new - + sale.order - + cancelled - + sale.order - + paid - + sale.order - + pending - + sale.order - + delivered - - - - - - - - - - + sale.order From c67edb99bb891c468fedb6b4a373fe9da1843ebc Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 14:38:34 +0530 Subject: [PATCH 219/581] [IMP]changed in purchase module for subtype update specification bzr revid: sgo@tinyerp.com-20120913090834-5lf57kikymrzsg8z --- addons/purchase/purchase.py | 12 ++++++------ addons/purchase/purchase_data.xml | 29 ++++++++++------------------- 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index c950c852261..b0f10d3f71f 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -740,7 +740,7 @@ class purchase_order(osv.osv): return [('state', '=', 'draft')] def create_send_note(self, cr, uid, ids, context=None): - return self.message_post(cr, uid, ids, body=_("Request for quotation created."), subtype="new", context=context) + return self.message_post(cr, uid, ids, body=_("Request for quotation created."), subtype_xml_id="purchase_subtype_new", context=context) def confirm_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): @@ -758,20 +758,20 @@ class purchase_order(osv.osv): def invoice_send_note(self, cr, uid, ids, invoice_id, context=None): for order in self.browse(cr, uid, ids, context=context): for invoice in (inv for inv in order.invoice_ids if inv.id == invoice_id): - self.message_post(cr, uid, [order.id], body=_("Draft Invoice of %s %s is waiting for validation.") % (invoice.amount_total, invoice.currency_id.symbol), subtype="pending", context=context) + self.message_post(cr, uid, [order.id], body=_("Draft Invoice of %s %s is waiting for validation.") % (invoice.amount_total, invoice.currency_id.symbol), subtype_xml_id="purchase_subtype_pending", context=context) def shipment_done_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("""Shipment received."""), subtype="received", context=context) + self.message_post(cr, uid, ids, body=_("""Shipment received."""), subtype_xml_id="purchase_subtype_received", context=context) def invoice_done_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Invoice paid."), subtype="paid", context=context) + self.message_post(cr, uid, ids, body=_("Invoice paid."), subtype_xml_id="purchase_subtype_paid", context=context) def draft_send_note(self, cr, uid, ids, context=None): - return self.message_post(cr, uid, ids, body=_("Purchase Order has been set to draft."), context=context) + return self.message_post(cr, uid, ids, body=_("Purchase Order has been set to draft."), subtype_xml_id="purchase_subtype_new", context=context) def cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("Purchase Order for %s cancelled.") % (obj.partner_id.name), subtype="cancelled", context=context) + self.message_post(cr, uid, [obj.id], body=_("Purchase Order for %s cancelled.") % (obj.partner_id.name), subtype_xml_id="purchase_subtype_cancelled", context=context) purchase_order() diff --git a/addons/purchase/purchase_data.xml b/addons/purchase/purchase_data.xml index a84564b2360..aa62e84e19d 100644 --- a/addons/purchase/purchase_data.xml +++ b/addons/purchase/purchase_data.xml @@ -49,37 +49,28 @@ You can also manage purchase requisitions, see also the Purchase Settings. - + new - + purchase.order - + paid - + purchase.order - + pending - + purchase.order - + received - + purchase.order - + cancelled - + purchase.order - - - - - - - - - From 9524b34e314511191fc2c2265a44e5c9594f645c Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 14:42:08 +0530 Subject: [PATCH 220/581] [IMP]changed in purchase_requisition module for subtype update specification bzr revid: sgo@tinyerp.com-20120913091208-si6e042trpzdyq6m --- .../purchase_requisition.py | 8 +++---- .../purchase_requisition_data.xml | 23 +++++++------------ 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/addons/purchase_requisition/purchase_requisition.py b/addons/purchase_requisition/purchase_requisition.py index a3df366381d..5d8d2bb2f87 100644 --- a/addons/purchase_requisition/purchase_requisition.py +++ b/addons/purchase_requisition/purchase_requisition.py @@ -94,13 +94,13 @@ class purchase_requisition(osv.osv): self.message_post(cr, uid, ids, body=_("Draft Requisition has been sent to suppliers."), context=context) def reset_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Purchase Requisition has been set to draft."), subtype="new", context=context) + self.message_post(cr, uid, ids, body=_("Purchase Requisition has been set to draft."), subtype_xml_id="requisition_subtype_new", context=context) def done_to_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Purchase Requisition has been done."), subtype="closed", context=context) + self.message_post(cr, uid, ids, body=_("Purchase Requisition has been done."), subtype_xml_id="requisition_subtype_closed", context=context) def cancel_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Purchase Requisition has been cancelled."), subtype="cancelled", context=context) + self.message_post(cr, uid, ids, body=_("Purchase Requisition has been cancelled."), subtype_xml_id="requisition_subtype_cancelled", context=context) def _planned_date(self, requisition, delay=0.0): company = requisition.company_id @@ -184,7 +184,7 @@ class purchase_requisition(osv.osv): return res def create_send_note(self, cr, uid, ids, context=None): - return self.message_post(cr, uid, ids, body=_("Purchase Requisition has been created."), subtype="new", context=context) + return self.message_post(cr, uid, ids, body=_("Purchase Requisition has been created."), subtype_xml_id="requisition_subtype_new", context=context) def create(self, cr, uid, vals, context=None): requisition = super(purchase_requisition, self).create(cr, uid, vals, context=context) diff --git a/addons/purchase_requisition/purchase_requisition_data.xml b/addons/purchase_requisition/purchase_requisition_data.xml index 2b22c2057a1..534bf2fe2a7 100644 --- a/addons/purchase_requisition/purchase_requisition_data.xml +++ b/addons/purchase_requisition/purchase_requisition_data.xml @@ -7,24 +7,17 @@ model="ir.values" name="set"/> - + closed - + purchase.requisition - - + + new + purchase.requisition - - - - - - - - - - - + + cancelled + purchase.requisition \ No newline at end of file From 18ceddcf2ee7086fe2e2d512e415064986febf9c Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 14:45:02 +0530 Subject: [PATCH 221/581] [IMP]minor changes bzr revid: sgo@tinyerp.com-20120913091502-dvlpgoa3dr72km04 --- addons/event/event_data.xml | 4 ---- addons/mail/tests/test_mail.py | 4 ---- 2 files changed, 8 deletions(-) diff --git a/addons/event/event_data.xml b/addons/event/event_data.xml index 814fd0b179c..bc7f71ef664 100644 --- a/addons/event/event_data.xml +++ b/addons/event/event_data.xml @@ -16,24 +16,20 @@ new event.event - closed event.event - cancelled event.event - confirmed event.event - diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py index e3718d23855..9b0586d5d5c 100644 --- a/addons/mail/tests/test_mail.py +++ b/addons/mail/tests/test_mail.py @@ -636,7 +636,3 @@ class test_mail(common.TransactionCase): msg_id = self.mail_group.message_post(cr, uid, [self.group_pigs_id], body=_body1, subject=_subject, type='comment',subtype_xml_id='mail_subtype_comment') notif_ids = self.mail_notification.search(cr, uid, [('message_id', '=', msg_id)]) self.assertTrue(len(notif_ids) >= 1,"subtype is email and show notification on wall") - # New post: test automatic subject, signature in html, add a partner, email preference, parent_id previous message -# msg_id2 = self.mail_group.message_post(cr, uid, [self.group_pigs_id], body=_body2,subject=_subject, type='email', subtype='other') -# notif_ids2 = self.mail_notification.search(cr, uid, [('message_id', '=', msg_id2)]) -# self.assertTrue(len(notif_ids2) == 0,"subtype is false cannot show notification on wall") From e6eafcaf22aa4c84ca751f1e6cd2f06a0833c987 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 14:47:57 +0530 Subject: [PATCH 222/581] [IMP]minor changes in account bzr revid: sgo@tinyerp.com-20120913091757-6izlnq34z3v9jd7n --- addons/account_voucher/account_voucher_data.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/account_voucher/account_voucher_data.xml b/addons/account_voucher/account_voucher_data.xml index dd46a83777e..a59993aae6b 100644 --- a/addons/account_voucher/account_voucher_data.xml +++ b/addons/account_voucher/account_voucher_data.xml @@ -14,6 +14,7 @@ If you want to use advanced accounting features, you should install the "Account + new account.voucher From 53a67e065236f549cd07b35406cc59181417ee55 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 15:12:09 +0530 Subject: [PATCH 223/581] [IMP]change in mrp bzr revid: sgo@tinyerp.com-20120913094209-4r0laz8gtmcz1tsq --- addons/mrp_operations/mrp_operations.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/mrp_operations/mrp_operations.py b/addons/mrp_operations/mrp_operations.py index 6ed636850f1..53eaceed066 100644 --- a/addons/mrp_operations/mrp_operations.py +++ b/addons/mrp_operations/mrp_operations.py @@ -224,7 +224,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been created for production order %s.") % (prod.id.name) - self.message_post(cr, uid, [workorder.id], body=message, subtype_xml_id="new", context=context) + self.message_post(cr, uid, [workorder.id], body=message, subtype_xml_id="mrp_operations_subtype_new", context=context) return True def action_start_send_note(self, cr, uid, ids, context=None): @@ -232,7 +232,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been started for production order %s.") % (prod.id.name) - self.message_post(cr, uid, [workorder.id], body=message, subtype_xml_id="started", context=context) + self.message_post(cr, uid, [workorder.id], body=message, subtype_xml_id="mrp_operations_subtype_started", context=context) return True def action_done_send_note(self, cr, uid, ids, context=None): @@ -240,7 +240,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been done for production order %s.") % (prod.id.name) - self.message_post(cr, uid, [workorder.id], body=message, subtype_xml_id="closed", context=context) + self.message_post(cr, uid, [workorder.id], body=message, subtype_xml_id="mrp_operations_subtype_closed", context=context) return True def action_pending_send_note(self, cr, uid, ids, context=None): @@ -248,7 +248,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order is pending for production order %s.") % (prod.id.name) - self.message_post(cr, uid, [workorder.id], body=message, subtype_xml_id="pending", context=context) + self.message_post(cr, uid, [workorder.id], body=message, subtype_xml_id="mrp_operations_subtype_pending", context=context) return True def action_cancel_send_note(self, cr, uid, ids, context=None): @@ -256,7 +256,7 @@ class mrp_production_workcenter_line(osv.osv): for workorder in self.browse(cr, uid, ids): for prod in prod_obj.browse(cr, uid, [workorder.production_id]): message = _("Work order has been cancelled for production order %s.") % (prod.id.name) - self.message_post(cr, uid, [workorder.id], body=message, subtype_xml_id="cancelled", context=context) + self.message_post(cr, uid, [workorder.id], body=message, subtype_xml_id="mrp_operations_subtype_cancelled", context=context) return True mrp_production_workcenter_line() From 458899673b2d06572ea68b1874b56767d7966a76 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 15:33:07 +0530 Subject: [PATCH 224/581] [IMP]change in mrp operations openerp.py bzr revid: sgo@tinyerp.com-20120913100307-4f49x1my6ajzzfiz --- addons/mrp_operations/__openerp__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/mrp_operations/__openerp__.py b/addons/mrp_operations/__openerp__.py index a5bda80f924..ba2e2d88637 100644 --- a/addons/mrp_operations/__openerp__.py +++ b/addons/mrp_operations/__openerp__.py @@ -58,6 +58,7 @@ So, that we can compare the theoretic delay and real delay. 'depends': ['mrp'], 'data': [ 'security/ir.model.access.csv', + 'mrp_operation_data.xml', 'mrp_operations_workflow.xml', 'mrp_operations_view.xml', 'mrp_operations_report.xml', @@ -65,7 +66,7 @@ So, that we can compare the theoretic delay and real delay. 'process/mrp_operation_process.xml', 'mrp_operations_workflow_instance.xml' ], - 'demo': ['mrp_operation_data.xml', + 'demo': [ 'mrp_operations_demo.yml' ], 'test': [ From 17987c7e2c71a695a5d3fcff324c29067ba6b7ab Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 15:54:56 +0530 Subject: [PATCH 225/581] [IMP]crm yml improve for subtype bzr revid: sgo@tinyerp.com-20120913102456-c74asnmmh6kx5270 --- addons/crm/test/process/crm_message_subtype.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/addons/crm/test/process/crm_message_subtype.yml b/addons/crm/test/process/crm_message_subtype.yml index 3dd042c1279..46c6aae7bf4 100644 --- a/addons/crm/test/process/crm_message_subtype.yml +++ b/addons/crm/test/process/crm_message_subtype.yml @@ -3,24 +3,21 @@ - !record {model: mail.message.subtype, id: mail.mail_subtype_won }: name: won - model_ids: - - crm.model_crm_lead + res_model:crm.lead default: False - I have add the sub_type name email with default true - !record {model: mail.message.subtype, id: mail.mail_subtype_email }: name: email - model_ids: - - crm.model_crm_lead + res_model:crm.lead default: True - I have add the sub_type name comment with default true - !record {model: mail.message.subtype, id: mail.mail_subtype_comment }: name: comment - model_ids: - - crm.model_crm_lead + res_model:crm.lead default: True - I have add the subtypes as won in feeds From d5687b3ed0538d095cc8209c1de78de1a10448b6 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 16:15:18 +0530 Subject: [PATCH 226/581] [IMP]crm yml improve bzr revid: sgo@tinyerp.com-20120913104518-6cse5m221l8n5yc4 --- addons/crm/test/process/crm_message_subtype.yml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/addons/crm/test/process/crm_message_subtype.yml b/addons/crm/test/process/crm_message_subtype.yml index 46c6aae7bf4..a1ad9a9c39a 100644 --- a/addons/crm/test/process/crm_message_subtype.yml +++ b/addons/crm/test/process/crm_message_subtype.yml @@ -3,22 +3,14 @@ - !record {model: mail.message.subtype, id: mail.mail_subtype_won }: name: won - res_model:crm.lead + res_model: crm.lead default: False -- - I have add the sub_type name email with default true -- - !record {model: mail.message.subtype, id: mail.mail_subtype_email }: - name: email - res_model:crm.lead - default: True - I have add the sub_type name comment with default true - !record {model: mail.message.subtype, id: mail.mail_subtype_comment }: name: comment - res_model:crm.lead - default: True + res_model: crm.lead - I have add the subtypes as won in feeds - From 5451ff85f9b61b8290b6bff3edcbd694c943fce7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 13 Sep 2012 13:39:31 +0200 Subject: [PATCH 227/581] [FIX] mail_mail: added security rules for mail.mail, to allow users to send emails. This fixes notably the crash when Demo User tries to send a quotation by email. bzr revid: tde@openerp.com-20120913113931-x31vkhihikfdn4bc --- addons/mail/security/ir.model.access.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/mail/security/ir.model.access.csv b/addons/mail/security/ir.model.access.csv index 1979e2fec05..c89c60756bd 100644 --- a/addons/mail/security/ir.model.access.csv +++ b/addons/mail/security/ir.model.access.csv @@ -1,6 +1,7 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_mail_message_all,mail.message.all,model_mail_message,,1,0,0,0 access_mail_message_group_user,mail.message.group.user,model_mail_message,base.group_user,1,1,1,1 +access_mail_mail_all,mail.mail.all,model_mail_mail,,1,1,1,1 access_mail_thread,mail.thread,model_mail_thread,base.group_user,1,1,1,0 access_mail_followers_all,mail.followers.all,model_mail_followers,,1,1,1,1 access_mail_notification_all,mail.notification.all,model_mail_notification,,1,1,1,1 From f554db5c6bc94b3e9fdf5aa67a0030cbb4026df2 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 17:10:44 +0530 Subject: [PATCH 228/581] [IMP]add subtype for crm_claim bzr revid: sgo@tinyerp.com-20120913114044-0spnm47pty5g04wu --- addons/crm_claim/crm_claim.py | 6 +++--- addons/crm_claim/crm_claim_data.xml | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/addons/crm_claim/crm_claim.py b/addons/crm_claim/crm_claim.py index 535f6d20367..ce2427b9752 100644 --- a/addons/crm_claim/crm_claim.py +++ b/addons/crm_claim/crm_claim.py @@ -238,16 +238,16 @@ class crm_claim(base_stage, osv.osv): def create_send_note(self, cr, uid, ids, context=None): msg = _('Claim has been created.') - return self.message_post(cr, uid, ids, body=msg, context=context) + return self.message_post(cr, uid, ids, body=msg, subtype_xml_id='claim_subtype_new', context=context) def case_refuse_send_note(self, cr, uid, ids, context=None): msg = _('Claim has been refused.') - return self.message_post(cr, uid, ids, body=msg, context=context) + return self.message_post(cr, uid, ids, body=msg, subtype_xml_id='claim_subtype_refused', context=context) def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Override of the (void) default notification method. """ stage_name = self.pool.get('crm.claim.stage').name_get(cr, uid, [stage_id], context=context)[0][1] - return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), context=context) + return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), subtype_xml_id='claim_subtype_stage_change', context=context) class res_partner(osv.osv): diff --git a/addons/crm_claim/crm_claim_data.xml b/addons/crm_claim/crm_claim_data.xml index 33bd280c364..a72c285f506 100644 --- a/addons/crm_claim/crm_claim_data.xml +++ b/addons/crm_claim/crm_claim_data.xml @@ -75,6 +75,32 @@ + + + + new + crm.claim + + + + refused + crm.claim + + + + stage change + crm.claim + + + cancelled + crm.claim + + + + closed + crm.claim + + From 2fbc7e9d046dcebea15b6a43289297e705984212 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Thu, 13 Sep 2012 17:21:38 +0530 Subject: [PATCH 229/581] [IMP]improve subtype in crm_claim bzr revid: sgo@tinyerp.com-20120913115138-4rrsmwmlfh4f25s1 --- addons/crm_claim/crm_claim_data.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/crm_claim/crm_claim_data.xml b/addons/crm_claim/crm_claim_data.xml index a72c285f506..e68bc3ad6cb 100644 --- a/addons/crm_claim/crm_claim_data.xml +++ b/addons/crm_claim/crm_claim_data.xml @@ -99,7 +99,6 @@ closed crm.claim - From 827bc4ec989cf53e3e774efd92527a0c8d4f5a23 Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Thu, 13 Sep 2012 17:30:27 +0200 Subject: [PATCH 230/581] [IMP] portal: better ids for csv access rights bzr revid: abo@openerp.com-20120913153027-64cq2njzbagdlr3h --- addons/portal/security/ir.model.access.csv | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/addons/portal/security/ir.model.access.csv b/addons/portal/security/ir.model.access.csv index 56b3ae5f269..ea472cece38 100644 --- a/addons/portal/security/ir.model.access.csv +++ b/addons/portal/security/ir.model.access.csv @@ -1,12 +1,12 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_all,access.portal.all,model_res_portal,,1,0,0,0 -access_widget_all,access.portal.widget.all,model_res_portal_widget,,1,0,0,0 -access_manager,access.portal.manager,model_res_portal,group_portal_manager,1,1,1,1 -access_widget_manager,access.portal.widget.manager,model_res_portal_widget,group_portal_manager,1,1,1,1 -access_mail_message,mail.message,mail.model_mail_message,group_portal_member,1,0,1,1 -access_mail_message_all,mail.message.all,mail.model_mail_message,group_portal_member,1,0,0,0 -access_mail_thread,mail.thread,mail.model_mail_thread,group_portal_member,1,0,0,0 -access_mail_followers,mail.followers,mail.model_mail_followers,group_portal_member,1,0,1,1 -access_mail_notification,mail.notification,mail.model_mail_notification,group_portal_member,1,0,1,0 -access_mail_group,mail.group,mail.model_mail_group,group_portal_member,1,0,0,0 -access_mail_alias,mail.alias,mail.model_mail_alias,group_portal_member,1,0,0,0 +access_portal_all,access.portal.all,model_res_portal,,1,0,0,0 +access_widget_portal_all,access.portal.widget.all,model_res_portal_widget,,1,0,0,0 +access_manager_portal,access.portal.manager,model_res_portal,group_portal_manager,1,1,1,1 +access_widget_manager_portal,access.portal.widget.manager,model_res_portal_widget,group_portal_manager,1,1,1,1 +access_mail_message_portal,mail.message,mail.model_mail_message,group_portal_member,1,0,1,1 +access_mail_message_portal_all,mail.message.all,mail.model_mail_message,group_portal_member,1,0,0,0 +access_mail_thread_portal,mail.thread,mail.model_mail_thread,group_portal_member,1,0,0,0 +access_mail_followers_portal,mail.followers,mail.model_mail_followers,group_portal_member,1,0,1,1 +access_mail_notification_portal,mail.notification,mail.model_mail_notification,group_portal_member,1,0,1,0 +access_mail_group_portal,mail.group,mail.model_mail_group,group_portal_member,1,0,0,0 +access_mail_alias_portal,mail.alias,mail.model_mail_alias,group_portal_member,1,0,0,0 From e66cd01467ddb209cb9cdb6c60c72e97f0ae191b Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Thu, 13 Sep 2012 17:58:10 +0200 Subject: [PATCH 231/581] [IMP] portal: first batch of ir rules bzr revid: abo@openerp.com-20120913155810-3grgq7xht1h981m5 --- addons/portal_claim/security/portal_security.xml | 2 +- addons/portal_event/security/portal_security.xml | 2 +- addons/portal_project/security/portal_security.xml | 2 +- .../security/portal_security.xml | 2 +- addons/portal_sale/security/portal_security.xml | 12 ++++++------ addons/project_issue/project_issue_demo.xml | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/addons/portal_claim/security/portal_security.xml b/addons/portal_claim/security/portal_security.xml index e902bd043ad..6013bc1d42f 100644 --- a/addons/portal_claim/security/portal_security.xml +++ b/addons/portal_claim/security/portal_security.xml @@ -5,7 +5,7 @@ Portal Personal Claims - [('partner_id','child_of',user.partner_id.id)] + [('message_follower_ids','in',user.partner_id.id)] diff --git a/addons/portal_event/security/portal_security.xml b/addons/portal_event/security/portal_security.xml index 6a3ed0ac786..d8c7f54099f 100644 --- a/addons/portal_event/security/portal_security.xml +++ b/addons/portal_event/security/portal_security.xml @@ -12,7 +12,7 @@ Portal Personal Registrations - [('partner_id','child_of',user.partner_id.id)] + [('message_follower_ids','in',user.partner_id.id)] diff --git a/addons/portal_project/security/portal_security.xml b/addons/portal_project/security/portal_security.xml index b995c79bbbc..d70b576fe4c 100644 --- a/addons/portal_project/security/portal_security.xml +++ b/addons/portal_project/security/portal_security.xml @@ -5,7 +5,7 @@ Portal Personal Task - [('partner_id','child_of',user.partner_id.id)] + [('message_follower_ids','in',user.partner_id.id)] diff --git a/addons/portal_project_issue/security/portal_security.xml b/addons/portal_project_issue/security/portal_security.xml index 4ef8da5e4b6..3ba6f773a57 100644 --- a/addons/portal_project_issue/security/portal_security.xml +++ b/addons/portal_project_issue/security/portal_security.xml @@ -5,7 +5,7 @@ Portal Personal Issues - [('partner_id','child_of',user.partner_id.id)] + [('message_follower_ids','in',user.partner_id.id)] diff --git a/addons/portal_sale/security/portal_security.xml b/addons/portal_sale/security/portal_security.xml index f69fd283db6..db82dc7b599 100644 --- a/addons/portal_sale/security/portal_security.xml +++ b/addons/portal_sale/security/portal_security.xml @@ -6,42 +6,42 @@ Portal Personal Quotations/Sales Orders - [('partner_id','child_of',user.partner_id.id)] + [('message_follower_ids','in',user.partner_id.id)] Portal Personal Delivery Orders - [('partner_id','child_of',[user.partner_id.id])] + [('message_follower_ids','in',user.partner_id.id)] Portal Personal Delivery Orders Out - [('partner_id','child_of',[user.partner_id.id])] + [('message_follower_ids','in',user.partner_id.id)] Portal Personal Account Invoices - [('partner_id','child_of',user.partner_id.id)] + [('message_follower_ids','in',user.partner_id.id)] Portal Personal Payments - [('partner_id','child_of',user.partner_id.id)] + [('message_follower_ids','in',user.partner_id.id)] Portal Personal Contacts - [('id','child_of',user.partner_id.id)] + [('message_follower_ids','in',user.partner_id.id)] diff --git a/addons/project_issue/project_issue_demo.xml b/addons/project_issue/project_issue_demo.xml index 0a4eee3067b..9759d15dabb 100644 --- a/addons/project_issue/project_issue_demo.xml +++ b/addons/project_issue/project_issue_demo.xml @@ -31,7 +31,7 @@ - + 3 From f6ed42db867fdad6da59a5b348b603793a59803b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 13 Sep 2012 19:05:00 +0200 Subject: [PATCH 232/581] [WIP] [FIX] mail: fixing access rights + related tests. WIP, already fixed mail.group and mail.alias, not readable by anonymous not-employee users. bzr revid: tde@openerp.com-20120913170500-um93rzw0nq6njl39 --- addons/mail/mail_message.py | 49 ++++++++++++---- addons/mail/security/ir.model.access.csv | 2 + addons/mail/tests/test_mail.py | 73 ++++++++++++++++++++++++ 3 files changed, 113 insertions(+), 11 deletions(-) diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index 44ce76b94b0..cec3b89d9b6 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -24,6 +24,7 @@ import openerp import tools from email.header import decode_header +from openerp import SUPERUSER_ID from operator import itemgetter from osv import osv, fields from tools.translate import _ @@ -138,7 +139,8 @@ class mail_message(osv.Model): return [] def _get_default_author(self, cr, uid, context=None): - return self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id + # remove context to avoid possible hack in browse with superadmin using context keys that could trigger a specific behavior + return self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=None).partner_id.id _defaults = { 'type': 'email', @@ -274,15 +276,40 @@ class mail_message(osv.Model): if isinstance(ids, (int, long)): ids = [ids] - # check messages for which you have a notification - partner_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id - not_obj = self.pool.get('mail.notification') - not_ids = not_obj.search(cr, uid, [ - ('partner_id', '=', partner_id), - ('message_id', 'in', ids), - ], context=context) - notified_ids = [notification.message_id.id for notification in not_obj.browse(cr, uid, not_ids, context=context) - if notification.message_id.id in ids] + # Rights + # - read: if + # - notification exist (I receive pushed message) OR + # - author_id = pid (I am the author) OR + # - I can read the related document + # - create: if + # - I can write on the related document OR + # - I am in the document message_follower_ids + # - write: if + # - I can write on the related document + # - unlink: if + # - I can write on the related document + # + + if operation != 'read': + notified_ids = [] + author_ids = [] + else: + # read: check for notifications + partner_id = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=None).partner_id.id + not_obj = self.pool.get('mail.notification') + not_ids = not_obj.search(cr, uid, [ + ('partner_id', '=', partner_id), + ('message_id', 'in', ids), + ], context=context) + notified_ids = [notification.message_id.id for notification in not_obj.browse(cr, uid, not_ids, context=context)] + + # read: check messages you are author + author_ids = self.search(cr, uid, [('author_id', '=', partner_id), ('id', 'in', ids)], context=context) + + # if operation != 'create': + # follower_ids = [] + # else: + # write: check I am in the document followers # check messages linked to an existing document model_record_ids = {} @@ -300,7 +327,7 @@ class mail_message(osv.Model): model_obj.check_access_rule(cr, uid, mids, operation, context=context) # fall back on classic operation for other ids - other_ids = set(ids).difference(set(notified_ids), set(document_ids)) + other_ids = set(ids).difference(set(notified_ids), set(document_ids), set(author_ids)) super(mail_message, self).check_access_rule(cr, uid, other_ids, operation, context=None) def create(self, cr, uid, values, context=None): diff --git a/addons/mail/security/ir.model.access.csv b/addons/mail/security/ir.model.access.csv index c89c60756bd..e4f6faf735d 100644 --- a/addons/mail/security/ir.model.access.csv +++ b/addons/mail/security/ir.model.access.csv @@ -5,6 +5,8 @@ access_mail_mail_all,mail.mail.all,model_mail_mail,,1,1,1,1 access_mail_thread,mail.thread,model_mail_thread,base.group_user,1,1,1,0 access_mail_followers_all,mail.followers.all,model_mail_followers,,1,1,1,1 access_mail_notification_all,mail.notification.all,model_mail_notification,,1,1,1,1 +access_mail_group_all,mail.group.all,model_mail_group,,1,0,0,0 access_mail_group,mail.group,model_mail_group,base.group_user,1,1,1,1 +access_mail_alias_all,mail.alias.all,model_mail_alias,,1,0,0,0 access_mail_alias_user,mail.alias,model_mail_alias,base.group_user,1,1,1,0 access_mail_alias_system,mail.alias,model_mail_alias,base.group_system,1,1,1,1 diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py index 1fab5dd1732..01646b6ad43 100644 --- a/addons/mail/tests/test_mail.py +++ b/addons/mail/tests/test_mail.py @@ -23,6 +23,7 @@ import tools from openerp.tests import common from openerp.tools.html_sanitize import html_sanitize +from osv.orm import except_orm MAIL_TEMPLATE = """Return-Path: To: {to} @@ -276,6 +277,78 @@ class test_mail(TestMailMockups): follower_ids = [follower.id for follower in group_pigs.message_follower_ids] self.assertEqual(follower_ids, [user_admin.partner_id.id], 'Admin must be the only Pigs fan') + def test_15_access_rights(self): + cr, uid = self.cr, self.uid + self.res_groups = self.registry('res.groups') + + self.mail_group.message_post(cr, uid, self.group_pigs_id, body='Message') + + # Find Employee group + group_employee_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'base', 'group_user') + group_employee_id = group_employee_ref and group_employee_ref[1] or False + group_employee = self.res_groups.browse(cr, uid, group_employee_id) + + self.group_jobs_id = self.mail_group.create(cr, uid, {'name': 'Jobs', 'public': 'public'}) + + user_bert_id = self.res_users.create(cr, uid, {'name': 'Bert Tartopoils', 'login': 'bert', 'groups_id': [(6, 0, [])]}) + user_raoul_id = self.res_users.create(cr, uid, {'name': 'Raoul Grosbedon', 'login': 'raoul', 'groups_id': [(6, 0, [group_employee_id])]}) + + user_bert = self.res_users.browse(cr, uid, user_bert_id) + user_raoul = self.res_users.browse(cr, uid, user_raoul_id) + + print '-----' + for group in user_bert.groups_id: + print group.name + print '-----' + for group in user_raoul.groups_id: + print group.name + + # Summary + # group_pigs: groups (Employee) + # group_jobs: public + + # ---------------------------------------- + # CASE1: Bert, without groups + # ---------------------------------------- + + # Do: Bert creates a group, should crash because perm_create only for employees + self.assertRaises(except_orm, + self.mail_group.create, + cr, user_bert_id, {'name': 'Bert\'s Group'}) + # Do: Bert reads Jobs basic fields, ok because public = read access on the group + self.mail_group.read(cr, user_bert_id, self.group_jobs_id, ['name', 'description']) + # Do: Bert reads Jobs messages, ok because read access on the group = read access on its messages + jobs_message_ids = self.mail_group.read(cr, user_bert_id, self.group_jobs_id, ['message_ids'])['message_ids'] + self.mail_message.read(cr, user_bert_id, jobs_message_ids) + # Do: Bert reads Jobs followers, ko because partner are accessible to employees or partner manager + jobs_followers_ids = self.mail_group.read(cr, user_bert_id, self.group_jobs_id, ['message_follower_ids'])['message_follower_ids'] + self.assertRaises(except_orm, + self.res_partner.read, + cr, user_bert_id, jobs_followers_ids) + # Do: Bert comments Jobs, ko because not write access on the group and not in the followers + self.assertRaises(except_orm, + self.mail_group.message_post, + cr, user_bert_id, self.group_jobs_id, body='I love Pigs') + + # Do: Bert reads Pigs, should crash because mail.group security=groups only for employee group + self.assertRaises(except_orm, + self.mail_group.read, + cr, user_bert_id, self.group_pigs_id) + + # Do: add Bert to jobs followers + self.mail_group.message_subscribe(cr, uid, [self.group_pigs_id], [user_bert.partner_id.id]) + # Do: Bert comments Jobs, ok because he is in the followers + self.mail_group.message_post(cr, user_bert_id, self.group_jobs_id, body='I love Pigs') + + # ---------------------------------------- + # CASE1: Raoul, employee + # ---------------------------------------- + + # Do: Bert read Jobs, ok because public + self.mail_group.read(cr, user_raoul_id, self.group_pigs_id) + # Do: Bert read Jobs, ok because public + self.mail_group.read(cr, user_raoul_id, self.group_jobs_id) + def test_20_message_post(self): """ Tests designed for message_post. """ cr, uid = self.cr, self.uid From 8821601a87dc1a35253314673252f40a10e93493 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Fri, 14 Sep 2012 11:27:30 +0530 Subject: [PATCH 233/581] [IMP]minor changes bzr revid: sgo@tinyerp.com-20120914055730-c0x2tshrr8j6aa5v --- addons/mail/mail_thread.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 87c2e22d46b..71f22138c90 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -628,7 +628,7 @@ class mail_thread(osv.AbstractModel): partner_ids = [user.partner_id.id for user in self.pool.get('res.users').browse(cr, uid, user_ids, context=context)] return self.message_subscribe(cr, uid, ids, partner_ids, context=context) - def message_subscribe(self, cr, uid, ids, partner_ids, context=None): + def message_subscribe(self, cr, uid, ids, partner_ids,subtype_ids=None, context=None): """ Add partners to the records followers. """ if not subtype_ids: subtype_obj = self.pool.get('mail.message.subtype') From a11e752ea2a1533c7db3e037689a8e132ade8bbd Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Fri, 14 Sep 2012 11:35:46 +0530 Subject: [PATCH 234/581] [IMP]improve code bzr revid: sgo@tinyerp.com-20120914060546-e0uj8dru6c9pym9y --- addons/base_status/base_stage.py | 14 +++++++------- addons/mail/mail_thread.py | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/addons/base_status/base_stage.py b/addons/base_status/base_stage.py index 4b1cc3c6946..2695567e0a1 100644 --- a/addons/base_status/base_stage.py +++ b/addons/base_status/base_stage.py @@ -365,13 +365,13 @@ class base_stage(object): def find_xml_id(self,cr,uid,ids,name,context=None): subtype_obj = self.pool.get('mail.message.subtype') - irmodel_obj = self.pool.get('ir.model.data') - subtype_id = subtype_obj.search(cr,uid,[('res_model','=',self._name),('name','=',name)]) - ir_ids = irmodel_obj.search(cr,uid,[('model','=','mail.message.subtype'),('res_id','in',subtype_id)]) - xml_id = False - ir_model_browse = irmodel_obj.browse(cr,uid,ir_ids) - if ir_model_browse: - xml_id = ir_model_browse[0].name + ir_model_data_obj = self.pool.get('ir.model.data') + subtype_ids = subtype_obj.search(cr,uid,[('res_model','=',self._name),('name','=',name)]) + ir_data_ids = ir_model_data_obj.search(cr,uid,[('model','=','mail.message.subtype'),('res_id','in',subtype_ids)]) + xml_id = 'mail_subtype_comment' + ir_model_data_record = ir_model_data_obj.browse(cr,uid,ir_data_ids) + if ir_model_data_record: + xml_id = ir_model_data_record[0].name return xml_id def case_close_send_note(self, cr, uid, ids, context=None): diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 3f034b8875a..137ba3eccda 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -604,7 +604,7 @@ class mail_thread(osv.AbstractModel): subtype_browse = subtype_obj.browse(cr, uid, ref[1],context=context) if self._name == subtype_browse.res_model: values['subtype_id']=subtype_browse.id - else: + if not subtype_browse.res_model: values['subtype_id']=subtype_browse.id values.update({ 'model': context.get('thread_model', self._name) if thread_id else False, @@ -629,7 +629,7 @@ class mail_thread(osv.AbstractModel): partner_ids = [user.partner_id.id for user in self.pool.get('res.users').browse(cr, uid, user_ids, context=context)] return self.message_subscribe(cr, uid, ids, partner_ids, context=context) - def message_subscribe(self, cr, uid, ids, partner_ids, context=None): + def message_subscribe(self, cr, uid, ids, partner_ids, subtype_ids=None, context=None): """ Add partners to the records followers. """ if not subtype_ids: subtype_obj = self.pool.get('mail.message.subtype') From 6537579a9c927264100e3dc5cb843b930566c6ab Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Fri, 14 Sep 2012 15:02:36 +0530 Subject: [PATCH 235/581] [IMP]improve lead code bzr revid: sgo@tinyerp.com-20120914093236-knk88eqvnbd4slct --- addons/crm/crm_lead.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 924326c7c02..81ca828dc76 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -842,7 +842,7 @@ class crm_lead(base_stage, format_address, osv.osv): def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Override of the (void) default notification method. """ stage_name = self.pool.get('crm.case.stage').name_get(cr, uid, [stage_id], context=context)[0][1] - return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), mail_subtype_new="crm_subtype_stage_change",context=context) + return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), subtype_xml_id="crm_subtype_stage_change",context=context) def case_get_note_msg_prefix(self, cr, uid, lead, context=None): if isinstance(lead, (int, long)): From 9a9a56fa490a8f05991f0182a73daee14048d773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 14 Sep 2012 13:51:07 +0200 Subject: [PATCH 236/581] [WIP] [FIX] mail: fixing access rights: second turn of update. bzr revid: tde@openerp.com-20120914115107-mtgu8soy3ck5xgir --- addons/mail/mail_followers.py | 3 +- addons/mail/mail_mail.py | 8 +- addons/mail/mail_message.py | 126 +++++++++++++++-------- addons/mail/security/ir.model.access.csv | 14 +-- 4 files changed, 94 insertions(+), 57 deletions(-) diff --git a/addons/mail/mail_followers.py b/addons/mail/mail_followers.py index b8f6c21ecf5..23417850f2a 100644 --- a/addons/mail/mail_followers.py +++ b/addons/mail/mail_followers.py @@ -19,6 +19,7 @@ # ############################################################################## +from openerp import SUPERUSER_ID from osv import osv from osv import fields import tools @@ -91,7 +92,7 @@ class mail_notification(osv.Model): :param browse_record message: mail.message to notify """ notify_pids = [] - for partner in self.pool.get('res.partner').browse(cr, uid, partner_ids, context=context): + for partner in self.pool.get('res.partner').browse(cr, SUPERUSER_ID, partner_ids, context=context): # Do not send an email to the writer if partner.user_ids and partner.user_ids[0].id == uid: continue diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py index 6bbfa9bc30e..e9a569a8192 100644 --- a/addons/mail/mail_mail.py +++ b/addons/mail/mail_mail.py @@ -19,13 +19,12 @@ # ############################################################################## -# import ast import base64 import logging import tools -from osv import osv -from osv import fields +from openerp import SUPERUSER_ID +from osv import osv, fields from tools.translate import _ _logger = logging.getLogger(__name__) @@ -134,7 +133,8 @@ class mail_mail(osv.Model): :return: True """ if mail.auto_delete: - mail.unlink() + # done with SUPERUSER_ID to avoid giving large unlink access rights + self.unlink(cr, SUPERUSER_ID, [mail.id], context=context) return True def send_get_mail_subject(self, cr, uid, mail, force=False, partner=None, context=None): diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index cec3b89d9b6..39145d3534b 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -27,6 +27,7 @@ from email.header import decode_header from openerp import SUPERUSER_ID from operator import itemgetter from osv import osv, fields +from osv.orm import except_orm from tools.translate import _ _logger = logging.getLogger(__name__) @@ -269,65 +270,100 @@ class mail_message(osv.Model): cr.execute("""CREATE INDEX mail_message_model_res_id_idx ON mail_message (model, res_id)""") def check_access_rule(self, cr, uid, ids, operation, context=None): - """ mail.message access rule check - - message received (a notification exists) -> ok - - check rules of related document if exists - - fallback on normal mail.message check """ + """ Access rules of mail.message: + - read: if + - notification exist (I receive pushed message) OR + - author_id = pid (I am the author) OR + - I can read the related document if res_model, res_id + - Otherwise: raise + - create: if + - I am in the document message_follower_ids OR + - I can write on the related document if res_model, res_id + - Otherwise: raise + - write: if + - I can write on the related document if res_model, res_id + - Otherwise: raise + - unlink: if + - I can write on the related document if res_model, res_id + - Otherwise: raise + """ + if uid == SUPERUSER_ID: + return if isinstance(ids, (int, long)): ids = [ids] + print 'check-access-rule', uid, ids, operation, context - # Rights - # - read: if - # - notification exist (I receive pushed message) OR - # - author_id = pid (I am the author) OR - # - I can read the related document - # - create: if - # - I can write on the related document OR - # - I am in the document message_follower_ids - # - write: if - # - I can write on the related document - # - unlink: if - # - I can write on the related document - # + # Read mail_message.ids to have their values + model_record_ids = {} + message_values = dict.fromkeys(ids) + cr.execute('SELECT DISTINCT id, model, res_id, author_id FROM mail_message WHERE id = ANY (%s)', (ids,)) + for id, rmod, rid, author_id in cr.fetchall(): + message_values[id] = {'res_model': rmod, 'res_id': rid, 'author_id': author_id} + model_record_ids.setdefault(rmod, set()).add(rid) - if operation != 'read': - notified_ids = [] - author_ids = [] - else: - # read: check for notifications - partner_id = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=None).partner_id.id + partner_id = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=None).partner_id.id + + # R: Check for received notifications -> could become an ir.rule + if operation == 'read': not_obj = self.pool.get('mail.notification') - not_ids = not_obj.search(cr, uid, [ + not_ids = not_obj.search(cr, SUPERUSER_ID, [ ('partner_id', '=', partner_id), ('message_id', 'in', ids), ], context=context) - notified_ids = [notification.message_id.id for notification in not_obj.browse(cr, uid, not_ids, context=context)] + notified_ids = [notification.message_id.id for notification in not_obj.browse(cr, SUPERUSER_ID, not_ids, context=context)] + else: + notified_ids = [] + # R: Check messages you are author -> could become an ir.rule + if operation == 'read': + author_ids = [mid for mid, message in message_values.iteritems() + if message.get('author_id') and message.get('author_id') == partner_id] + else: + author_ids = [] - # read: check messages you are author - author_ids = self.search(cr, uid, [('author_id', '=', partner_id), ('id', 'in', ids)], context=context) + # C: Check message_follower_ids + if operation == 'create': + doc_follower_ids = [] + for model, mids in model_record_ids.items(): + fol_obj = self.pool.get('mail.followers') + fol_ids = fol_obj.search(cr, SUPERUSER_ID, [ + ('res_model', '=', model), + ('res_id', 'in', list(mids)), + ('partner_id', '=', partner_id), + ], context=context) + fol_mids = [follower.res_id for follower in fol_obj.browse(cr, SUPERUSER_ID, fol_ids, context=context)] + doc_follower_ids += [mid for mid, message in message_values.iteritems() + if message.get('res_model') == model and message.get('res_id') in fol_mids] + else: + doc_follower_ids = [] - # if operation != 'create': - # follower_ids = [] - # else: - # write: check I am in the document followers - - # check messages linked to an existing document + # fall back on classic operation for other ids model_record_ids = {} - document_ids = [] - cr.execute('SELECT DISTINCT id, model, res_id FROM mail_message WHERE id = ANY (%s)', (ids,)) - for id, rmod, rid in cr.fetchall(): - if not (rmod and rid): - continue - document_ids.append(id) - model_record_ids.setdefault(rmod, set()).add(rid) + other_ids = set(ids).difference(set(notified_ids), set(author_ids), set(doc_follower_ids)) + for id in other_ids: + model_record_ids.setdefault(message_values[id]['res_model'], set()).add(message_values[id]['res_id']) + + # CRUD: Access rights related to the document + document_related_ids = [] for model, mids in model_record_ids.items(): model_obj = self.pool.get(model) mids = model_obj.exists(cr, uid, mids) - model_obj.check_access_rights(cr, uid, operation) - model_obj.check_access_rule(cr, uid, mids, operation, context=context) + if operation in ['create', 'write', 'unlink']: + model_obj.check_access_rights(cr, uid, 'write') + model_obj.check_access_rule(cr, uid, mids, 'write', context=context) + else: + model_obj.check_access_rights(cr, uid, operation) + model_obj.check_access_rule(cr, uid, mids, operation, context=context) + document_related_ids += [mid for mid, message in message_values.iteritems() + if message.get('res_model') == model and message.get('res_id') in mids] # fall back on classic operation for other ids - other_ids = set(ids).difference(set(notified_ids), set(document_ids), set(author_ids)) + other_ids = set(ids).difference(set(notified_ids), set(author_ids), set(doc_follower_ids), set(document_related_ids)) + + if other_ids: + raise except_orm(_('Access Denied'), + _('The requested operation cannot be completed due to security restrictions. Please contact your system administrator.\n\n(Document type: %s, Operation: %s)') % \ + (self._description, operation)) + super(mail_message, self).check_access_rule(cr, uid, other_ids, operation, context=None) def create(self, cr, uid, values, context=None): @@ -360,11 +396,11 @@ class mail_message(osv.Model): partners_to_notify |= set(partner.id for partner in message.partner_ids) # add all followers and set add them in partner_ids if message.model and message.res_id: - record = self.pool.get(message.model).browse(cr, uid, message.res_id, context=context) + record = self.pool.get(message.model).browse(cr, SUPERUSER_ID, message.res_id, context=context) extra_notified = set(partner.id for partner in record.message_follower_ids) missing_notified = extra_notified - partners_to_notify if missing_notified: - message.write({'partner_ids': [(4, p_id) for p_id in missing_notified]}) + self.write(cr, SUPERUSER_ID, [newid], {'partner_ids': [(4, p_id) for p_id in missing_notified]}, context=context) partners_to_notify |= extra_notified self.pool.get('mail.notification').notify(cr, uid, list(partners_to_notify), newid, context=context) diff --git a/addons/mail/security/ir.model.access.csv b/addons/mail/security/ir.model.access.csv index e4f6faf735d..5f7dff49222 100644 --- a/addons/mail/security/ir.model.access.csv +++ b/addons/mail/security/ir.model.access.csv @@ -1,12 +1,12 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_mail_message_all,mail.message.all,model_mail_message,,1,0,0,0 +access_mail_message_all,mail.message.all,model_mail_message,,1,0,1,0 access_mail_message_group_user,mail.message.group.user,model_mail_message,base.group_user,1,1,1,1 -access_mail_mail_all,mail.mail.all,model_mail_mail,,1,1,1,1 -access_mail_thread,mail.thread,model_mail_thread,base.group_user,1,1,1,0 -access_mail_followers_all,mail.followers.all,model_mail_followers,,1,1,1,1 -access_mail_notification_all,mail.notification.all,model_mail_notification,,1,1,1,1 +access_mail_mail_all,mail.mail.all,model_mail_mail,,0,0,1,0 +access_mail_mail_system,mail.mail.system,model_mail_mail,base.group_system,1,1,1,1 +access_mail_followers_all,mail.followers.all,model_mail_followers,,0,0,0,0 +access_mail_notification_all,mail.notification.all,model_mail_notification,,0,0,0,0 access_mail_group_all,mail.group.all,model_mail_group,,1,0,0,0 -access_mail_group,mail.group,model_mail_group,base.group_user,1,1,1,1 +access_mail_group_user,mail.group.user,model_mail_group,base.group_user,1,1,1,1 access_mail_alias_all,mail.alias.all,model_mail_alias,,1,0,0,0 access_mail_alias_user,mail.alias,model_mail_alias,base.group_user,1,1,1,0 -access_mail_alias_system,mail.alias,model_mail_alias,base.group_system,1,1,1,1 +access_mail_alias_system,mail.alias.system,model_mail_alias,base.group_system,1,1,1,1 From 48993e868eb7f88e9af87fb185e961cbe06b375b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 14 Sep 2012 13:58:15 +0200 Subject: [PATCH 237/581] [REF] mail: tests: moved access rights test into a dedicated file. bzr revid: tde@openerp.com-20120914115815-ge6vy4zjxz1fnxfl --- addons/mail/tests/__init__.py | 5 +- addons/mail/tests/test_mail.py | 73 --------------- addons/mail/tests/test_mail_access_rights.py | 98 ++++++++++++++++++++ 3 files changed, 101 insertions(+), 75 deletions(-) create mode 100644 addons/mail/tests/test_mail_access_rights.py diff --git a/addons/mail/tests/__init__.py b/addons/mail/tests/__init__.py index d63c5634cc3..2d48fa233c4 100644 --- a/addons/mail/tests/__init__.py +++ b/addons/mail/tests/__init__.py @@ -18,10 +18,11 @@ # along with this program. If not, see . # ############################################################################## -from . import test_mail +from . import test_mail, test_mail_access_rights checks = [ test_mail, + test_mail_access_rights, ] -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py index 01646b6ad43..1fab5dd1732 100644 --- a/addons/mail/tests/test_mail.py +++ b/addons/mail/tests/test_mail.py @@ -23,7 +23,6 @@ import tools from openerp.tests import common from openerp.tools.html_sanitize import html_sanitize -from osv.orm import except_orm MAIL_TEMPLATE = """Return-Path: To: {to} @@ -277,78 +276,6 @@ class test_mail(TestMailMockups): follower_ids = [follower.id for follower in group_pigs.message_follower_ids] self.assertEqual(follower_ids, [user_admin.partner_id.id], 'Admin must be the only Pigs fan') - def test_15_access_rights(self): - cr, uid = self.cr, self.uid - self.res_groups = self.registry('res.groups') - - self.mail_group.message_post(cr, uid, self.group_pigs_id, body='Message') - - # Find Employee group - group_employee_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'base', 'group_user') - group_employee_id = group_employee_ref and group_employee_ref[1] or False - group_employee = self.res_groups.browse(cr, uid, group_employee_id) - - self.group_jobs_id = self.mail_group.create(cr, uid, {'name': 'Jobs', 'public': 'public'}) - - user_bert_id = self.res_users.create(cr, uid, {'name': 'Bert Tartopoils', 'login': 'bert', 'groups_id': [(6, 0, [])]}) - user_raoul_id = self.res_users.create(cr, uid, {'name': 'Raoul Grosbedon', 'login': 'raoul', 'groups_id': [(6, 0, [group_employee_id])]}) - - user_bert = self.res_users.browse(cr, uid, user_bert_id) - user_raoul = self.res_users.browse(cr, uid, user_raoul_id) - - print '-----' - for group in user_bert.groups_id: - print group.name - print '-----' - for group in user_raoul.groups_id: - print group.name - - # Summary - # group_pigs: groups (Employee) - # group_jobs: public - - # ---------------------------------------- - # CASE1: Bert, without groups - # ---------------------------------------- - - # Do: Bert creates a group, should crash because perm_create only for employees - self.assertRaises(except_orm, - self.mail_group.create, - cr, user_bert_id, {'name': 'Bert\'s Group'}) - # Do: Bert reads Jobs basic fields, ok because public = read access on the group - self.mail_group.read(cr, user_bert_id, self.group_jobs_id, ['name', 'description']) - # Do: Bert reads Jobs messages, ok because read access on the group = read access on its messages - jobs_message_ids = self.mail_group.read(cr, user_bert_id, self.group_jobs_id, ['message_ids'])['message_ids'] - self.mail_message.read(cr, user_bert_id, jobs_message_ids) - # Do: Bert reads Jobs followers, ko because partner are accessible to employees or partner manager - jobs_followers_ids = self.mail_group.read(cr, user_bert_id, self.group_jobs_id, ['message_follower_ids'])['message_follower_ids'] - self.assertRaises(except_orm, - self.res_partner.read, - cr, user_bert_id, jobs_followers_ids) - # Do: Bert comments Jobs, ko because not write access on the group and not in the followers - self.assertRaises(except_orm, - self.mail_group.message_post, - cr, user_bert_id, self.group_jobs_id, body='I love Pigs') - - # Do: Bert reads Pigs, should crash because mail.group security=groups only for employee group - self.assertRaises(except_orm, - self.mail_group.read, - cr, user_bert_id, self.group_pigs_id) - - # Do: add Bert to jobs followers - self.mail_group.message_subscribe(cr, uid, [self.group_pigs_id], [user_bert.partner_id.id]) - # Do: Bert comments Jobs, ok because he is in the followers - self.mail_group.message_post(cr, user_bert_id, self.group_jobs_id, body='I love Pigs') - - # ---------------------------------------- - # CASE1: Raoul, employee - # ---------------------------------------- - - # Do: Bert read Jobs, ok because public - self.mail_group.read(cr, user_raoul_id, self.group_pigs_id) - # Do: Bert read Jobs, ok because public - self.mail_group.read(cr, user_raoul_id, self.group_jobs_id) - def test_20_message_post(self): """ Tests designed for message_post. """ cr, uid = self.cr, self.uid diff --git a/addons/mail/tests/test_mail_access_rights.py b/addons/mail/tests/test_mail_access_rights.py new file mode 100644 index 00000000000..0a7284098bd --- /dev/null +++ b/addons/mail/tests/test_mail_access_rights.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Business Applications +# Copyright (c) 2012-TODAY OpenERP S.A. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.addons.mail.tests import test_mail +from osv.orm import except_orm + + +class test_mail_access_rights(test_mail.TestMailMockups): + + def setUp(self): + super(test_mail_access_rights, self).setUp() + self.mail_group = self.registry('mail.group') + self.mail_message = self.registry('mail.message') + self.res_users = self.registry('res.users') + self.res_partner = self.registry('res.partner') + + # create a 'pigs' group that will be used through the various tests + self.group_pigs_id = self.mail_group.create(self.cr, self.uid, + {'name': 'Pigs', 'description': 'Fans of Pigs, unite !'}) + + def test_00_access_rights(self): + cr, uid = self.cr, self.uid + self.res_groups = self.registry('res.groups') + # Prepare groups: Pigs (employee), Jobs (public) + self.mail_group.message_post(cr, uid, self.group_pigs_id, body='Message') + self.group_jobs_id = self.mail_group.create(cr, uid, {'name': 'Jobs', 'public': 'public'}) + + # Find Employee group + group_employee_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'base', 'group_user') + group_employee_id = group_employee_ref and group_employee_ref[1] or False + group_employee = self.res_groups.browse(cr, uid, group_employee_id) + + # Create Bert (without groups) and Raoul( employee) + user_bert_id = self.res_users.create(cr, uid, {'name': 'Bert Tartopoils', 'login': 'bert', 'groups_id': [(6, 0, [])]}) + user_raoul_id = self.res_users.create(cr, uid, {'name': 'Raoul Grosbedon', 'login': 'raoul', 'groups_id': [(6, 0, [group_employee_id])]}) + user_bert = self.res_users.browse(cr, uid, user_bert_id) + user_raoul = self.res_users.browse(cr, uid, user_raoul_id) + + # ---------------------------------------- + # CASE1: Bert, without groups + # ---------------------------------------- + print 'Bert CASE1' + # Do: Bert creates a group, should crash because perm_create only for employees + self.assertRaises(except_orm, + self.mail_group.create, + cr, user_bert_id, {'name': 'Bert\'s Group'}) + # Do: Bert reads Jobs basic fields, ok because public = read access on the group + self.mail_group.read(cr, user_bert_id, self.group_jobs_id, ['name', 'description']) + # Do: Bert reads Jobs messages, ok because read access on the group = read access on its messages + jobs_message_ids = self.mail_group.read(cr, user_bert_id, self.group_jobs_id, ['message_ids'])['message_ids'] + self.mail_message.read(cr, user_bert_id, jobs_message_ids) + # Do: Bert reads Jobs followers, ko because partner are accessible to employees or partner manager + jobs_followers_ids = self.mail_group.read(cr, user_bert_id, self.group_jobs_id, ['message_follower_ids'])['message_follower_ids'] + self.assertRaises(except_orm, + self.res_partner.read, + cr, user_bert_id, jobs_followers_ids) + # Do: Bert comments Jobs, ko because no write access on the group and not in the followers + self.assertRaises(except_orm, + self.mail_group.message_post, + cr, user_bert_id, self.group_jobs_id, body='I love Pigs') + # Do: add Bert to jobs followers + self.mail_group.message_subscribe(cr, uid, [self.group_jobs_id], [user_bert.partner_id.id]) + # Do: Bert comments Jobs, ok because he is now in the followers + self.mail_group.message_post(cr, user_bert_id, self.group_jobs_id, body='I love Pigs') + # Do: Bert browse Pigs, ok (no direct browse of partners) + self.mail_group.browse(cr, user_bert_id, self.group_jobs_id) + + # Do: Bert reads Pigs, should crash because mail.group security=groups only for employee group + self.assertRaises(except_orm, + self.mail_group.read, + cr, user_bert_id, self.group_pigs_id) + + # ---------------------------------------- + # CASE1: Raoul, employee + # ---------------------------------------- + print 'Raoul CASE1' + # Do: Bert read Jobs, ok because public + self.mail_group.read(cr, user_raoul_id, self.group_pigs_id) + # Do: Bert read Jobs, ok because public + self.mail_group.read(cr, user_raoul_id, self.group_jobs_id) From 2c60cc4d4c1a171eb52887bbb9c316c06a78c437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 14 Sep 2012 13:58:53 +0200 Subject: [PATCH 238/581] [FIX] mail: in message_get_data, notification search for unread messages is done as SUPERUSER, because we need this info but do not want to give access to notications. bzr revid: tde@openerp.com-20120914115853-xsquf25kz4hhzlyf --- addons/mail/mail_thread.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index d798007275f..7af3331d943 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -30,6 +30,7 @@ import xmlrpclib from email.message import Message from mail_message import decode +from openerp import SUPERUSER_ID from osv import osv, fields from tools.safe_eval import safe_eval as eval @@ -120,14 +121,15 @@ class mail_thread(osv.AbstractModel): res = dict((id, dict(message_unread=False, message_summary='')) for id in ids) user = self.pool.get('res.users').browse(cr, uid, uid, context=context) + # search for unread messages, by reading directly mail.notification, as SUPERUSER notif_obj = self.pool.get('mail.notification') - notif_ids = notif_obj.search(cr, uid, [ + notif_ids = notif_obj.search(cr, SUPERUSER_ID, [ ('partner_id.user_ids', 'in', [uid]), ('message_id.res_id', 'in', ids), ('message_id.model', '=', self._name), ('read', '=', False) ], context=context) - for notif in notif_obj.browse(cr, uid, notif_ids, context=context): + for notif in notif_obj.browse(cr, SUPERUSER_ID, notif_ids, context=context): res[notif.message_id.res_id]['message_unread'] = True for thread in self.browse(cr, uid, ids, context=context): From 136456aadb9d9ead8dfa46e29b10f4ab1bc16c3a Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Fri, 14 Sep 2012 17:35:30 +0530 Subject: [PATCH 239/581] [FIX]: Fix context value for default destination location value.. bzr revid: atp@tinyerp.com-20120914120530-ovjei36ndpruj1a6 --- addons/stock/stock_view.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml index 154927a2f19..92db42d8e00 100644 --- a/addons/stock/stock_view.xml +++ b/addons/stock/stock_view.xml @@ -1010,6 +1010,9 @@ + + {'address_out_id': partner_id, 'picking_type': type} +
          From 85fe3bca8efda814c0c7c876aaec1c62ecd52f4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 14 Sep 2012 14:20:24 +0200 Subject: [PATCH 240/581] [FIX] mail_group_menu: user->partner_id fetch done as SUPERUSER, because even anonymous people will have to perform a search for menu entries (public groups). bzr revid: tde@openerp.com-20120914122024-1rk8t8ooj33v0aaa --- addons/mail/mail_group_menu.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/mail/mail_group_menu.py b/addons/mail/mail_group_menu.py index 25b85bb7b22..090d1cd00fb 100644 --- a/addons/mail/mail_group_menu.py +++ b/addons/mail/mail_group_menu.py @@ -19,9 +19,10 @@ # ############################################################################## +from openerp import SUPERUSER_ID from osv import osv from osv import fields -from tools.translate import _ + class ir_ui_menu(osv.osv): """ Override of ir.ui.menu class. When adding mail_thread module, each @@ -38,13 +39,14 @@ class ir_ui_menu(osv.osv): def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False): """ Override to take off menu entries (mail.group) the user is not - following. """ + following. Access are done using SUPERUSER_ID to avoid access + rights issues for an internal back-end algorithm. """ ids = super(ir_ui_menu, self).search(cr, uid, args, offset=0, limit=None, order=order, context=context, count=False) - partner_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id + partner_id = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=context).partner_id.id follower_obj = self.pool.get('mail.followers') for menu in self.browse(cr, uid, ids, context=context): if menu.mail_group_id: - sub_ids = follower_obj.search(cr, uid, [ + sub_ids = follower_obj.search(cr, SUPERUSER_ID, [ ('partner_id', '=', partner_id), ('res_model', '=', 'mail.group'), ('res_id', '=', menu.mail_group_id.id) ], context=context) From 2909c507af21c380b56eab2895417653cb24530a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 14 Sep 2012 14:21:39 +0200 Subject: [PATCH 241/581] [FIX] mail_message: message_read evaluates the message domain as SUPERUSER (because even anonymous people will have a wall, and therefore evaluate notifications.partner_id.users_ids). bzr revid: tde@openerp.com-20120914122139-dv1xlinpgvd4dw7g --- addons/mail/mail_message.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index 39145d3534b..35703e790f5 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -222,7 +222,7 @@ class mail_message(osv.Model): limit = limit or self._message_read_limit context = context or {} if not ids: - ids = self.search(cr, uid, domain, context=context, limit=limit) + ids = self.search(cr, SUPERUSER_ID, domain, context=context, limit=limit) messages = self.browse(cr, uid, ids, context=context) result = [] From 994441ae4a2af6d55248d431682ce64cd943e2a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 14 Sep 2012 15:52:45 +0200 Subject: [PATCH 242/581] [FIX] mail_thread: copy do not copy messages and followers. bzr revid: tde@openerp.com-20120914135245-roldmjl5x8tqlood --- addons/mail/mail_thread.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 7af3331d943..88f7246a1ff 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -121,7 +121,7 @@ class mail_thread(osv.AbstractModel): res = dict((id, dict(message_unread=False, message_summary='')) for id in ids) user = self.pool.get('res.users').browse(cr, uid, uid, context=context) - # search for unread messages, by reading directly mail.notification, as SUPERUSER + # search for unread messages, by reading directly mail.notification, as SUPERUSER notif_obj = self.pool.get('mail.notification') notif_ids = notif_obj.search(cr, SUPERUSER_ID, [ ('partner_id.user_ids', 'in', [uid]), @@ -198,6 +198,13 @@ class mail_thread(osv.AbstractModel): fol_obj.unlink(cr, uid, fol_ids, context=context) return super(mail_thread, self).unlink(cr, uid, ids, context=context) + def copy(self, cr, uid, id, default=None, context=None): + default = default or {} + default['message_ids'] = [] + default['message_comment_ids'] = [] + default['message_follower_ids'] = [] + return super(mail_thread, self).copy(cr, uid, id, default=default, context=context) + #------------------------------------------------------ # mail.message wrappers and tools #------------------------------------------------------ From 40215cd64afe59339e43bc901d0e3086373ec727 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 14 Sep 2012 16:18:49 +0200 Subject: [PATCH 243/581] [REM] mail: removed unnecessary group and category for mail_manager. bzr revid: tde@openerp.com-20120914141849-i10vo6zjhclvgpu9 --- addons/mail/security/mail_security.xml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/addons/mail/security/mail_security.xml b/addons/mail/security/mail_security.xml index a12314e6f25..632b43754f8 100644 --- a/addons/mail/security/mail_security.xml +++ b/addons/mail/security/mail_security.xml @@ -2,20 +2,6 @@ - - - Social and Sharing Tools - - 26 - - - - - Mail manager - - - - Mail.group: access only public and joined groups From fa5d90e46aee2b66a9e2ab936ed36cdf7bbbcdf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 14 Sep 2012 16:19:22 +0200 Subject: [PATCH 244/581] [IMP] mail: security: added all access for system group on mail.notification and mail.followers. bzr revid: tde@openerp.com-20120914141922-it1c4df7k72y8vsq --- addons/mail/security/ir.model.access.csv | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/mail/security/ir.model.access.csv b/addons/mail/security/ir.model.access.csv index 5f7dff49222..b5b46acfcfa 100644 --- a/addons/mail/security/ir.model.access.csv +++ b/addons/mail/security/ir.model.access.csv @@ -4,7 +4,9 @@ access_mail_message_group_user,mail.message.group.user,model_mail_message,base.g access_mail_mail_all,mail.mail.all,model_mail_mail,,0,0,1,0 access_mail_mail_system,mail.mail.system,model_mail_mail,base.group_system,1,1,1,1 access_mail_followers_all,mail.followers.all,model_mail_followers,,0,0,0,0 +access_mail_followers_system,mail.followers.system,model_mail_followers,base.group_system,1,1,1,1 access_mail_notification_all,mail.notification.all,model_mail_notification,,0,0,0,0 +access_mail_notification_aystem,mail.notification.system,model_mail_notification,base.group_system,1,1,1,1 access_mail_group_all,mail.group.all,model_mail_group,,1,0,0,0 access_mail_group_user,mail.group.user,model_mail_group,base.group_user,1,1,1,1 access_mail_alias_all,mail.alias.all,model_mail_alias,,1,0,0,0 From 708d76885721959a13715173be3c12407a1aa99e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 14 Sep 2012 16:19:55 +0200 Subject: [PATCH 245/581] [FIX] auth_signup: fixed duplicate xml_id, causing troubles when installing portal. bzr revid: tde@openerp.com-20120914141955-h1lvs2g5thz9urlo --- addons/auth_signup/auth_signup_data.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/auth_signup/auth_signup_data.xml b/addons/auth_signup/auth_signup_data.xml index 4a6bf9ae4b9..2ad868362b5 100644 --- a/addons/auth_signup/auth_signup_data.xml +++ b/addons/auth_signup/auth_signup_data.xml @@ -13,7 +13,7 @@ - + auth_signup.template_user_id From f641508fe31bd359075992262c48ef80700a6c4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 14 Sep 2012 18:16:33 +0200 Subject: [PATCH 246/581] [FIX] mail_message: fixed check_access_rule and misc acces issues. bzr revid: tde@openerp.com-20120914161633-bpg65bl6i0wxu8k2 --- addons/mail/mail_message.py | 53 +++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index 35703e790f5..ffaabf7c8f7 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -71,7 +71,7 @@ class mail_message(osv.Model): def _get_unread(self, cr, uid, ids, name, arg, context=None): """ Compute if the message is unread by the current user. """ res = dict((id, {'unread': False}) for id in ids) - partner_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id + partner_id = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0] notif_obj = self.pool.get('mail.notification') notif_ids = notif_obj.search(cr, uid, [ ('partner_id', 'in', [partner_id]), @@ -156,10 +156,11 @@ class mail_message(osv.Model): def _message_dict_get(self, cr, uid, msg, context=None): """ Return a dict representation of the message browse record. """ - attachment_ids = [{'id': attach[0], 'name': attach[1]} for attach in self.pool.get('ir.attachment').name_get(cr, uid, [x.id for x in msg.attachment_ids], context=context)] - author_id = self.pool.get('res.partner').name_get(cr, uid, [msg.author_id.id], context=context)[0] - author_user_id = self.pool.get('res.users').name_get(cr, uid, [msg.author_id.user_ids[0].id], context=context)[0] - partner_ids = self.pool.get('res.partner').name_get(cr, uid, [x.id for x in msg.partner_ids], context=context) + # TDE TEMP: use SUPERUSER_ID + attachment_ids = [{'id': attach[0], 'name': attach[1]} for attach in self.pool.get('ir.attachment').name_get(cr, SUPERUSER_ID, [x.id for x in msg.attachment_ids], context=context)] + author_id = self.pool.get('res.partner').name_get(cr, SUPERUSER_ID, [msg.author_id.id], context=context)[0] + author_user_id = self.pool.get('res.users').name_get(cr, SUPERUSER_ID, [msg.author_id.user_ids[0].id], context=context)[0] + partner_ids = self.pool.get('res.partner').name_get(cr, SUPERUSER_ID, [x.id for x in msg.partner_ids], context=context) return { 'id': msg.id, 'type': msg.type, @@ -291,7 +292,7 @@ class mail_message(osv.Model): return if isinstance(ids, (int, long)): ids = [ids] - print 'check-access-rule', uid, ids, operation, context + partner_id = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=None)['partner_id'][0] # Read mail_message.ids to have their values model_record_ids = {} @@ -299,11 +300,10 @@ class mail_message(osv.Model): cr.execute('SELECT DISTINCT id, model, res_id, author_id FROM mail_message WHERE id = ANY (%s)', (ids,)) for id, rmod, rid, author_id in cr.fetchall(): message_values[id] = {'res_model': rmod, 'res_id': rid, 'author_id': author_id} - model_record_ids.setdefault(rmod, set()).add(rid) + if rmod: + model_record_ids.setdefault(rmod, set()).add(rid) - partner_id = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=None).partner_id.id - - # R: Check for received notifications -> could become an ir.rule + # Read: Check for received notifications -> could become an ir.rule, but not till we do not have a many2one variable field if operation == 'read': not_obj = self.pool.get('mail.notification') not_ids = not_obj.search(cr, SUPERUSER_ID, [ @@ -313,14 +313,14 @@ class mail_message(osv.Model): notified_ids = [notification.message_id.id for notification in not_obj.browse(cr, SUPERUSER_ID, not_ids, context=context)] else: notified_ids = [] - # R: Check messages you are author -> could become an ir.rule + # Read: Check messages you are author -> could become an ir.rule, but not till we do not have a many2one variable field if operation == 'read': author_ids = [mid for mid, message in message_values.iteritems() if message.get('author_id') and message.get('author_id') == partner_id] else: author_ids = [] - # C: Check message_follower_ids + # Create: Check message_follower_ids if operation == 'create': doc_follower_ids = [] for model, mids in model_record_ids.items(): @@ -332,15 +332,16 @@ class mail_message(osv.Model): ], context=context) fol_mids = [follower.res_id for follower in fol_obj.browse(cr, SUPERUSER_ID, fol_ids, context=context)] doc_follower_ids += [mid for mid, message in message_values.iteritems() - if message.get('res_model') == model and message.get('res_id') in fol_mids] + if message.get('res_model') == model and message.get('res_id') in fol_mids] else: doc_follower_ids = [] - # fall back on classic operation for other ids + # Calculate remaining ids, and related model/res_ids model_record_ids = {} other_ids = set(ids).difference(set(notified_ids), set(author_ids), set(doc_follower_ids)) for id in other_ids: - model_record_ids.setdefault(message_values[id]['res_model'], set()).add(message_values[id]['res_id']) + if message_values[id]['res_model']: + model_record_ids.setdefault(message_values[id]['res_model'], set()).add(message_values[id]['res_id']) # CRUD: Access rights related to the document document_related_ids = [] @@ -356,15 +357,13 @@ class mail_message(osv.Model): document_related_ids += [mid for mid, message in message_values.iteritems() if message.get('res_model') == model and message.get('res_id') in mids] - # fall back on classic operation for other ids + # Calculate remaining ids: if not void, raise an error other_ids = set(ids).difference(set(notified_ids), set(author_ids), set(doc_follower_ids), set(document_related_ids)) - - if other_ids: - raise except_orm(_('Access Denied'), - _('The requested operation cannot be completed due to security restrictions. Please contact your system administrator.\n\n(Document type: %s, Operation: %s)') % \ - (self._description, operation)) - - super(mail_message, self).check_access_rule(cr, uid, other_ids, operation, context=None) + if not other_ids: + return + raise except_orm(_('Access Denied'), + _('The requested operation cannot be completed due to security restrictions. Please contact your system administrator.\n\n(Document type: %s, Operation: %s)') % \ + (self._description, operation)) def create(self, cr, uid, values, context=None): if not values.get('message_id') and values.get('res_id') and values.get('model'): @@ -373,6 +372,14 @@ class mail_message(osv.Model): self.notify(cr, uid, newid, context=context) return newid + def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'): + """ Override to explicitely call check_access_rule, that is not called + by the ORM. It instead directly fetches ir.rules and apply them. """ + res = super(mail_message, self).read(cr, uid, ids, fields=fields, context=context, load=load) + # print '-->', res + self.check_access_rule(cr, uid, ids, 'read', context=context) + return res + def unlink(self, cr, uid, ids, context=None): # cascade-delete attachments that are directly attached to the message (should only happen # for mail.messages that act as parent for a standalone mail.mail record). From 55ec1211c040f250bd2af4d6ea7209a3b5a32ac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 14 Sep 2012 18:16:57 +0200 Subject: [PATCH 247/581] [FIX] mail: security: added read access on notifications. bzr revid: tde@openerp.com-20120914161657-bst7gz4d3er1i2rl --- addons/mail/security/ir.model.access.csv | 2 +- addons/mail/security/mail_security.xml | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/addons/mail/security/ir.model.access.csv b/addons/mail/security/ir.model.access.csv index b5b46acfcfa..cc6a934956f 100644 --- a/addons/mail/security/ir.model.access.csv +++ b/addons/mail/security/ir.model.access.csv @@ -5,7 +5,7 @@ access_mail_mail_all,mail.mail.all,model_mail_mail,,0,0,1,0 access_mail_mail_system,mail.mail.system,model_mail_mail,base.group_system,1,1,1,1 access_mail_followers_all,mail.followers.all,model_mail_followers,,0,0,0,0 access_mail_followers_system,mail.followers.system,model_mail_followers,base.group_system,1,1,1,1 -access_mail_notification_all,mail.notification.all,model_mail_notification,,0,0,0,0 +access_mail_notification_all,mail.notification.all,model_mail_notification,,1,0,0,0 access_mail_notification_aystem,mail.notification.system,model_mail_notification,base.group_system,1,1,1,1 access_mail_group_all,mail.group.all,model_mail_group,,1,0,0,0 access_mail_group_user,mail.group.user,model_mail_group,base.group_user,1,1,1,1 diff --git a/addons/mail/security/mail_security.xml b/addons/mail/security/mail_security.xml index 632b43754f8..7da03664b82 100644 --- a/addons/mail/security/mail_security.xml +++ b/addons/mail/security/mail_security.xml @@ -10,5 +10,15 @@ ['|', '|', ('public', '=', 'public'), ('message_follower_ids', 'in', [user.id]), '&', ('public','=','groups'), ('group_public_id','in', [x.id for x in user.groups_id])] + + + From ee84313321b12d38a46a0f89c5519ec63442fd5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 14 Sep 2012 18:17:37 +0200 Subject: [PATCH 248/581] [IMP] mail: improved test about access rights. Still WIP. bzr revid: tde@openerp.com-20120914161737-3tpf6g0clzfq1fur --- addons/mail/tests/test_mail_access_rights.py | 94 ++++++++++++++++---- 1 file changed, 75 insertions(+), 19 deletions(-) diff --git a/addons/mail/tests/test_mail_access_rights.py b/addons/mail/tests/test_mail_access_rights.py index 0a7284098bd..31e99b53930 100644 --- a/addons/mail/tests/test_mail_access_rights.py +++ b/addons/mail/tests/test_mail_access_rights.py @@ -27,44 +27,103 @@ class test_mail_access_rights(test_mail.TestMailMockups): def setUp(self): super(test_mail_access_rights, self).setUp() + cr, uid = self.cr, self.uid self.mail_group = self.registry('mail.group') self.mail_message = self.registry('mail.message') + self.mail_notification = self.registry('mail.notification') self.res_users = self.registry('res.users') + self.res_groups = self.registry('res.groups') self.res_partner = self.registry('res.partner') # create a 'pigs' group that will be used through the various tests self.group_pigs_id = self.mail_group.create(self.cr, self.uid, {'name': 'Pigs', 'description': 'Fans of Pigs, unite !'}) - def test_00_access_rights(self): + # Find Employee group + group_employee_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'base', 'group_user') + self.group_employee_id = group_employee_ref and group_employee_ref[1] or False + + # Create Bert (without groups) and Raoul( employee) + self.user_bert_id = self.res_users.create(cr, uid, {'name': 'Bert Tartopoils', 'login': 'bert', 'groups_id': [(6, 0, [])]}) + self.user_raoul_id = self.res_users.create(cr, uid, {'name': 'Raoul Grosbedon', 'login': 'raoul', 'groups_id': [(6, 0, [self.group_employee_id])]}) + self.user_bert = self.res_users.browse(cr, uid, self.user_bert_id) + self.partner_bert_id = self.user_bert.partner_id.id + self.user_raoul = self.res_users.browse(cr, uid, self.user_raoul_id) + self.partner_raoul_id = self.user_raoul.partner_id.id + + def test_00_mail_message_read_access_rights(self): + """ Test basic mail_message read access rights. """ cr, uid = self.cr, self.uid - self.res_groups = self.registry('res.groups') + partner_bert_id, partner_raoul_id = self.partner_bert_id, self.partner_raoul_id + user_bert_id, user_raoul_id = self.user_bert_id, self.user_raoul_id + # Prepare groups: Pigs (employee), Jobs (public) self.mail_group.message_post(cr, uid, self.group_pigs_id, body='Message') self.group_jobs_id = self.mail_group.create(cr, uid, {'name': 'Jobs', 'public': 'public'}) - # Find Employee group - group_employee_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'base', 'group_user') - group_employee_id = group_employee_ref and group_employee_ref[1] or False - group_employee = self.res_groups.browse(cr, uid, group_employee_id) + # ---------------------------------------- + # CASE1: Bert, basic mail.message read access + # ---------------------------------------- - # Create Bert (without groups) and Raoul( employee) - user_bert_id = self.res_users.create(cr, uid, {'name': 'Bert Tartopoils', 'login': 'bert', 'groups_id': [(6, 0, [])]}) - user_raoul_id = self.res_users.create(cr, uid, {'name': 'Raoul Grosbedon', 'login': 'raoul', 'groups_id': [(6, 0, [group_employee_id])]}) - user_bert = self.res_users.browse(cr, uid, user_bert_id) - user_raoul = self.res_users.browse(cr, uid, user_raoul_id) + # Do: create a new mail.message + message_id = self.mail_message.create(cr, uid, {'body': 'My Body'}) + # Test: Bert reads the message, crash because not notification/not in doc followers/not read on doc + self.assertRaises(except_orm, self.mail_message.read, + cr, user_bert_id, message_id) + # Do: message is pushed to Bert + notif_id = self.mail_notification.create(cr, uid, {'message_id': message_id, 'partner_id': partner_bert_id}) + # Test: Bert reads the message, ok because notification pushed + self.mail_message.read(cr, user_bert_id, message_id) + # Do: remove notification + self.mail_notification.unlink(cr, uid, notif_id) + # Test: Bert reads the message, crash because not notification/not in doc followers/not read on doc + self.assertRaises(except_orm, self.mail_message.read, + cr, self.user_bert_id, message_id) + # Do: Bert is now the author + self.mail_message.write(cr, uid, [message_id], {'author_id': partner_bert_id}) + # Test: Bert reads the message, ok because Bert is the author + self.mail_message.read(cr, user_bert_id, message_id) + # Do: Bert is not the author anymore + self.mail_message.write(cr, uid, [message_id], {'author_id': partner_raoul_id}) + # Test: Bert reads the message, crash because not notification/not in doc followers/not read on doc + self.assertRaises(except_orm, self.mail_message.read, + cr, user_bert_id, message_id) + # Do: message is attached to a document Bert can read, Jobs + self.mail_message.write(cr, uid, [message_id], {'model': 'mail.group', 'res_id': self.group_jobs_id}) + # Test: Bert reads the message, ok because linked to a doc he is allowed to read + self.mail_message.read(cr, user_bert_id, message_id) + # Do: message is attached to a document Bert cannot read, Pigs + self.mail_message.write(cr, uid, [message_id], {'model': 'mail.group', 'res_id': self.group_pigs_id}) + # Test: Bert reads the message, crash because not notification/not in doc followers/not read on doc + self.assertRaises(except_orm, self.mail_message.read, + cr, user_bert_id, message_id) + + def test_05_mail_message_search_access_rights(self): + """ Test mail_message search override about access rights. """ + self.assertTrue(1 == 0, 'Test not implemented') + + def test_10_mail_flow_access_rights(self): + """ Test a Chatter-looks alike flow. """ + cr, uid = self.cr, self.uid + partner_bert_id, partner_raoul_id = self.partner_bert_id, self.partner_raoul_id + user_bert_id, user_raoul_id = self.user_bert_id, self.user_raoul_id + + # Prepare groups: Pigs (employee), Jobs (public) + self.mail_group.message_post(cr, uid, self.group_pigs_id, body='Message') + self.group_jobs_id = self.mail_group.create(cr, uid, {'name': 'Jobs', 'public': 'public'}) # ---------------------------------------- # CASE1: Bert, without groups # ---------------------------------------- - print 'Bert CASE1' # Do: Bert creates a group, should crash because perm_create only for employees self.assertRaises(except_orm, self.mail_group.create, cr, user_bert_id, {'name': 'Bert\'s Group'}) # Do: Bert reads Jobs basic fields, ok because public = read access on the group self.mail_group.read(cr, user_bert_id, self.group_jobs_id, ['name', 'description']) - # Do: Bert reads Jobs messages, ok because read access on the group = read access on its messages + # Do: Bert browse Pigs, ok (no direct browse of partners) + self.mail_group.browse(cr, user_bert_id, self.group_jobs_id) + # Do: Bert reads Jobs messages, ok because read access on the group => read access on its messages jobs_message_ids = self.mail_group.read(cr, user_bert_id, self.group_jobs_id, ['message_ids'])['message_ids'] self.mail_message.read(cr, user_bert_id, jobs_message_ids) # Do: Bert reads Jobs followers, ko because partner are accessible to employees or partner manager @@ -77,11 +136,9 @@ class test_mail_access_rights(test_mail.TestMailMockups): self.mail_group.message_post, cr, user_bert_id, self.group_jobs_id, body='I love Pigs') # Do: add Bert to jobs followers - self.mail_group.message_subscribe(cr, uid, [self.group_jobs_id], [user_bert.partner_id.id]) + self.mail_group.message_subscribe(cr, uid, [self.group_jobs_id], [partner_bert_id]) # Do: Bert comments Jobs, ok because he is now in the followers self.mail_group.message_post(cr, user_bert_id, self.group_jobs_id, body='I love Pigs') - # Do: Bert browse Pigs, ok (no direct browse of partners) - self.mail_group.browse(cr, user_bert_id, self.group_jobs_id) # Do: Bert reads Pigs, should crash because mail.group security=groups only for employee group self.assertRaises(except_orm, @@ -91,8 +148,7 @@ class test_mail_access_rights(test_mail.TestMailMockups): # ---------------------------------------- # CASE1: Raoul, employee # ---------------------------------------- - print 'Raoul CASE1' - # Do: Bert read Jobs, ok because public + # Do: Bert read Pigs, ok because public self.mail_group.read(cr, user_raoul_id, self.group_pigs_id) - # Do: Bert read Jobs, ok because public + # Do: Bert read Jobs, ok because group_public_id = employee self.mail_group.read(cr, user_raoul_id, self.group_jobs_id) From 3f63690a5a57120199e853d1b0dc83a0f12d5bc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 17 Sep 2012 11:51:10 +0200 Subject: [PATCH 249/581] [FIX] mail_message: in a search of function field on mail.message, replaced a browse by a read, to avoid access rights issues (user.partner_id). bzr revid: tde@openerp.com-20120917095110-w5lxoykyrk3aa3yf --- addons/mail/mail_message.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index ffaabf7c8f7..d2bafcac826 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -89,7 +89,7 @@ class mail_message(osv.Model): read_cond = '(read = false or read is null)' else: read_cond = 'read = true' - partner_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id + partner_id = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0] cr.execute("SELECT message_id FROM mail_notification "\ "WHERE partner_id = %%s AND %s" % read_cond, (partner_id,)) @@ -157,10 +157,14 @@ class mail_message(osv.Model): def _message_dict_get(self, cr, uid, msg, context=None): """ Return a dict representation of the message browse record. """ # TDE TEMP: use SUPERUSER_ID - attachment_ids = [{'id': attach[0], 'name': attach[1]} for attach in self.pool.get('ir.attachment').name_get(cr, SUPERUSER_ID, [x.id for x in msg.attachment_ids], context=context)] - author_id = self.pool.get('res.partner').name_get(cr, SUPERUSER_ID, [msg.author_id.id], context=context)[0] - author_user_id = self.pool.get('res.users').name_get(cr, SUPERUSER_ID, [msg.author_id.user_ids[0].id], context=context)[0] - partner_ids = self.pool.get('res.partner').name_get(cr, SUPERUSER_ID, [x.id for x in msg.partner_ids], context=context) + # attachment_ids = [{'id': attach[0], 'name': attach[1]} for attach in self.pool.get('ir.attachment').name_get(cr, SUPERUSER_ID, [x.id for x in msg.attachment_ids], context=context)] + attachment_ids = [] + # author_id = self.pool.get('res.partner').name_get(cr, SUPERUSER_ID, [msg.author_id.id], context=context)[0] + author_id = False + # author_user_id = self.pool.get('res.users').name_get(cr, SUPERUSER_ID, [msg.author_id.user_ids[0].id], context=context)[0] + author_user_id = False + # partner_ids = self.pool.get('res.partner').name_get(cr, SUPERUSER_ID, [x.id for x in msg.partner_ids], context=context) + partner_ids = [] return { 'id': msg.id, 'type': msg.type, From 418b35c33b0ae33aedc14ca9b48ef8629ec02677 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 17 Sep 2012 11:52:03 +0200 Subject: [PATCH 250/581] [FIX] Porta: fixed access rights (removed duplicate of basic access rights, added read rights on res_partner, to see the topbar avatar and group followers). Set news and jobs group as public. bzr revid: tde@openerp.com-20120917095203-3v6q49qk9sxe0b4o --- addons/portal/portal_data.xml | 2 ++ addons/portal/security/ir.model.access.csv | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/portal/portal_data.xml b/addons/portal/portal_data.xml index eb06ca656d6..8014519895d 100644 --- a/addons/portal/portal_data.xml +++ b/addons/portal/portal_data.xml @@ -13,6 +13,7 @@ Company's news + @@ -25,6 +26,7 @@ Company's jobs + diff --git a/addons/portal/security/ir.model.access.csv b/addons/portal/security/ir.model.access.csv index 56b3ae5f269..e8ed29dc3cb 100644 --- a/addons/portal/security/ir.model.access.csv +++ b/addons/portal/security/ir.model.access.csv @@ -4,9 +4,7 @@ access_widget_all,access.portal.widget.all,model_res_portal_widget,,1,0,0,0 access_manager,access.portal.manager,model_res_portal,group_portal_manager,1,1,1,1 access_widget_manager,access.portal.widget.manager,model_res_portal_widget,group_portal_manager,1,1,1,1 access_mail_message,mail.message,mail.model_mail_message,group_portal_member,1,0,1,1 -access_mail_message_all,mail.message.all,mail.model_mail_message,group_portal_member,1,0,0,0 access_mail_thread,mail.thread,mail.model_mail_thread,group_portal_member,1,0,0,0 access_mail_followers,mail.followers,mail.model_mail_followers,group_portal_member,1,0,1,1 access_mail_notification,mail.notification,mail.model_mail_notification,group_portal_member,1,0,1,0 -access_mail_group,mail.group,mail.model_mail_group,group_portal_member,1,0,0,0 -access_mail_alias,mail.alias,mail.model_mail_alias,group_portal_member,1,0,0,0 +access_res_partner_portal,res.partner.portal,base.model_res_partner,group_portal_member,1,0,0,0 From 6a624f01248845fd88f9d1b2c451ac1d2ced18ef Mon Sep 17 00:00:00 2001 From: Vijaykumar Baladaniya Date: Mon, 17 Sep 2012 15:33:56 +0530 Subject: [PATCH 251/581] [FIX] Stop the subscription. bzr revid: vba@tinyerp.com-20120917100356-qxo6yoxe3p2710zs --- addons/subscription/subscription.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/subscription/subscription.py b/addons/subscription/subscription.py index 45916e04aee..c961e82bd5e 100644 --- a/addons/subscription/subscription.py +++ b/addons/subscription/subscription.py @@ -72,7 +72,7 @@ class subscription_subscription(osv.osv): 'state': fields.selection([('draft','Draft'),('running','Running'),('done','Done')], 'Status'), 'doc_source': fields.reference('Source Document', required=True, selection=_get_document_types, size=128, help="User can choose the source document on which he wants to create documents"), 'doc_lines': fields.one2many('subscription.subscription.history', 'subscription_id', 'Documents created', readonly=True), - 'cron_id': fields.many2one('ir.cron', 'Cron Job', help="Scheduler which runs on subscription"), + 'cron_id': fields.many2one('ir.cron', 'Cron Job', help="Scheduler which runs on subscription", ondelete='cascade', states={'running':[('readonly',True)], 'done':[('readonly',True)]}), 'note': fields.text('Notes', help="Description or Summary of Subscription"), } _defaults = { From 809bf8336ab5f48c131599b2c738f3679b5e292b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 17 Sep 2012 12:07:06 +0200 Subject: [PATCH 252/581] [FIX] Portal: fixed the fix, because public should not be in an eval. bzr revid: tde@openerp.com-20120917100706-lbl7lrkqb6i77w7r --- addons/portal/portal_data.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/portal/portal_data.xml b/addons/portal/portal_data.xml index 8014519895d..aadc7fc5db4 100644 --- a/addons/portal/portal_data.xml +++ b/addons/portal/portal_data.xml @@ -13,7 +13,7 @@ Company's news - + public @@ -26,7 +26,7 @@ Company's jobs - + public From d3e328d3cc4df6066d05bdbb2b79eeb824916c63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 17 Sep 2012 15:48:32 +0200 Subject: [PATCH 253/581] [FIX] Portal: fixed demo portal user, linked to asustek, overriding default values, makign some tests crash. Demo portal user should have its own partner. bzr revid: tde@openerp.com-20120917134832-9t5w8ax3gw3v2y8e --- addons/portal/portal_demo.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/portal/portal_demo.xml b/addons/portal/portal_demo.xml index 1ace02f3d7d..3fedc721bbd 100644 --- a/addons/portal/portal_demo.xml +++ b/addons/portal/portal_demo.xml @@ -9,7 +9,9 @@ portal - + + + demo@portal.wrong.address From 198fd2b12cd6a9e0079752ce2f4f366f9b8e3e26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 17 Sep 2012 15:48:49 +0200 Subject: [PATCH 254/581] [IMP] Portal: removed access on res.partner. bzr revid: tde@openerp.com-20120917134849-ehbv3oq0lhmm19jh --- addons/portal/security/ir.model.access.csv | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/portal/security/ir.model.access.csv b/addons/portal/security/ir.model.access.csv index e8ed29dc3cb..0a5027ad812 100644 --- a/addons/portal/security/ir.model.access.csv +++ b/addons/portal/security/ir.model.access.csv @@ -7,4 +7,3 @@ access_mail_message,mail.message,mail.model_mail_message,group_portal_member,1,0 access_mail_thread,mail.thread,mail.model_mail_thread,group_portal_member,1,0,0,0 access_mail_followers,mail.followers,mail.model_mail_followers,group_portal_member,1,0,1,1 access_mail_notification,mail.notification,mail.model_mail_notification,group_portal_member,1,0,1,0 -access_res_partner_portal,res.partner.portal,base.model_res_partner,group_portal_member,1,0,0,0 From 7f309d2df0dc14ff12e68a286750f399c00f530d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 17 Sep 2012 17:01:29 +0200 Subject: [PATCH 255/581] [FIX] Mail: fixed mail_followers widget, now taking into account crash when reading message_follower_ids, to disply only the number of followers, when the user does not have read access on the partners (ex: portal members). bzr revid: tde@openerp.com-20120917150129-7ahagbvopo2iqoe5 --- addons/mail/mail_group_view.xml | 1 + addons/mail/mail_thread.py | 10 +++++----- addons/mail/static/src/js/mail_followers.js | 19 ++++++++++++++++++- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/addons/mail/mail_group_view.xml b/addons/mail/mail_group_view.xml index 31beba80ecc..bac7c22ee09 100644 --- a/addons/mail/mail_group_view.xml +++ b/addons/mail/mail_group_view.xml @@ -81,6 +81,7 @@
          + diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 6b4db7bc7d1..ea6f795bc61 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -119,7 +119,7 @@ class mail_thread(osv.AbstractModel): def _get_message_data(self, cr, uid, ids, name, args, context=None): res = dict((id, dict(message_unread=False, message_summary='')) for id in ids) - user = self.pool.get('res.users').browse(cr, uid, uid, context=context) + partner_id = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0] # search for unread messages, by reading directly mail.notification, as SUPERUSER notif_obj = self.pool.get('mail.notification') @@ -132,10 +132,10 @@ class mail_thread(osv.AbstractModel): for notif in notif_obj.browse(cr, SUPERUSER_ID, notif_ids, context=context): res[notif.message_id.res_id]['message_unread'] = True - for thread in self.browse(cr, uid, ids, context=context): - cls = res[thread.id]['message_unread'] and ' class="oe_kanban_mail_new"' or '' - res[thread.id]['message_summary'] = "9 %d + %d" % (cls, len(thread.message_comment_ids), len(thread.message_follower_ids)) - res[thread.id]['message_is_follower'] = user.partner_id.id in [follower.id for follower in thread.message_follower_ids] + for thread in self.read(cr, uid, ids, ['message_follower_ids', 'message_comment_ids', 'message_ids'], context=context): + cls = res[thread['id']]['message_unread'] and ' class="oe_kanban_mail_new"' or '' + res[thread['id']]['message_summary'] = "9 %d + %d" % (cls, len(thread['message_comment_ids']), len(thread['message_follower_ids'])) + res[thread['id']]['message_is_follower'] = partner_id in thread['message_follower_ids'] return res def _search_unread(self, cr, uid, obj=None, name=None, domain=None, context=None): diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js index cf33bd64640..c3c59428920 100644 --- a/addons/mail/static/src/js/mail_followers.js +++ b/addons/mail/static/src/js/mail_followers.js @@ -88,7 +88,24 @@ openerp_mail_followers = function(session, mail) { }, fetch_followers: function (value_) { - return this.ds_follow.call('read', [value_, ['name', 'user_ids']]).pipe(this.proxy('display_followers')); + this.value = value_; + this.message_is_follower = this.getParent().fields.message_is_follower && this.getParent().fields.message_is_follower.get_value() || undefined; + return this.ds_follow.call('read', [value_, ['name', 'user_ids']]).pipe(this.proxy('display_followers'), this.proxy('display_generic')); + }, + + + /* Display generic info about follower, for people not having access to res_partner */ + display_generic: function (error, event) { + event.preventDefault(); + var node_user_list = this.$el.find('ul.oe_mail_followers_display').empty(); + this.$el.find('div.oe_mail_recthread_followers h4').html(this.options.title + ' (' + this.value.length + ')'); + if (this.message_is_follower) { + this.$el.find('button.oe_mail_button_follow').hide(); + this.$el.find('button.oe_mail_button_unfollow').show(); } + else { + this.$el.find('button.oe_mail_button_follow').show(); + this.$el.find('button.oe_mail_button_unfollow').hide(); } + return $.when(); }, /** Display the followers, evaluate is_follower directly */ From 0fea3331ae827d9a26cde8359fe77ff048e77b9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 17 Sep 2012 17:01:57 +0200 Subject: [PATCH 256/581] [TEST] Portal: added some basic tests about access rights. bzr revid: tde@openerp.com-20120917150157-hyhfrfo249aovfs3 --- addons/portal/tests/test_portal.py | 40 +++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/addons/portal/tests/test_portal.py b/addons/portal/tests/test_portal.py index 2c301228859..abbcab58dac 100644 --- a/addons/portal/tests/test_portal.py +++ b/addons/portal/tests/test_portal.py @@ -21,15 +21,18 @@ from openerp.addons.mail.tests import test_mail from openerp.tools import append_content_to_html +from osv.orm import except_orm class test_portal(test_mail.TestMailMockups): def setUp(self): super(test_portal, self).setUp() + cr, uid = self.cr, self.uid self.ir_model = self.registry('ir.model') self.mail_group = self.registry('mail.group') self.mail_mail = self.registry('mail.mail') + self.mail_message = self.registry('mail.message') self.res_users = self.registry('res.users') self.res_partner = self.registry('res.partner') @@ -37,7 +40,42 @@ class test_portal(test_mail.TestMailMockups): self.group_pigs_id = self.mail_group.create(self.cr, self.uid, {'name': 'Pigs', 'description': 'Fans of Pigs, unite !'}) - def test_00_mail_invite(self): + # Find Portal group + group_portal_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'portal', 'group_portal_member') + self.group_portal_id = group_portal_ref and group_portal_ref[1] or False + + # Create Chell (portal user) + self.user_chell_id = self.res_users.create(cr, uid, {'name': 'Chell Gladys', 'login': 'chell', 'groups_id': [(6, 0, [self.group_portal_id])]}) + self.user_chell = self.res_users.browse(cr, uid, self.user_chell_id) + self.partner_chell_id = self.user_chell.partner_id.id + + def test_00_access_rights(self): + """ Test basic mail_message and mail_group access rights for portal users. """ + cr, uid = self.cr, self.uid + partner_chell_id = self.partner_chell_id + user_chell_id = self.user_chell_id + + # Prepare group: Pigs (portal) + self.mail_group.message_post(cr, uid, self.group_pigs_id, body='Message') + self.mail_group.write(cr, uid, [self.group_pigs_id], {'name': 'Jobs', 'public': 'groups', 'group_public_id': self.group_portal_id}) + + # ---------------------------------------- + # CASE1: Chell will use the Chatter + # ---------------------------------------- + + # Do: Chell reads Pigs messages, ok because restricted to portal group + message_ids = self.mail_group.read(cr, user_chell_id, self.group_pigs_id, ['message_ids'])['message_ids'] + self.mail_message.read(cr, user_chell_id, message_ids) + # Do: Chell posts a message on Pigs, crash because can not write on group or is not in the followers + self.assertRaises(except_orm, + self.mail_group.message_post, + cr, user_chell_id, self.group_pigs_id, body='Message') + # Do: Chell is added to Pigs followers + self.mail_group.message_subscribe(cr, uid, [self.group_pigs_id], [partner_chell_id]) + # Test: Chell posts a message on Pigs, ok because in the followers + self.mail_group.message_post(cr, user_chell_id, self.group_pigs_id, body='Message') + + def test_50_mail_invite(self): cr, uid = self.cr, self.uid user_admin = self.res_users.browse(cr, uid, uid) self.mail_invite = self.registry('mail.wizard.invite') From abf16c58c637ddfd57823b3a3faddb8dc4b632c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 17 Sep 2012 17:35:33 +0200 Subject: [PATCH 257/581] [IMP] Addons: added invisible field for message_is_follower; note: reidented view; account_voucher: reidented one view. bzr revid: tde@openerp.com-20120917153533-u102ds3eo1xr1mnt --- addons/account/account_invoice_view.xml | 2 + .../account_voucher/account_voucher_view.xml | 145 ++++----- .../voucher_payment_receipt_view.xml | 2 + .../voucher_sales_purchase_view.xml | 2 + addons/analytic/analytic_view.xml | 1 + addons/base_calendar/crm_meeting_view.xml | 1 + addons/crm/crm_lead_view.xml | 2 + addons/crm/crm_phonecall_view.xml | 1 + addons/crm_claim/crm_claim_view.xml | 1 + addons/crm_helpdesk/crm_helpdesk_view.xml | 1 + addons/event/event_view.xml | 2 + addons/hr_expense/hr_expense_view.xml | 1 + addons/hr_holidays/hr_holidays_view.xml | 2 + addons/hr_recruitment/hr_recruitment_view.xml | 1 + addons/idea/idea_view.xml | 1 + addons/mail/res_partner_view.xml | 1 + addons/mrp/mrp_view.xml | 6 +- addons/mrp_operations/mrp_operations_view.xml | 1 + addons/mrp_repair/mrp_repair_view.xml | 1 + addons/note/note_view.xml | 283 +++++++++--------- addons/procurement/procurement_view.xml | 1 + addons/product/product_view.xml | 1 + addons/project/project_view.xml | 2 + addons/project_issue/project_issue_view.xml | 1 + addons/purchase/purchase_view.xml | 1 + .../purchase_requisition_view.xml | 5 +- addons/sale/sale_view.xml | 1 + addons/stock/stock_view.xml | 2 + 28 files changed, 253 insertions(+), 218 deletions(-) diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index 1c4d83106ca..7a58b359008 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -278,6 +278,7 @@
          +
          @@ -437,6 +438,7 @@
          +
          diff --git a/addons/account_voucher/account_voucher_view.xml b/addons/account_voucher/account_voucher_view.xml index 07647d02fe3..bf8c7a9e3cb 100644 --- a/addons/account_voucher/account_voucher_view.xml +++ b/addons/account_voucher/account_voucher_view.xml @@ -39,80 +39,81 @@ account.voucher
          -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - - +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          From 33f60023e85949ac8e6076830e14711e2d553c4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 18 Sep 2012 12:14:23 +0200 Subject: [PATCH 265/581] [FIX] mail: replaced a superuser_id by a classic read with uid on partner in mail_group and mail_thread; fixed access rigths definition in portal that are not necessary. bzr revid: tde@openerp.com-20120918101423-pizn2tyrwta5o93n --- addons/mail/mail_group_menu.py | 2 +- addons/mail/mail_thread.py | 2 +- addons/portal/security/ir.model.access.csv | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/addons/mail/mail_group_menu.py b/addons/mail/mail_group_menu.py index 090d1cd00fb..707ece6a180 100644 --- a/addons/mail/mail_group_menu.py +++ b/addons/mail/mail_group_menu.py @@ -42,7 +42,7 @@ class ir_ui_menu(osv.osv): following. Access are done using SUPERUSER_ID to avoid access rights issues for an internal back-end algorithm. """ ids = super(ir_ui_menu, self).search(cr, uid, args, offset=0, limit=None, order=order, context=context, count=False) - partner_id = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=context).partner_id.id + partner_id = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0] follower_obj = self.pool.get('mail.followers') for menu in self.browse(cr, uid, ids, context=context): if menu.mail_group_id: diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 7e6803a22f2..c671dd55ec4 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -139,7 +139,7 @@ class mail_thread(osv.AbstractModel): return res def _search_unread(self, cr, uid, obj=None, name=None, domain=None, context=None): - partner_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id + partner_id = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0] res = {} notif_obj = self.pool.get('mail.notification') notif_ids = notif_obj.search(cr, uid, [ diff --git a/addons/portal/security/ir.model.access.csv b/addons/portal/security/ir.model.access.csv index 0a5027ad812..c3ff27bdfdf 100644 --- a/addons/portal/security/ir.model.access.csv +++ b/addons/portal/security/ir.model.access.csv @@ -4,6 +4,3 @@ access_widget_all,access.portal.widget.all,model_res_portal_widget,,1,0,0,0 access_manager,access.portal.manager,model_res_portal,group_portal_manager,1,1,1,1 access_widget_manager,access.portal.widget.manager,model_res_portal_widget,group_portal_manager,1,1,1,1 access_mail_message,mail.message,mail.model_mail_message,group_portal_member,1,0,1,1 -access_mail_thread,mail.thread,mail.model_mail_thread,group_portal_member,1,0,0,0 -access_mail_followers,mail.followers,mail.model_mail_followers,group_portal_member,1,0,1,1 -access_mail_notification,mail.notification,mail.model_mail_notification,group_portal_member,1,0,1,0 From c7ee41cfbb98a07cc6549338601ccf4e08ba5922 Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Tue, 18 Sep 2012 13:57:17 +0200 Subject: [PATCH 266/581] [FIX] wording in comments bzr revid: abo@openerp.com-20120918115717-p57dpbdpbht1m4wr --- openerp/addons/base/res/res_users.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index 1b167ff5077..7d68d0a5726 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -52,7 +52,7 @@ class groups(osv.osv): else: res[g.id] = g.name return res - + def _search_group(self, cr, uid, obj, name, args, context=None): operand = args[0][2] operator = args[0][1] @@ -64,7 +64,7 @@ class groups(osv.osv): group_name = values[1] where = ['|',('category_id.name', operator, application_name)] + where return where - + _columns = { 'name': fields.char('Name', size=64, required=True, translate=True), 'users': fields.many2many('res.users', 'res_groups_users_rel', 'gid', 'uid', 'Users'), @@ -138,7 +138,7 @@ class res_users(osv.osv): def _get_password(self, cr, uid, ids, arg, karg, context=None): return dict.fromkeys(ids, '') - + _columns = { 'id': fields.integer('ID'), 'login_date': fields.date('Latest connection', select=1), @@ -261,9 +261,9 @@ class res_users(osv.osv): return self.pool.get('res.partner').fields_view_get(cr, uid, view_id, view_type, context, toolbar, submenu) return super(res_users, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar, submenu) - # User can write to a few of its own fields (but not her groups for example) + # User can write on a few of his own fields (but not his groups for example) SELF_WRITEABLE_FIELDS = ['password', 'signature', 'action_id', 'company_id', 'email', 'name', 'image', 'image_medium', 'image_small', 'lang', 'tz'] - # user can read a few of its own fields + # User can read a few of his own fields SELF_READABLE_FIELDS = ['signature', 'company_id', 'email', 'name', 'image', 'image_medium', 'image_small', 'lang', 'tz', 'groups_id', 'partner_id'] def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'): @@ -506,14 +506,14 @@ class res_users(osv.osv): """ assert group_ext_id and '.' in group_ext_id, "External ID must be fully qualified" module, ext_id = group_ext_id.split('.') - cr.execute("""SELECT 1 FROM res_groups_users_rel WHERE uid=%s AND gid IN + cr.execute("""SELECT 1 FROM res_groups_users_rel WHERE uid=%s AND gid IN (SELECT res_id FROM ir_model_data WHERE module=%s AND name=%s)""", (uid, module, ext_id)) return bool(cr.fetchone()) # -# Extension of res.groups and res.users with a relation for "implied" or +# Extension of res.groups and res.users with a relation for "implied" or # "inherited" groups. Once a user belongs to a group, it automatically belongs # to the implied groups (transitively). # From d63b7de7cced46aedcc1142fafc6911168ee76aa Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Tue, 18 Sep 2012 14:02:30 +0200 Subject: [PATCH 267/581] [IMP] use const SUPERUSER_ID instead of int 1 bzr revid: abo@openerp.com-20120918120230-h8b1qtaiev5jbpwr --- openerp/addons/base/res/res_users.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index 7d68d0a5726..439ed1258ac 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -278,7 +278,7 @@ class res_users(osv.osv): break else: # safe fields only, so we read as super-user to bypass access rights - uid = 1 + uid = SUPERUSER_ID result = super(res_users, self).read(cr, uid, ids, fields=fields, context=context, load=load) canwrite = self.pool.get('ir.model.access').check(cr, uid, 'res.users', 'write', False) From df5b4656179c89d5e1a0b7671193d976d1cd90ea Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Tue, 18 Sep 2012 15:10:23 +0200 Subject: [PATCH 268/581] [FIX] typo in comment bzr revid: abo@openerp.com-20120918131023-stpvmvyg0df3hgv1 --- addons/portal_crm/wizard/contact.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/portal_crm/wizard/contact.py b/addons/portal_crm/wizard/contact.py index 036993e1720..755b422f8ea 100644 --- a/addons/portal_crm/wizard/contact.py +++ b/addons/portal_crm/wizard/contact.py @@ -61,11 +61,11 @@ class crm_contact_us(osv.TransientModel): def create(self, cr, uid, values, context=None): """ - Since they potentially sensitive, we don't want any user to be able to - read datas generated through this module. That's why we'll write those - information in the crm.lead table and leave blank entries in the - portal_crm.crm_contact_us table. This is why the create() method is - overwritten. + Since they are potentially sensitive, we don't want any user to be able + to read datas generated through this module. That's why we'll write + those information directly in the crm.lead table and leave blank + entries in the portal_crm.crm_contact_us table. + This is why the create() method is overwritten. """ crm_lead = self.pool.get('crm.lead') From 968325cb39e3b98993948040c8dcbe25fbbc3f30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Tue, 18 Sep 2012 15:37:32 +0200 Subject: [PATCH 269/581] [WIP] point_of_sale: first test of new TPE API bzr revid: fva@openerp.com-20120918133732-q7za0r3dcggem8mw --- addons/point_of_sale/controllers/main.py | 16 +- addons/point_of_sale/static/src/js/devices.js | 104 +++++----- addons/point_of_sale/static/src/js/screens.js | 181 ++++++++++++++---- addons/point_of_sale/static/src/js/widgets.js | 6 +- addons/point_of_sale/static/src/xml/pos.xml | 11 +- 5 files changed, 222 insertions(+), 96 deletions(-) diff --git a/addons/point_of_sale/controllers/main.py b/addons/point_of_sale/controllers/main.py index e6976dd319c..3d80fd53e24 100644 --- a/addons/point_of_sale/controllers/main.py +++ b/addons/point_of_sale/controllers/main.py @@ -119,21 +119,21 @@ class PointOfSaleController(openerpweb.Controller): return @openerpweb.jsonrequest - def payment_request(self, request, price, method, info): + def payment_request(self, request, price): """ The PoS will activate the method payment """ - print "payment_request: price:"+str(price)+" method:"+str(method)+" info:"+str(info) - return + print "payment_request: price:"+str(price) + return 'ok' @openerpweb.jsonrequest - def is_payment_accepted(self, request): - print "is_payment_accepted" - return 'waiting_for_payment' + def payment_status(self, request): + print "payment_status" + return { 'status':'waiting' } @openerpweb.jsonrequest - def payment_canceled(self, request): - print "payment_canceled" + def payment_cancel(self, request): + print "payment_cancel" return @openerpweb.jsonrequest diff --git a/addons/point_of_sale/static/src/js/devices.js b/addons/point_of_sale/static/src/js/devices.js index a26d8ca7154..142d35bd340 100644 --- a/addons/point_of_sale/static/src/js/devices.js +++ b/addons/point_of_sale/static/src/js/devices.js @@ -14,7 +14,14 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal this.weighting = false; this.paying = false; - this.payment_status = 'waiting_for_payment'; + this.default_payment_status = { + status: 'waiting', + message: '', + payment_method: undefined, + receipt_client: undefined, + receipt_shop: undefined, + }; + this.custom_payment_status = this.default_payment_status; this.connection = new instance.web.JsonRPC(); this.connection.setup(url); @@ -23,16 +30,21 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal this.notifications = {}; }, - message : function(name,params,success_callback, error_callback){ - success_callback = success_callback || function(){}; - error_callback = error_callback || function(){}; - + message : function(name,params){ + var ret = new $.Deferred(); var callbacks = this.notifications[name] || []; for(var i = 0; i < callbacks.length; i++){ callbacks[i](params); } - this.connection.rpc('/pos/'+name, params || {}, success_callback, error_callback); + this.connection.rpc('/pos/'+name, params || {}, + function(result){ + ret.resolve(result); + }, + function(error){ + ret.reject(error); + }); + return ret; }, // this allows the client to be notified when a proxy call is made. The notification @@ -47,23 +59,23 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal //a product has been scanned and recognized with success // ean is a parsed ean object scan_item_success: function(ean){ - this.message('scan_item_success',{ean: ean}); + return this.message('scan_item_success',{ean: ean}); }, // a product has been scanned but not recognized // ean is a parsed ean object scan_item_error_unrecognized: function(ean){ - this.message('scan_item_error_unrecognized',{ean: ean}); + return this.message('scan_item_error_unrecognized',{ean: ean}); }, //the client is asking for help help_needed: function(){ - this.message('help_needed'); + return this.message('help_needed'); }, //the client does not need help anymore help_canceled: function(){ - this.message('help_canceled'); + return this.message('help_canceled'); }, //the client is starting to weight @@ -72,7 +84,7 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal this.weight = 0; this.weighting = true; this.bypass_proxy = false; - this.message('weighting_start'); + return this.message('weighting_start'); } }, @@ -84,11 +96,12 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal if(this.bypass_proxy){ return this.weight; }else{ - this.message('weighting_read_kg',{},function(weight){ - if(self.weighting && !self.bypass_proxy){ - self.weight = weight; - } - }); + this.message('weighting_read_kg',{}) + .then(function(weight){ + if(self.weighting && !self.bypass_proxy){ + self.weight = weight; + } + }); return this.weight; } }, @@ -104,77 +117,76 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal this.weight = 0; this.weighting = false; this.bypass_proxy = false; - this.message('weighting_end'); + return this.message('weighting_end'); }, // the pos asks the client to pay 'price' units - // method: 'mastercard' | 'cash' | ... ? TBD - // info: 'extra information to display on the payment terminal' ... ? TBD - payment_request: function(price, method, info){ + payment_request: function(price){ + var ret = new $.Deferred(); this.paying = true; - this.payment_status = 'waiting_for_payment'; - this.message('payment_request',{'price':price,'method':method,'info':info}); + this.custom_payment_status = this.default_payment_status; + return this.message('payment_request',{'price':price}); }, - // is called at regular interval after a payment request to see if the client - // has paid the required money - // returns 'waiting_for_payment' | 'payment_accepted' | 'payment_rejected' - is_payment_accepted: function(){ - var self = this; + payment_status: function(){ if(this.bypass_proxy){ this.bypass_proxy = false; - return this.payment_status; + return (new $.Deferred()).resolve(this.custom_payment_status); }else{ - this.message('is_payment_accepted', {}, function(payment_status){ - if(self.paying){ - self.payment_status = payment_status; - } - }); - return this.payment_status; + return this.message('payment_status'); } }, // override what the proxy says and accept the payment debug_accept_payment: function(){ this.bypass_proxy = true; - this.payment_status = 'payment_accepted'; + this.custom_payment_status = { + status: 'paid', + message: 'Successfull Payment, have a nice day', + payment_method: 'AMEX', + receipt_client: 'bla', + receipt_shop: 'bla', + }; }, // override what the proxy says and reject the payment debug_reject_payment: function(){ this.bypass_proxy = true; - this.payment_status = 'payment_rejected'; + this.custom_payment_status = { + status: 'error-rejected', + message: 'Sorry you don\'t have enough money :(', + }; }, // the client cancels his payment - payment_canceled: function(){ + payment_cancel: function(){ this.paying = false; - this.payment_status = 'waiting_for_payment'; - this.message('payment_canceled'); + this.custom_payment_status = 'waiting_for_payment'; + return this.message('payment_cancel'); }, // called when the client logs in or starts to scan product transaction_start: function(){ - this.message('transaction_start'); + return this.message('transaction_start'); }, // called when the clients has finished his interaction with the machine transaction_end: function(){ - this.message('transaction_end'); + return this.message('transaction_end'); }, // called when the POS turns to cashier mode cashier_mode_activated: function(){ - this.message('cashier_mode_activated'); + return this.message('cashier_mode_activated'); }, // called when the POS turns to client mode cashier_mode_deactivated: function(){ - this.message('cashier_mode_deactivated'); + return this.message('cashier_mode_deactivated'); }, // ask for the cashbox (the physical box where you store the cash) to be opened open_cashbox: function(){ - this.message('open_cashbox'); + return this.message('open_cashbox'); }, /* ask the printer to print a receipt @@ -216,12 +228,12 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal * } */ print_receipt: function(receipt){ - this.message('print_receipt',{receipt: receipt}); + return this.message('print_receipt',{receipt: receipt}); }, // asks the proxy to print an invoice in pdf form ( used to print invoices generated by the server ) print_pdf_invoice: function(pdfinvoice){ - this.message('print_pdf_invoice',{pdfinvoice: pdfinvoice}); + return this.message('print_pdf_invoice',{pdfinvoice: pdfinvoice}); }, }); diff --git a/addons/point_of_sale/static/src/js/screens.js b/addons/point_of_sale/static/src/js/screens.js index d2c79f19928..1ad03c5ead1 100644 --- a/addons/point_of_sale/static/src/js/screens.js +++ b/addons/point_of_sale/static/src/js/screens.js @@ -154,7 +154,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa }, barcode_product_screen: 'products', //if defined, this screen will be loaded when a product is scanned - barcode_product_error_popup: 'error', //if defined, this popup will be loaded when there's an error in the popup + barcode_product_error_popup: 'error-product', //if defined, this popup will be loaded when there's an error in the popup // what happens when a product is scanned : // it will add the product to the order and go to barcode_product_screen. Or show barcode_product_error_popup if @@ -411,6 +411,9 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa self.pos_widget.screen_selector.set_user_mode('cashier'); }, }); + this.$('.footer .button').off('click').click(function(){ + self.pos_widget.screen_selector.close_popup(); + }); }, close:function(){ this._super(); @@ -419,12 +422,12 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa }, }); - module.ErrorProductNotRecognizedPopupWidget = module.ErrorPopupWidget.extend({ - template:'ErrorProductNotRecognizedPopupWidget', + module.ProductErrorPopupWidget = module.ErrorPopupWidget.extend({ + template:'ProductErrorPopupWidget', }); - module.ErrorNoSessionPopupWidget = module.ErrorPopupWidget.extend({ - template:'ErrorNoSessionPopupWidget', + module.ErrorSessionPopupWidget = module.ErrorPopupWidget.extend({ + template:'ErrorSessionPopupWidget', }); module.ScaleInviteScreenWidget = module.ScreenWidget.extend({ @@ -539,6 +542,60 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa }, }); + // the JobQueue schedules a sequence of 'jobs'. each job is + // a function returning a deferred. the queue waits for each job to finish + // before launching the next. Each job can also be scheduled with a delay. + // the queue jobqueue is used to prevent parallel requests to the payment terminal. + + module.JobQueue = function(){ + var queue = []; + var running = false; + var run = function(){ + if(queue.length > 0){ + running = true; + var job = queue.shift(); + setTimeout(function(){ + var def = job.fun(); + if(def){ + def.then(run); + }else{ + run(); + } + },job.delay || 0); + }else{ + running = false; + } + }; + + // adds a job to the schedule. + this.schedule = function(fun, delay){ + queue.push({fun:fun, delay:delay}); + if(!running){ + run(); + } + } + + // remove all jobs from the schedule + this.clear = function(){ + queue = []; + }; + }; + + /* + module.BasicPaymentScreen = module.ScreenWidget.extend({ + queue: new JobQueue(), + start_payment_transaction: function(){ + }, + update_payment_transaction: function(){ + }, + cancel_payment_transaction: function(){ + }, + show: function(){ + this._super(); + }, + }); + */ + module.ClientPaymentScreenWidget = module.ScreenWidget.extend({ template:'ClientPaymentScreenWidget', @@ -548,50 +605,102 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa show: function(){ this._super(); var self = this; + + this.queue = new module.JobQueue(); + this.canceled = false; + this.paid = false; - this.pos.proxy.payment_request(this.pos.get('selectedOrder').getDueLeft(),'card','info'); //TODO TOTAL - - this.intervalID = setInterval(function(){ - var payment = self.pos.proxy.is_payment_accepted(); - if(payment === 'payment_accepted'){ - clearInterval(this.intervalID); - - var currentOrder = self.pos.get('selectedOrder'); - - //we get the first cashregister marked as self-checkout - var selfCheckoutRegisters = []; - for(var i = 0; i < self.pos.get('cashRegisters').models.length; i++){ - var cashregister = self.pos.get('cashRegisters').models[i]; - if(cashregister.self_checkout_payment_method){ - selfCheckoutRegisters.push(cashregister); + // initiates the connection to the payment terminal and starts the update requests + this.start = function(){ + var def = new $.Deferred(); + console.log("START"); + self.pos.proxy.payment_request(self.pos.get('selectedOrder').getDueLeft()) + .then(function(ack){ + if(ack === 'ok'){ + self.queue.schedule(self.update); + }else if(ack.indexOf('error') === 0){ + console.error('cannot make payment. TODO'); + }else{ + console.error('unknown payment request return value:',ack); } - } - - var cashregister = selfCheckoutRegisters[0] || self.pos.get('cashRegisters').models[0]; - currentOrder.addPaymentLine(cashregister); - self.pos.push_order(currentOrder.exportAsJSON()) - currentOrder.destroy(); - self.pos.proxy.transaction_end(); - self.pos_widget.screen_selector.set_current_screen(self.next_screen); - }else if(payment === 'payment_rejected'){ - clearInterval(self.intervalID); - //TODO show a tryagain thingie ? + console.log("START_END"); + def.resolve(); + }); + return def; + }; + + // gets updated status from the payment terminal and performs the appropriate consequences + this.update = function(){ + console.log("UPDATE"); + var def = new $.Deferred(); + if(self.canceled){ + console.log("UPDATE_END"); + return def.resolve(); } - },500); + self.pos.proxy.payment_status() + .then(function(status){ + if(status.status === 'paid'){ + + var currentOrder = self.pos.get('selectedOrder'); + + //we get the first cashregister marked as self-checkout + var selfCheckoutRegisters = []; + for(var i = 0; i < self.pos.get('cashRegisters').models.length; i++){ + var cashregister = self.pos.get('cashRegisters').models[i]; + if(cashregister.self_checkout_payment_method){ + selfCheckoutRegisters.push(cashregister); + } + } + + var cashregister = selfCheckoutRegisters[0] || self.pos.get('cashRegisters').models[0]; + currentOrder.addPaymentLine(cashregister); + self.pos.push_order(currentOrder.exportAsJSON()) + currentOrder.destroy(); + self.pos.proxy.transaction_end(); + self.pos_widget.screen_selector.set_current_screen(self.next_screen); + self.paid = true; + }else if(status.status.indexOf('error') === 0){ + console.error('error in payment request. TODO'); + }else if(status.status === 'waiting'){ + self.queue.schedule(self.update,200); + }else{ + console.error('unknown status value:',status.status); + } + console.log("UPDATE_END"); + def.resolve(); + }); + return def; + } + + // cancels a payment. + this.cancel = function(){ + console.log("CANCEL"); + if(!self.paid && !self.canceled){ + self.canceled = true; + self.pos.proxy.payment_cancel(); + self.pos_widget.screen_selector.set_current_screen(self.previous_screen); + self.queue.clear(); + } + console.log("CANCEL_END"); + return (new $.Deferred()).resolve(); + } + + this.queue.schedule(this.start); this.add_action_button({ label: 'back', icon: '/point_of_sale/static/src/img/icons/png48/go-previous.png', click: function(){ - clearInterval(this.intervalID); - self.pos.proxy.payment_canceled(); - self.pos_widget.screen_selector.set_current_screen(self.previous_screen); + self.queue.schedule(self.cancel); } }); }, close: function(){ + if(this.queue){ + this.queue.schedule(this.cancel); + } + //TODO CANCEL this._super(); - clearInterval(this.intervalID); }, }); diff --git a/addons/point_of_sale/static/src/js/widgets.js b/addons/point_of_sale/static/src/js/widgets.js index f4d16b527c8..47a527a010d 100644 --- a/addons/point_of_sale/static/src/js/widgets.js +++ b/addons/point_of_sale/static/src/js/widgets.js @@ -687,7 +687,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa 'print_receipt', 'print_pdf_invoice', 'weighting_read_kg', - 'is_payment_accepted', + 'payment_status', ], minimized: false, start: function(){ @@ -898,10 +898,10 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa this.error_popup = new module.ErrorPopupWidget(this, {}); this.error_popup.appendTo($('.point-of-sale')); - this.error_product_popup = new module.ErrorProductNotRecognizedPopupWidget(this, {}); + this.error_product_popup = new module.ProductErrorPopupWidget(this, {}); this.error_product_popup.appendTo($('.point-of-sale')); - this.error_session_popup = new module.ErrorNoSessionPopupWidget(this, {}); + this.error_session_popup = new module.ErrorSessionPopupWidget(this, {}); this.error_session_popup.appendTo($('.point-of-sale')); this.choose_receipt_popup = new module.ChooseReceiptPopupWidget(this, {}); diff --git a/addons/point_of_sale/static/src/xml/pos.xml b/addons/point_of_sale/static/src/xml/pos.xml index 7af3c2c2255..53177b5ac4e 100644 --- a/addons/point_of_sale/static/src/xml/pos.xml +++ b/addons/point_of_sale/static/src/xml/pos.xml @@ -327,15 +327,20 @@
          - + + - + From 8353cc1ca909dd1e31729cd5af11e1752f4f5f81 Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Tue, 18 Sep 2012 16:14:21 +0200 Subject: [PATCH 270/581] [FIX] res_partner.py: read countries as SUPERUSER res_users.py: add login to the readable fields bzr revid: abo@openerp.com-20120918141421-k6awa3xf6x2nx691 --- openerp/addons/base/res/res_partner.py | 7 ++++--- openerp/addons/base/res/res_users.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index 008e8048a5d..6f793012b29 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -22,6 +22,7 @@ import math import openerp from osv import osv, fields +from openerp import SUPERUSER_ID import re import tools from tools.translate import _ @@ -33,7 +34,7 @@ from lxml import etree class format_address(object): def fields_view_get_address(self, cr, uid, arch, context={}): user_obj = self.pool.get('res.users') - fmt = user_obj.browse(cr, uid, uid,context).company_id.country_id + fmt = user_obj.browse(cr, SUPERUSER_ID, uid, context).company_id.country_id fmt = fmt and fmt.address_format layouts = { '%(city)s %(state_code)s\n%(zip)s': """ @@ -392,7 +393,7 @@ class res_partner(osv.osv, format_address): - otherwise: default, everything is set as the name """ match = re.search(r'([^\s,<@]+@[^>\s,]+)', text) if match: - email = match.group(1) + email = match.group(1) name = text[:text.index(email)].replace('"','').replace('<','').strip() else: name, email = text, '' @@ -440,7 +441,7 @@ class res_partner(osv.osv, format_address): def find_or_create(self, cr, uid, email, context=None): """ Find a partner with the given ``email`` or use :py:method:`~.name_create` to create one - + :param str email: email-like string, which should contain at least one email, e.g. ``"Raoul Grosbedon "``""" assert email, 'an email is required for find_or_create to work' diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index 439ed1258ac..3b05cc74ff2 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -264,7 +264,7 @@ class res_users(osv.osv): # User can write on a few of his own fields (but not his groups for example) SELF_WRITEABLE_FIELDS = ['password', 'signature', 'action_id', 'company_id', 'email', 'name', 'image', 'image_medium', 'image_small', 'lang', 'tz'] # User can read a few of his own fields - SELF_READABLE_FIELDS = ['signature', 'company_id', 'email', 'name', 'image', 'image_medium', 'image_small', 'lang', 'tz', 'groups_id', 'partner_id'] + SELF_READABLE_FIELDS = ['signature', 'company_id', 'login', 'email', 'name', 'image', 'image_medium', 'image_small', 'lang', 'tz', 'groups_id', 'partner_id'] def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'): def override_password(o): From bbae9cdc00af41f890b4bac9e7b19c96b235313d Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Tue, 18 Sep 2012 16:17:24 +0200 Subject: [PATCH 271/581] [FIX] read user login and email with a read() instead of a browse() this way, we prevent the auto-loading of all the user's fields which crashes the contact form while accessed by a portal user bzr revid: abo@openerp.com-20120918141724-fjhpu0m46ndgtble --- addons/portal_crm/wizard/contact.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/portal_crm/wizard/contact.py b/addons/portal_crm/wizard/contact.py index 755b422f8ea..37e6a0ca6d1 100644 --- a/addons/portal_crm/wizard/contact.py +++ b/addons/portal_crm/wizard/contact.py @@ -47,10 +47,10 @@ class crm_contact_us(osv.TransientModel): @return current user's email if the user isn't "anonymous", None otherwise """ - user = self.pool.get('res.users').browse(cr, uid, uid, context=context) + user = self.pool.get('res.users').read(cr, uid, uid, ['login', 'email'], context) - if (user.login != 'anonymous'): - return user.email + if (user['login'] != 'anonymous'): + return user['email'] else: return None From a8798fc9c05c8801207adea22e92d051293d17ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 18 Sep 2012 16:23:18 +0200 Subject: [PATCH 272/581] [IMP] mail.followers widget: invite is now a link after 'Followers' h4 title. Removed the button. The behavior is the same as before. bzr revid: tde@openerp.com-20120918142318-glwj47jx7xyvj26d --- addons/mail/static/src/css/mail.css | 10 +++++++++- addons/mail/static/src/js/mail_followers.js | 6 +++--- addons/mail/static/src/xml/mail_followers.xml | 3 +-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/addons/mail/static/src/css/mail.css b/addons/mail/static/src/css/mail.css index 48a178732b0..a26beb237d1 100644 --- a/addons/mail/static/src/css/mail.css +++ b/addons/mail/static/src/css/mail.css @@ -124,6 +124,14 @@ } +/* ------------------------------------------------------------ */ +/* Followers +/* ------------------------------------------------------------ */ + +.openerp div.oe_mail_recthread_aside h4 { + display: inline-block; +} + /* ------------------------------------------------------------ */ /* Thread /* ------------------------------------------------------------ */ @@ -226,7 +234,7 @@ clear: both; } -.openerp .oe_mail_msg_content a { +.openerp .oe_chatter a { cursor: pointer; } diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js index b321ca42027..4b3d6b13abb 100644 --- a/addons/mail/static/src/js/mail_followers.js +++ b/addons/mail/static/src/js/mail_followers.js @@ -53,7 +53,7 @@ openerp_mail_followers = function(session, mail) { .mouseover(function () { $(this).html('Unfollow').removeClass('oe_mail_button_mouseout').addClass('oe_mail_button_mouseover'); }) .mouseleave(function () { $(this).html('Following').removeClass('oe_mail_button_mouseover').addClass('oe_mail_button_mouseout'); }); this.$el.on('click', 'button.oe_mail_button_follow', function () { self.do_follow(); }); - this.$el.on('click', 'button.oe_mail_button_invite', function(event) { + this.$el.on('click', 'a.oe_mail_invite', function(event) { action = { type: 'ir.actions.act_window', res_model: 'mail.wizard.invite', @@ -126,9 +126,9 @@ openerp_mail_followers = function(session, mail) { display_buttons: function () { this.$('button.oe_mail_button_follow').hide(); this.$('button.oe_mail_button_unfollow').hide(); - this.$('button.oe_mail_button_invite').hide(); + this.$('span.oe_mail_invite_wrapper').hide(); if (! this.view.is_action_enabled('edit')) return; - this.$('button.oe_mail_button_invite').show(); + this.$('span.oe_mail_invite_wrapper').show(); if (this.message_is_follower) { this.$('button.oe_mail_button_unfollow').show(); } else if (this.message_is_follower == false) { this.$('button.oe_mail_button_follow').show(); } }, diff --git a/addons/mail/static/src/xml/mail_followers.xml b/addons/mail/static/src/xml/mail_followers.xml index 8e4c4b3991f..dbcfe794166 100644 --- a/addons/mail/static/src/xml/mail_followers.xml +++ b/addons/mail/static/src/xml/mail_followers.xml @@ -9,11 +9,10 @@
          -
          -

          +

          · Invite partners
            From 3006c38868449908117d5a0be64fa50a472172d0 Mon Sep 17 00:00:00 2001 From: Tejas Tank Date: Wed, 19 Sep 2012 12:44:39 +0530 Subject: [PATCH 273/581] Fix: import google name, email, photo. bzr revid: tta@openerp.com-20120919071439-oojeltf53gvtsy7d --- addons/import_google/wizard/import_google.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/addons/import_google/wizard/import_google.py b/addons/import_google/wizard/import_google.py index d231c186321..f8fc8991975 100644 --- a/addons/import_google/wizard/import_google.py +++ b/addons/import_google/wizard/import_google.py @@ -27,6 +27,7 @@ from dateutil import * from pytz import timezone from datetime import datetime import time +import base64 from osv import * from tools.translate import _ @@ -282,7 +283,7 @@ class google_import(import_framework): self.contact = self.gd_client.GetContactsFeed() while self.contact: for entry in self.contact.entry: - data = {} + data = {} data['id'] = entry.id.text name = tools.ustr(entry.title.text) if name == "None": @@ -290,6 +291,8 @@ class google_import(import_framework): data['name'] = name or _('Unknown') emails = ','.join(email.address for email in entry.email) data['email'] = emails + if self.gd_client.GetPhoto(entry): + data['image'] = base64.encodestring(self.gd_client.GetPhoto(entry)) if table == 'Contact': data.update({'customer': str(self.context.get('customer')), 'supplier': str(self.context.get('supplier'))}) @@ -322,6 +325,12 @@ class google_import(import_framework): 'name': value('company', fallback='name'), 'customer': 'customer', 'supplier': 'supplier', + 'city': 'city', + 'phone': 'phone', + 'mobile': 'mobile', + 'email': 'email', + 'image': 'image', + 'fax': 'fax', 'child_ids/id': ref(self.TABLE_ADDRESS, 'id'), } } From ae87c376689522d166709bdd6e4101a47370a9a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 19 Sep 2012 10:23:28 +0200 Subject: [PATCH 274/581] [COM] commented a modif. bzr revid: tde@openerp.com-20120919082328-ljo621cftf8csnjh --- openerp/osv/osv.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openerp/osv/osv.py b/openerp/osv/osv.py index d59998193a2..94703903e6d 100644 --- a/openerp/osv/osv.py +++ b/openerp/osv/osv.py @@ -121,7 +121,8 @@ class object_proxy(object): return f(self, dbname, *args, **kwargs) except orm.except_orm, inst: raise - raise except_osv(inst.name, inst.value) + # TDE: commented to have more valuable stack traces + # raise except_osv(inst.name, inst.value) except except_osv: raise except IntegrityError, inst: From a41714da567ea3bbda4442792780a6fcf948ae6e Mon Sep 17 00:00:00 2001 From: Hardik Date: Wed, 19 Sep 2012 14:21:03 +0530 Subject: [PATCH 275/581] [IMP]User : Access rights in changed menu name bzr revid: hsa@tinyerp.com-20120919085103-mmen7f0vzqvmp9bx --- addons/event/security/event_security.xml | 2 +- addons/mail/security/mail_security.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/event/security/event_security.xml b/addons/event/security/event_security.xml index f46bc5fff96..2cc749a1a40 100644 --- a/addons/event/security/event_security.xml +++ b/addons/event/security/event_security.xml @@ -3,7 +3,7 @@ - Event + Events Helps you manage your Events. 3 diff --git a/addons/mail/security/mail_security.xml b/addons/mail/security/mail_security.xml index a12314e6f25..1d6d8d90579 100644 --- a/addons/mail/security/mail_security.xml +++ b/addons/mail/security/mail_security.xml @@ -4,7 +4,7 @@ - Social and Sharing Tools + Home 26 From 808fc09e925245f5a936d96d9ee29987aee80536 Mon Sep 17 00:00:00 2001 From: Hardik Date: Wed, 19 Sep 2012 14:22:04 +0530 Subject: [PATCH 276/581] [IMP]User : Access rights in changed menu name bzr revid: hsa@tinyerp.com-20120919085204-2cqnwkprzbnfkf70 --- openerp/addons/base/module/module_data.xml | 4 ++-- openerp/addons/base/security/base_security.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openerp/addons/base/module/module_data.xml b/openerp/addons/base/module/module_data.xml index 15cbded05cd..6cc69835322 100644 --- a/openerp/addons/base/module/module_data.xml +++ b/openerp/addons/base/module/module_data.xml @@ -25,13 +25,13 @@
            - Sales Management + Sales Helps you handle your quotations, sale orders and invoicing. 2 - Project Management + Project Helps you manage your projects and tasks by tracking them, generating plannings, etc... 3 diff --git a/openerp/addons/base/security/base_security.xml b/openerp/addons/base/security/base_security.xml index 8eb832ea618..3cb8f7044b2 100644 --- a/openerp/addons/base/security/base_security.xml +++ b/openerp/addons/base/security/base_security.xml @@ -11,7 +11,7 @@ Access Rights
            - Configuration + Settings From 470c0fa818c44d617063eafc6d83819c889dde3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 19 Sep 2012 12:13:39 +0200 Subject: [PATCH 277/581] [IMP] mail_mesage: fixed message_dict_get (getting values is now inside try/except, not having access rigths on some details of the mail.message should not crash, just hide the data); My Feeds -> My Posts; mis cleaning in mail.js, xml and css. bzr revid: tde@openerp.com-20120919101339-d1k16lxk5e4gwxxg --- addons/mail/mail_message.py | 41 ++++++++++++++++++----------- addons/mail/mail_message_view.xml | 2 +- addons/mail/static/src/css/mail.css | 24 ----------------- addons/mail/static/src/js/mail.js | 11 ++------ addons/mail/static/src/xml/mail.xml | 4 +-- 5 files changed, 30 insertions(+), 52 deletions(-) diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index 94f2d1f83e2..7d9c7b3085f 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -26,8 +26,7 @@ import tools from email.header import decode_header from openerp import SUPERUSER_ID from operator import itemgetter -from osv import osv, fields -from osv.orm import except_orm +from osv import osv, orm, fields from tools.translate import _ _logger = logging.getLogger(__name__) @@ -64,7 +63,7 @@ class mail_message(osv.Model): continue try: result[message.id] = self._shorten_name(self.pool.get(message.model).name_get(cr, uid, [message.res_id], context=context)[0][1]) - except openerp.exceptions.AccessDenied, e: + except (orm.except_orm, osv.except_osv): pass return result @@ -175,22 +174,31 @@ class mail_message(osv.Model): #------------------------------------------------------ def _message_dict_get(self, cr, uid, msg, context=None): - """ Return a dict representation of the message browse record. """ + """ Return a dict representation of the message browse record. A read + is performed to because of access rights issues (reading many2one + fields allow to have the foreign record name without having + to check external access rights). + """ has_voted = False vote_ids = self.pool.get('res.users').name_get(cr, SUPERUSER_ID, [user.id for user in msg.vote_user_ids], context=context) for vote in vote_ids: if vote[0] == uid: has_voted = True break - # TDE TEMP: use SUPERUSER_ID - # attachment_ids = [{'id': attach[0], 'name': attach[1]} for attach in self.pool.get('ir.attachment').name_get(cr, SUPERUSER_ID, [x.id for x in msg.attachment_ids], context=context)] - attachment_ids = [] - # author_id = self.pool.get('res.partner').name_get(cr, SUPERUSER_ID, [msg.author_id.id], context=context)[0] - author_id = False - # author_user_id = self.pool.get('res.users').name_get(cr, SUPERUSER_ID, [msg.author_id.user_ids[0].id], context=context)[0] - author_user_id = False - # partner_ids = self.pool.get('res.partner').name_get(cr, SUPERUSER_ID, [x.id for x in msg.partner_ids], context=context) - partner_ids = [] + try: + attachment_ids = [{'id': attach[0], 'name': attach[1]} for attach in self.pool.get('ir.attachment').name_get(cr, uid, [x.id for x in msg.attachment_ids], context=context)] + except (orm.except_orm, osv.except_osv): + attachment_ids = [] + try: + author_id = self.pool.get('res.partner').name_get(cr, uid, [msg.author_id.id], context=context)[0] + is_author = uid in msg.author_id.user_ids + except (orm.except_orm, osv.except_osv): + author_id = False + is_author = False + try: + partner_ids = self.pool.get('res.partner').name_get(cr, uid, [x.id for x in msg.partner_ids], context=context) + except (orm.except_orm, osv.except_osv): + partner_ids = [] return { 'id': msg.id, 'type': msg.type, @@ -202,7 +210,7 @@ class mail_message(osv.Model): 'subject': msg.subject, 'date': msg.date, 'author_id': author_id, - 'author_user_id': author_user_id, + 'is_author': is_author, 'partner_ids': partner_ids, 'child_ids': [], 'vote_user_ids': vote_ids, @@ -393,7 +401,7 @@ class mail_message(osv.Model): other_ids = set(ids).difference(set(notified_ids), set(author_ids), set(doc_follower_ids), set(document_related_ids)) if not other_ids: return - raise except_orm(_('Access Denied'), + raise orm.except_orm(_('Access Denied'), _('The requested operation cannot be completed due to security restrictions. Please contact your system administrator.\n\n(Document type: %s, Operation: %s)') % \ (self._description, operation)) @@ -408,7 +416,6 @@ class mail_message(osv.Model): """ Override to explicitely call check_access_rule, that is not called by the ORM. It instead directly fetches ir.rules and apply them. """ res = super(mail_message, self).read(cr, uid, ids, fields=fields, context=context, load=load) - # print '-->', res self.check_access_rule(cr, uid, ids, 'read', context=context) return res @@ -441,6 +448,8 @@ class mail_message(osv.Model): if missing_notified: self.write(cr, SUPERUSER_ID, [newid], {'partner_ids': [(4, p_id) for p_id in missing_notified]}, context=context) partners_to_notify |= extra_notified + # # remove uid from partners + self.write(cr, SUPERUSER_ID, [newid], {'partner_ids': [(3, uid)]}, context=context) self.pool.get('mail.notification').notify(cr, uid, list(partners_to_notify), newid, context=context) def copy(self, cr, uid, id, default=None, context=None): diff --git a/addons/mail/mail_message_view.xml b/addons/mail/mail_message_view.xml index 914937a34f3..814702f6db4 100644 --- a/addons/mail/mail_message_view.xml +++ b/addons/mail/mail_message_view.xml @@ -95,7 +95,7 @@
            - My Feeds + My Posts mail.wall diff --git a/addons/mail/static/src/css/mail.css b/addons/mail/static/src/css/mail.css index badbc09788a..166555500dd 100644 --- a/addons/mail/static/src/css/mail.css +++ b/addons/mail/static/src/css/mail.css @@ -268,30 +268,6 @@ display: none; } -/*--------------------------------------------------------------*/ -/* mail.vote -/*--------------------------------------------------------------*/ - -.openerp .oe_mail_msg_content button.oe_mail_msg_vote { - height:21px; - width: 30px; - padding: 1px; - background: #8A89BA; - margin-top: -4px; -} - -.openerp .oe_mail_msg_content button.oe_mail_msg_vote_true { - background:#DC5F59; -} - -.openerp .oe_mail_msg_content button.oe_mail_msg_vote span { - color: white; -} - -.openerp .oe_mail_msg_content span.oe_mail_vote_count{ - color: #807FB4; -} - /* ------------------------------------------------------------ */ /* mail.compose.message form view & OpenERP hacks diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js index 41d5ca87c28..d1d813476d2 100644 --- a/addons/mail/static/src/js/mail.js +++ b/addons/mail/static/src/js/mail.js @@ -56,11 +56,6 @@ openerp.mail = function(session) { return session.origin + '/web/binary/saveas?session_id=' + session.session_id + '&model=ir.attachment&field=datas&filename_field=datas_fname&id=' + attachment['id']; }, - /** Check if the current user is the message author */ - is_author: function (widget, message_user_id) { - return (widget.session && widget.session.uid != 0 && widget.session.uid == message_user_id); - }, - /** Replaces some expressions * - :name - shortcut to an image */ @@ -301,6 +296,7 @@ openerp.mail = function(session) { // TDE TODO: check for deferred, not sure it is correct this._super.apply(this, arguments); this.bind_events(); + this.display_user_avatar(); // fetch and display message, using message_ids if set var display_done = $.when(this.message_fetch(true, [], {})).then(this.proxy('do_customize_display')); // add message composition form view @@ -313,7 +309,6 @@ openerp.mail = function(session) { /** Customize the display * - show_header_compose: show the composition form in the header */ do_customize_display: function() { - this.display_user_avatar(); if (this.options.show_header_compose) { this.$el.find('div.oe_mail_thread_action').eq(0).show(); } @@ -489,8 +484,7 @@ openerp.mail = function(session) { * - record.date: formatting according to the user timezone * - record.timerelative: relative time givein by timeago lib * - record.avatar: image url - * - record.attachment_ids[].url: url of each attachment - * - record.is_author: is the current user the author of the record */ + * - record.attachment_ids[].url: url of each attachment */ display_record: function (record) { // formatting and additional fields record.date = session.web.format_value(record.date, {type:"datetime"}); @@ -504,7 +498,6 @@ openerp.mail = function(session) { var attach = record.attachment_ids[l]; attach['url'] = mail.ChatterUtils.get_attachment_url(this.session, attach); } - record.is_author = mail.ChatterUtils.is_author(this, record.author_user_id[0]); // add to internal storage this.records[record.id] = record; // render, add the expand feature diff --git a/addons/mail/static/src/xml/mail.xml b/addons/mail/static/src/xml/mail.xml index e3586e723e4..c54bd4dbb2d 100644 --- a/addons/mail/static/src/xml/mail.xml +++ b/addons/mail/static/src/xml/mail.xml @@ -140,7 +140,7 @@
          • -
          • +
          • Reply
          • @@ -185,7 +185,7 @@ votes - From e9719348547c7c2cba2334411c4a153da1c1e340 Mon Sep 17 00:00:00 2001 From: Hardik Date: Wed, 19 Sep 2012 16:23:24 +0530 Subject: [PATCH 278/581] [IMP]MRP : Add Product Menu and BOM field is required bzr revid: hsa@tinyerp.com-20120919105324-uqh8z188rtl34bva --- addons/mrp/mrp.py | 3 ++- addons/mrp/mrp_view.xml | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index ae29ad324db..52459484a14 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -461,7 +461,8 @@ class mrp_production(osv.osv): 'date_start': fields.datetime('Start Date', select=True, readonly=True), 'date_finished': fields.datetime('End Date', select=True, readonly=True), - 'bom_id': fields.many2one('mrp.bom', 'Bill of Material', domain=[('bom_id','=',False)], readonly=True, states={'draft':[('readonly',False)]}), + 'bom_id': fields.many2one('mrp.bom', 'Bill of Material', domain=[('bom_id','=',False)], readonly=True, states={'draft':[('readonly',False)]}, + help="Bills of Materials allow you to define the list of required raw materials required to make a finished product."), 'routing_id': fields.many2one('mrp.routing', string='Routing', on_delete='set null', readonly=True, states={'draft':[('readonly',False)]}, help="The list of operations (list of work centers) to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production plannification."), 'picking_id': fields.many2one('stock.picking', 'Picking List', readonly=True, ondelete="restrict", diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml index d05893cf778..f202eab8ce9 100644 --- a/addons/mrp/mrp_view.xml +++ b/addons/mrp/mrp_view.xml @@ -13,7 +13,7 @@ parent="base.menu_mrp_root" sequence="1"/> - @@ -521,6 +521,10 @@ id="menu_mrp_bom_form_action" parent="menu_mrp_bom" sequence="10"/> + - + From 9ec025be0ed4a896b37b0323fe427e39f6abb13c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 19 Sep 2012 13:00:35 +0200 Subject: [PATCH 279/581] [CLEAN] mail message subtype: cleaned model and views. bzr revid: tde@openerp.com-20120919110035-724052iqfkkafm73 --- addons/mail/data/mail_data.xml | 2 +- addons/mail/mail_message_subtype.py | 20 +++++++++++------ addons/mail/mail_message_subtype.xml | 32 ++++++---------------------- 3 files changed, 21 insertions(+), 33 deletions(-) diff --git a/addons/mail/data/mail_data.xml b/addons/mail/data/mail_data.xml index 8e2af38f2ea..c8eb8829d64 100644 --- a/addons/mail/data/mail_data.xml +++ b/addons/mail/data/mail_data.xml @@ -12,7 +12,7 @@
            - + comment diff --git a/addons/mail/mail_message_subtype.py b/addons/mail/mail_message_subtype.py index 6eb349fc71e..71e8147cfc9 100644 --- a/addons/mail/mail_message_subtype.py +++ b/addons/mail/mail_message_subtype.py @@ -2,7 +2,7 @@ ############################################################################## # # OpenERP, Open Source Management Solution -# Copyright (C) 2009-today OpenERP SA () +# Copyright (C) 2012-today OpenERP SA () # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -22,15 +22,23 @@ from osv import osv from osv import fields + class mail_message_subtype(osv.osv): - + """ Class holding subtype definition for messages. Subtypes allow to tune + the follower subscription, allowing only some subtypes to be pushed + on the Wall. """ _name = 'mail.message.subtype' _description = 'mail_message_subtype' _columns = { - 'name': fields.char('Message Subtype ', size = 128, - required = True, help = 'Message subtype, gives a more precise type on the message, especially for system notifications. For example, it can be a notification related to a new record (New), or to a stage change in a process (Stage change). Message subtypes allow to precisely tune the notifications the user want to receive on its wall.'), - 'res_model': fields.char('Model',size = 128, help = "link subtype to model"), - 'default': fields.boolean('Default', help = "When subscribing to the document, users will receive by default messages related to this subtype unless they uncheck this subtype"), + 'name': fields.char('Message Subtype ', required=True, + help='Message subtype, gives a more precise type on the message, '\ + 'especially for system notifications. For example, it can be '\ + 'a notification related to a new record (New), or to a stage '\ + 'change in a process (Stage change). Message subtypes allow to '\ + 'precisely tune the notifications the user want to receive on its wall.'), + 'res_model': fields.char('Model', help="link subtype to model"), + 'default': fields.boolean('Default', + help="When subscribing to the document, this subtype will be checked by default."), } _defaults = { 'default': True, diff --git a/addons/mail/mail_message_subtype.xml b/addons/mail/mail_message_subtype.xml index 7d0eed2f4da..c6490d5e61a 100644 --- a/addons/mail/mail_message_subtype.xml +++ b/addons/mail/mail_message_subtype.xml @@ -2,19 +2,14 @@ - - mail.message.subtype.tree mail.message.subtype - tree 10 - + @@ -23,42 +18,27 @@ mail.message.subtype.form mail.message.subtype - form
            - - - - - - - + + +
            - + Subtypes mail.message.subtype form tree,form - -

            - Click to create a message subtype. -

            - OpenERP's message subtype allows to ease and fasten the - subtype which helps to decrease over crowdy wall comments which displays - only those. -

            -
            - +
            From bc9decbe45f57c0c61d3a3c8a6758e6b3b744bfc Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Wed, 19 Sep 2012 13:12:04 +0200 Subject: [PATCH 280/581] [IMP] make sure that the user email exist bzr revid: abo@openerp.com-20120919111204-n461eriy40nirvgz --- addons/portal_crm/wizard/contact.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/portal_crm/wizard/contact.py b/addons/portal_crm/wizard/contact.py index 37e6a0ca6d1..4deb17876e9 100644 --- a/addons/portal_crm/wizard/contact.py +++ b/addons/portal_crm/wizard/contact.py @@ -49,7 +49,7 @@ class crm_contact_us(osv.TransientModel): """ user = self.pool.get('res.users').read(cr, uid, uid, ['login', 'email'], context) - if (user['login'] != 'anonymous'): + if (user['login'] != 'anonymous' and user['email']): return user['email'] else: return None From 64672b176447c662408e853f5980a0f8f6c6f675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 19 Sep 2012 13:43:53 +0200 Subject: [PATCH 281/581] [CLEAN] mail: comment xml_id is now mt_comment. Propagated change. Slighty cleaned code in base_status. bzr revid: tde@openerp.com-20120919114353-8s9lo6tp78tnwj56 --- addons/base_status/base_stage.py | 27 +++++++++---------- .../crm/test/process/crm_message_subtype.yml | 2 +- addons/mail/data/mail_data.xml | 2 +- addons/mail/mail_thread.py | 4 +-- addons/mail/tests/test_mail.py | 2 +- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/addons/base_status/base_stage.py b/addons/base_status/base_stage.py index 2695567e0a1..859e577bf31 100644 --- a/addons/base_status/base_stage.py +++ b/addons/base_status/base_stage.py @@ -349,6 +349,15 @@ class base_stage(object): """ return '' + def find_subtype_xml_id(self, cr, uid, ids, name, context=None): + ir_model_data_obj = self.pool.get('ir.model.data') + subtype_ids = self.pool.get('mail.message.subtype').search(cr, uid, [('res_model', '=', self._name), ('name', '=', name)], context=context) + ir_data_ids = ir_model_data_obj.search(cr, uid, [('model', '=', 'mail.message.subtype'), ('res_id', 'in', subtype_ids)], context=context) + ir_model_data_record = ir_model_data_obj.browse(cr, uid, ir_data_ids, context=context) + if ir_model_data_record: + return ir_model_data_record[0].name + return None + def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Send a notification when the stage changes. This method has to be overriden, because each document will have its particular @@ -360,31 +369,21 @@ class base_stage(object): def case_open_send_note(self, cr, uid, ids, context=None): for id in ids: msg = _('%s has been opened.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context)) - self.message_post(cr, uid, [id], body=msg, context=context) + xml_id = self.find_subtype_xml_id(cr, uid, ids, name="open", context=context) + self.message_post(cr, uid, [id], body=msg, subtype_xml_id=xml_id, context=context) return True - - def find_xml_id(self,cr,uid,ids,name,context=None): - subtype_obj = self.pool.get('mail.message.subtype') - ir_model_data_obj = self.pool.get('ir.model.data') - subtype_ids = subtype_obj.search(cr,uid,[('res_model','=',self._name),('name','=',name)]) - ir_data_ids = ir_model_data_obj.search(cr,uid,[('model','=','mail.message.subtype'),('res_id','in',subtype_ids)]) - xml_id = 'mail_subtype_comment' - ir_model_data_record = ir_model_data_obj.browse(cr,uid,ir_data_ids) - if ir_model_data_record: - xml_id = ir_model_data_record[0].name - return xml_id def case_close_send_note(self, cr, uid, ids, context=None): for id in ids: msg = _('%s has been closed.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context)) - xml_id = self.find_xml_id(cr, uid, ids, name="closed", context=context) + xml_id = self.find_subtype_xml_id(cr, uid, ids, name="closed", context=context) self.message_post(cr, uid, [id], body=msg, subtype_xml_id=xml_id, context=context) return True def case_cancel_send_note(self, cr, uid, ids, context=None): for id in ids: msg = _('%s has been cancelled.') % (self.case_get_note_msg_prefix(cr, uid, id, context=context)) - xml_id = self.find_xml_id(cr, uid, ids, name="cancelled", context=context) + xml_id = self.find_subtype_xml_id(cr, uid, ids, name="cancel", context=context) self.message_post(cr, uid, [id], body=msg, subtype_xml_id=xml_id, context=context) return True diff --git a/addons/crm/test/process/crm_message_subtype.yml b/addons/crm/test/process/crm_message_subtype.yml index a1ad9a9c39a..bec5f730fa7 100644 --- a/addons/crm/test/process/crm_message_subtype.yml +++ b/addons/crm/test/process/crm_message_subtype.yml @@ -8,7 +8,7 @@ - I have add the sub_type name comment with default true - - !record {model: mail.message.subtype, id: mail.mail_subtype_comment }: + !record {model: mail.message.subtype, id: mail.mt_comment }: name: comment res_model: crm.lead - diff --git a/addons/mail/data/mail_data.xml b/addons/mail/data/mail_data.xml index c8eb8829d64..5fe1ee45b1d 100644 --- a/addons/mail/data/mail_data.xml +++ b/addons/mail/data/mail_data.xml @@ -13,7 +13,7 @@ - + comment diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 9ce3a8c8f95..400f3ccaa2d 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -562,8 +562,8 @@ class mail_thread(osv.AbstractModel): "now deprecated res.log.") self.message_post(cr, uid, [id], message, context=context) - def message_post(self, cr, uid, thread_id, body='', subject=False, - type='notification', parent_id=False, attachments=None, subtype_xml_id='mail_subtype_comment', context=None, **kwargs): + def message_post(self, cr, uid, thread_id, body='', subject=False, type='notification', + subtype_xml_id=None, parent_id=False, attachments=None, context=None, **kwargs): """ Post a new message in an existing thread, returning the new mail.message ID. Extra keyword arguments will be used as default column values for the new mail.message record. diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py index 2dfb7a75136..1ecdc4b6e5f 100644 --- a/addons/mail/tests/test_mail.py +++ b/addons/mail/tests/test_mail.py @@ -702,7 +702,7 @@ class test_mail(TestMailMockups): _mail_bodyalt2 = 'Pigs rules\nAdmin\n' filter_subtype_id = self.mail_message_subtype.search(cr, uid, [('default','=',True)]) # Post comment with body and subject, comment preference - msg_id = self.mail_group.message_post(cr, uid, [self.group_pigs_id], body=_body1, subject=_subject, type='comment',subtype_xml_id='mail_subtype_comment') + msg_id = self.mail_group.message_post(cr, uid, [self.group_pigs_id], body=_body1, subject=_subject, type='comment',subtype_xml_id='mt_comment') notif_ids = self.mail_notification.search(cr, uid, [('message_id', '=', msg_id)]) self.assertTrue(len(notif_ids) >= 1,"subtype is email and show notification on wall") From f59a9a83bbd7d75fb885717abe13a475e18fa8d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 19 Sep 2012 13:46:12 +0200 Subject: [PATCH 282/581] [CLEAN] sale: cleaned subtypes. bzr revid: tde@openerp.com-20120919114612-6vrcnzl2up2cdqzk --- addons/sale/sale.py | 8 ++++---- addons/sale/sale_data.xml | 18 ++++-------------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/addons/sale/sale.py b/addons/sale/sale.py index cc6e5f71f30..ba85a62ca1d 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -1028,7 +1028,7 @@ class sale_order(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("Quotation for %s has been created.") % (obj.partner_id.name), subtype_xml_id="sale_subtype_new", context=context) + self.message_post(cr, uid, [obj.id], body=_("Quotation for %s has been created.") % (obj.partner_id.name), subtype_xml_id="mt_sale_new", context=context) def confirm_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): @@ -1036,7 +1036,7 @@ class sale_order(osv.osv): def cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("Sale Order for %s cancelled.") % (obj.partner_id.name), subtype_xml_id="sale_subtype_cancelled", context=context) + self.message_post(cr, uid, [obj.id], body=_("Sale Order for %s cancelled.") % (obj.partner_id.name), context=context) def delivery_send_note(self, cr, uid, ids, picking_id, context=None): for order in self.browse(cr, uid, ids, context=context): @@ -1048,7 +1048,7 @@ class sale_order(osv.osv): self.message_post(cr, uid, [order.id], body=_("Delivery Order %s scheduled for %s.") % (picking.name, picking_date_str), context=context) def delivery_end_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Order delivered."), subtype_xml_id="sale_subtype_delivered", context=context) + self.message_post(cr, uid, ids, body=_("Order delivered."), subtype_xml_id="mt_sale_delivered", context=context) def invoice_paid_send_note(self, cr, uid, ids, context=None): self.message_post(cr, uid, ids, body=_("Invoice paid."), subtype_xml_id="sale_subtype_paid", context=context) @@ -1056,7 +1056,7 @@ class sale_order(osv.osv): def invoice_send_note(self, cr, uid, ids, invoice_id, context=None): for order in self.browse(cr, uid, ids, context=context): for invoice in (inv for inv in order.invoice_ids if inv.id == invoice_id): - self.message_post(cr, uid, [order.id], body=_("Draft Invoice of %s %s waiting for validation.") % (invoice.amount_total, invoice.currency_id.symbol), subtype_xml_id="sale_subtype_pending", context=context) + self.message_post(cr, uid, [order.id], body=_("Draft Invoice of %s %s waiting for validation.") % (invoice.amount_total, invoice.currency_id.symbol), context=context) def action_cancel_draft_send_note(self, cr, uid, ids, context=None): return self.message_post(cr, uid, ids, body=_('Sale order set to draft.'), context=context) diff --git a/addons/sale/sale_data.xml b/addons/sale/sale_data.xml index 4337c4bd1e8..3be79035fc6 100644 --- a/addons/sale/sale_data.xml +++ b/addons/sale/sale_data.xml @@ -44,26 +44,16 @@ If you need to manage your sales pipeline (leads, opportunities, phonecalls), you can install the module <i>CRM</i> from the top menu Settings. - - new + + create sale.order - - cancelled - sale.order - - - + paid sale.order - - pending - sale.order - - - + delivered sale.order From 0d428b2b72b4c57a578f32039cb023a943a820c6 Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Wed, 19 Sep 2012 13:48:44 +0200 Subject: [PATCH 283/581] [FIX] read user data through a read() instead of a browse() this way, we prevent the auto-loading of all the user's fields which crashes the contact form when it's submitted by a portal user bzr revid: abo@openerp.com-20120919114844-zhbgxkyoufz7ac2m --- openerp/addons/base/res/res_company.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/res/res_company.py b/openerp/addons/base/res/res_company.py index b27476b2c92..f4cebd12ae6 100644 --- a/openerp/addons/base/res/res_company.py +++ b/openerp/addons/base/res/res_company.py @@ -195,11 +195,11 @@ class res_company(osv.osv): ] ids = proxy.search(cr, uid, args, context=context) - user = self.pool.get('res.users').browse(cr, uid, uid, context=context) + user = self.pool.get('res.users').read(cr, uid, [uid], ['company_id'], context=context)[0] for rule in proxy.browse(cr, uid, ids, context): if eval(rule.expression, {'context': context, 'user': user}): return rule.company_dest_id.id - return user.company_id.id + return user['company_id'][0] @tools.ormcache() def _get_company_children(self, cr, uid=None, company=None): From 4fa322cfe5334473676b03e8ac6e9ed06eb552b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 19 Sep 2012 13:51:56 +0200 Subject: [PATCH 284/581] [CLEAN] stock: cleaned subtypes. bzr revid: tde@openerp.com-20120919115156-mi80hp8jprnag506 --- addons/stock/stock.py | 16 ++++++---------- addons/stock/stock_data.xml | 22 +++++----------------- 2 files changed, 11 insertions(+), 27 deletions(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 77849e12627..f96c3582a6d 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -1379,13 +1379,13 @@ class stock_picking(osv.osv): def create_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("%s has been created.") % (self._get_document_type(obj.type)), subtype_xml_id="stock_in_subtype_new", context=context) + self.message_post(cr, uid, [obj.id], body=_("%s has been created.") % (self._get_document_type(obj.type)), subtype_xml_id="mt_stock_new", context=context) def scrap_send_note(self, cr, uid, ids, quantity, uom, name, context=None): - return self.message_post(cr, uid, ids, body= _("%s %s %s has been moved to scrap.") % (quantity, uom, name),context=context) + return self.message_post(cr, uid, ids, body=_("%s %s %s has been moved to scrap.") % (quantity, uom, name), context=context) def back_order_send_note(self, cr, uid, ids, back_name, context=None): - return self.message_post(cr, uid, ids, body=_("Back order %s has been created.") % (back_name), subtype_xml_id="stock_in_subtype_new", context=context) + return self.message_post(cr, uid, ids, body=_("Back order %s has been created.") % (back_name), subtype_xml_id="mt_stock_new", context=context) def ship_done_send_note(self, cr, uid, ids, context=None): type_dict = { @@ -1394,19 +1394,15 @@ class stock_picking(osv.osv): 'internal': 'moved', } xml_id_dict = { - 'out':'stock_out_subtype_delivered', - 'in' : 'stock_in_subtype_received' + 'out': 'mt_stock_delivered', + 'in': 'mt_stock_received' } for obj in self.browse(cr, uid, ids, context=context): self.message_post(cr, uid, [obj.id], body=_("Products have been %s.") % (type_dict.get(obj.type, 'move done')), subtype_xml_id=xml_id_dict.get(obj.type), context=context) def ship_cancel_send_note(self, cr, uid, ids, context=None): - xml_id_dict = { - 'out':'stock_out_subtype_cancelled', - 'in' : 'stock_in_subtype_cancelled' - } for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("%s has been cancelled.") % (self._get_document_type(obj.type)), subtype_xml_id=xml_id_dict.get(obj.type), context=context) + self.message_post(cr, uid, [obj.id], body=_("%s has been cancelled.") % (self._get_document_type(obj.type)), context=context) stock_picking() diff --git a/addons/stock/stock_data.xml b/addons/stock/stock_data.xml index a59642fa912..1ab30af2abc 100644 --- a/addons/stock/stock_data.xml +++ b/addons/stock/stock_data.xml @@ -167,30 +167,18 @@ watch your stock valuation, and track production lots upstream and downstream (b - - - new + + + created stock.picking.in - + delivered stock.picking.out - - + received stock.picking.in - - - - cancelled - stock.picking.in - - - cancelled - stock.picking.out From 5e9f78ebfd3b5a996b78fc598417bc68fe33ec9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 19 Sep 2012 14:00:00 +0200 Subject: [PATCH 285/581] [CLEAN] project_issue: cleaned subtypes. bzr revid: tde@openerp.com-20120919120000-62v9f5e24fh3grzd --- addons/project_issue/project_issue.py | 4 +-- addons/project_issue/project_issue_data.xml | 38 +++++++++------------ 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index 83eddb83d5e..0677fbfbd75 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -503,7 +503,7 @@ class project_issue(base_stage, osv.osv): def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Override of the (void) default notification method. """ stage_name = self.pool.get('project.task.type').name_get(cr, uid, [stage_id], context=context)[0][1] - return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), subtype_xml_id="issue_subtype_stage_change", context=context) + return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), subtype_xml_id="mt_issue_new", context=context) def case_get_note_msg_prefix(self, cr, uid, id, context=None): """ Override of default prefix for notifications. """ @@ -515,7 +515,7 @@ class project_issue(base_stage, osv.osv): def create_send_note(self, cr, uid, ids, context=None): message = _("Project issue created.") - return self.message_post(cr, uid, ids, body=message, subtype_xml_id="issue_subtype_new", context=context) + return self.message_post(cr, uid, ids, body=message, subtype_xml_id="mt_issue_new", context=context) def case_escalate_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): diff --git a/addons/project_issue/project_issue_data.xml b/addons/project_issue/project_issue_data.xml index f6c225a4d00..edd44e52dd2 100644 --- a/addons/project_issue/project_issue_data.xml +++ b/addons/project_issue/project_issue_data.xml @@ -30,27 +30,7 @@ v3.0 - - - - new - project.issue - - - - stage change - project.issue - - - - cancelled - project.issue - - - - closed - project.issue - + mail.group @@ -62,5 +42,21 @@ You can record issues, assign them to a responsible person, and keep track of th Access all issues from the top Project menu, and access the issues of a specific project via the projects gallery view. + + + created + project.issue + + + + stage change + project.issue + + + + closed + project.issue + + From bd998703847e01fdceb565484bbfaf690586d7d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 19 Sep 2012 14:03:33 +0200 Subject: [PATCH 286/581] [CLEAN] purchase: cleaned subtypes. bzr revid: tde@openerp.com-20120919120333-sc1vyw0jzfjltin7 --- addons/purchase/purchase.py | 12 ++++++------ addons/purchase/purchase_data.xml | 18 ++++-------------- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 8bcd6d39ef9..9fe05da33fc 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -741,7 +741,7 @@ class purchase_order(osv.osv): return [('state', '=', 'draft')] def create_send_note(self, cr, uid, ids, context=None): - return self.message_post(cr, uid, ids, body=_("Request for quotation created."), subtype_xml_id="purchase_subtype_new", context=context) + return self.message_post(cr, uid, ids, body=_("Request for quotation created."), subtype_xml_id="mt_purchase_new", context=context) def confirm_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): @@ -759,20 +759,20 @@ class purchase_order(osv.osv): def invoice_send_note(self, cr, uid, ids, invoice_id, context=None): for order in self.browse(cr, uid, ids, context=context): for invoice in (inv for inv in order.invoice_ids if inv.id == invoice_id): - self.message_post(cr, uid, [order.id], body=_("Draft Invoice of %s %s is waiting for validation.") % (invoice.amount_total, invoice.currency_id.symbol), subtype_xml_id="purchase_subtype_pending", context=context) + self.message_post(cr, uid, [order.id], body=_("Draft Invoice of %s %s is waiting for validation.") % (invoice.amount_total, invoice.currency_id.symbol), context=context) def shipment_done_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("""Shipment received."""), subtype_xml_id="purchase_subtype_received", context=context) + self.message_post(cr, uid, ids, body=_("""Shipment received."""), subtype_xml_id="mt_purchase_received", context=context) def invoice_done_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Invoice paid."), subtype_xml_id="purchase_subtype_paid", context=context) + self.message_post(cr, uid, ids, body=_("Invoice paid."), subtype_xml_id="mt_purchase_paid", context=context) def draft_send_note(self, cr, uid, ids, context=None): - return self.message_post(cr, uid, ids, body=_("Purchase Order has been set to draft."), subtype_xml_id="purchase_subtype_new", context=context) + return self.message_post(cr, uid, ids, body=_("Purchase Order has been set to draft."), subtype_xml_id="mt_purchase_new", context=context) def cancel_send_note(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, [obj.id], body=_("Purchase Order for %s cancelled.") % (obj.partner_id.name), subtype_xml_id="purchase_subtype_cancelled", context=context) + self.message_post(cr, uid, [obj.id], body=_("Purchase Order for %s cancelled.") % (obj.partner_id.name), context=context) purchase_order() diff --git a/addons/purchase/purchase_data.xml b/addons/purchase/purchase_data.xml index aa62e84e19d..25981e2e01a 100644 --- a/addons/purchase/purchase_data.xml +++ b/addons/purchase/purchase_data.xml @@ -49,28 +49,18 @@ You can also manage purchase requisitions, see also the Purchase Settings. - - new + + created purchase.order - + paid purchase.order - - pending - purchase.order - - - + received purchase.order - - cancelled - purchase.order - - From b63923f1c9c7ac874d42cfb0be931cb460596b3e Mon Sep 17 00:00:00 2001 From: "Bhumi Thakkar (Open ERP)" Date: Wed, 19 Sep 2012 17:36:00 +0530 Subject: [PATCH 287/581] [IMP] Add images on button. bzr revid: bth@tinyerp.com-20120919120600-iox3j7ww7ni52lv0 --- addons/base_calendar/crm_meeting_view.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/base_calendar/crm_meeting_view.xml b/addons/base_calendar/crm_meeting_view.xml index 928f8d94d5c..558dac71142 100644 --- a/addons/base_calendar/crm_meeting_view.xml +++ b/addons/base_calendar/crm_meeting_view.xml @@ -183,17 +183,19 @@
            - + From 933bbca9481dec9662ac104170d4a976c69e44b7 Mon Sep 17 00:00:00 2001 From: "Mayur Maheshwari (OpenERP)" Date: Wed, 19 Sep 2012 18:27:02 +0530 Subject: [PATCH 294/581] [IMP]hr_payroll : little improvement bzr revid: mma@tinyerp.com-20120919125702-3t0lbcirsiylgu34 --- addons/hr_payroll/hr_payroll_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hr_payroll/hr_payroll_view.xml b/addons/hr_payroll/hr_payroll_view.xml index 762b983c03a..066b14e7a06 100644 --- a/addons/hr_payroll/hr_payroll_view.xml +++ b/addons/hr_payroll/hr_payroll_view.xml @@ -234,7 +234,7 @@ - + From 378966f9f1c0dc9d1f7aca8dbc666eff4cda74d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 19 Sep 2012 15:05:14 +0200 Subject: [PATCH 295/581] [FIX] event: fixed xml_id not existing. bzr revid: tde@openerp.com-20120919130514-oeto9qfiujd3v71e --- addons/event/event.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/event/event.py b/addons/event/event.py index 1bd52f2389b..5797e12355c 100644 --- a/addons/event/event.py +++ b/addons/event/event.py @@ -308,7 +308,7 @@ class event_event(osv.osv): def button_done_send_note(self, cr, uid, ids, context=None): message = _("Event has been done.") - self.message_post(cr, uid, ids, body=message, subtype_xml_id="event_subtype_closed", context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True def button_confirm_send_note(self, cr, uid, ids, context=None): From b9820db8f0b7c81429dd0c3471cb4835ef11c195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 19 Sep 2012 15:12:40 +0200 Subject: [PATCH 296/581] [CLEAN] hr_holidays, hr_recruitment, idea, mrp: cleaned subtypes. bzr revid: tde@openerp.com-20120919131240-7cc61fqg5eoom9zt --- addons/hr_holidays/hr_holidays.py | 28 +++++++++---------- addons/hr_holidays/hr_holidays_data.xml | 12 ++++---- addons/hr_recruitment/hr_recruitment.py | 14 +++++----- addons/hr_recruitment/hr_recruitment_data.xml | 18 +++--------- addons/idea/idea.py | 18 ++++++------ addons/idea/idea_data.xml | 19 ------------- addons/mrp/mrp.py | 10 +++---- addons/mrp/mrp_data.xml | 22 +++++---------- 8 files changed, 50 insertions(+), 91 deletions(-) diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index 4e85313e2e4..731efad4d8d 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -352,44 +352,42 @@ class hr_holidays(osv.osv): def needaction_domain_get(self, cr, uid, ids, context=None): # to be tested, otherwise convert into employee_id in ... emp_obj = self.pool.get('hr.employee') - empids = emp_obj.search(cr, uid, [('parent_id.user_id','=',uid)], context=context) - dom = [ - '&', ('state','=','confirm'),('employee_id', 'in', empids) - ] + empids = emp_obj.search(cr, uid, [('parent_id.user_id', '=', uid)], context=context) + dom = ['&', ('state', '=', 'confirm'), ('employee_id', 'in', empids)] # if this user is a hr.manager, he should do second validations if self.pool.get('res.users').has_group(cr, uid, 'base.group_hr_manager'): - dom = ['|'] + dom + [ ('state','=','validate1') ] + dom = ['|'] + dom + [('state', '=', 'validate1')] return dom def create_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): - self.message_post(cr, uid, ids, - _("The request has been created and is waiting confirmation."),subtype_xml_id="hr_holidays_subtype_new", context=context) + self.message_post(cr, uid, ids, + _("The request has been created and is waiting confirmation."), context=context) return True - + def holidays_confirm_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids): self.message_post(cr, uid, [obj.id], - _("The request has been submitted and is waiting for validation by the manager."), context=context) - + _("The request has been submitted and is waiting for validation by the manager."), subtype_xml_id="mt_holidays_confirm", context=context) + def holidays_first_validate_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): self.message_post(cr, uid, [obj.id], _("The request has been approved. A second validation is necessary and is now pending."), context=context) - + def holidays_validate_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids): if obj.double_validation: - self.message_post(cr, uid, [obj.id], + self.message_post(cr, uid, [obj.id], _("The request has been double validated. The validation process is now over."), context=context) else: self.message_post(cr, uid, [obj.id], - _("The request has been approved. The validation process is now over."), subtype_xml_id="hr_holidays_subtype_approved", context=context) - + _("The request has been approved. The validation process is now over."), subtype_xml_id="mt_holidays_closed", context=context) + def holidays_refuse_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids): self.message_post(cr, uid, [obj.id], - _("The request has been refused. The validation process is now over."), subtype_xml_id="hr_holidays_subtype_refused", context=context) + _("The request has been refused. The validation process is now over."), subtype_xml_id="mt_holidays_refused", context=context) class resource_calendar_leaves(osv.osv): diff --git a/addons/hr_holidays/hr_holidays_data.xml b/addons/hr_holidays/hr_holidays_data.xml index 0eb411e90cb..50a3f3fde17 100644 --- a/addons/hr_holidays/hr_holidays_data.xml +++ b/addons/hr_holidays/hr_holidays_data.xml @@ -43,17 +43,17 @@ Once validated, they are visible in the employee's calendar. HR officers can def True brown
            - - - new + + + + confirmed hr.holidays - - + approved hr.holidays - + refused hr.holidays diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index ec2ea806fec..49a80ef26d6 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -461,14 +461,14 @@ class hr_applicant(base_stage, osv.Model): """ Override of the (void) default notification method. """ if not stage_id: return True stage_name = self.pool.get('hr.recruitment.stage').name_get(cr, uid, [stage_id], context=context)[0][1] - return self.message_post(cr, uid, ids, body= _("Stage changed to %s.") % (stage_name), subtype_xml_id="hr_recruitment_subtype_stage_change", context=context) + return self.message_post(cr, uid, ids, body=_("Stage changed to %s.") % (stage_name), context=context) def case_get_note_msg_prefix(self, cr, uid, id, context=None): return 'Applicant' def case_open_send_note(self, cr, uid, ids, context=None): message = _("Applicant has been set in progress.") - return self.message_post(cr, uid, ids, body=message, subtype_xml_id="hr_recruitment_subtype_in_progress", context=context) + return self.message_post(cr, uid, ids, body=message, context=context) def case_close_send_note(self, cr, uid, ids, context=None): if context is None: @@ -476,23 +476,23 @@ class hr_applicant(base_stage, osv.Model): for applicant in self.browse(cr, uid, ids, context=context): if applicant.emp_id: message = _("Applicant has been hired and created as an employee.") - self.message_post(cr, uid, [applicant.id], body=message, subtype_xml_id="hr_recruitment_subtype_hired", context=context) + self.message_post(cr, uid, [applicant.id], body=message, subtype_xml_id="mt_recruitment_hired", context=context) else: message = _("Applicant has been hired.") - self.message_post(cr, uid, [applicant.id], body=message, subtype_xml_id="hr_recruitment_subtype_hired", context=context) + self.message_post(cr, uid, [applicant.id], body=message, subtype_xml_id="mt_recruitment_hired", context=context) return True def case_cancel_send_note(self, cr, uid, ids, context=None): msg = 'Applicant refused.' - return self.message_post(cr, uid, ids, body=msg, subtype_xml_id="hr_recruitment_subtype_refused", context=context) + return self.message_post(cr, uid, ids, body=msg, subtype_xml_id="mt_recruitment_refused", context=context) def case_reset_send_note(self, cr, uid, ids, context=None): message =_("Applicant has been set as new.") - return self.message_post(cr, uid, ids, body=message, subtype_xml_id="hr_recruitment_subtype_new", context=context) + return self.message_post(cr, uid, ids, body=message, subtype_xml_id="mt_recruitment_new", context=context) def create_send_note(self, cr, uid, ids, context=None): message = _("Applicant has been created.") - return self.message_post(cr, uid, ids, body=message, subtype_xml_id="hr_recruitment_subtype_new", context=context) + return self.message_post(cr, uid, ids, body=message, subtype_xml_id="mt_recruitment_new", context=context) class hr_job(osv.osv): diff --git a/addons/hr_recruitment/hr_recruitment_data.xml b/addons/hr_recruitment/hr_recruitment_data.xml index dedeb20a3dc..1fb79227770 100644 --- a/addons/hr_recruitment/hr_recruitment_data.xml +++ b/addons/hr_recruitment/hr_recruitment_data.xml @@ -461,30 +461,20 @@ You can automatically receive job application though an email gateway, see the H - - + + new hr.applicant - - + hired hr.applicant - + refused hr.applicant - - stage change - hr.applicant - - - - in progress - hr.applicant - diff --git a/addons/idea/idea.py b/addons/idea/idea.py index f8346ec2bba..14fbe5eda17 100644 --- a/addons/idea/idea.py +++ b/addons/idea/idea.py @@ -66,23 +66,21 @@ class idea_idea(osv.osv): _order = 'name asc' def idea_cancel(self, cr, uid, ids, context={}): - self.write(cr, uid, ids, { 'state': 'cancel' }) - self.message_post(cr, uid, ids, body=_('Idea cancelled.'), subtype_xml_id="idea_subtype_cancelled", context=context) + self.write(cr, uid, ids, {'state': 'cancel'}, context=context) + self.message_post(cr, uid, ids, body=_('Idea cancelled.'), context=context) return True def idea_open(self, cr, uid, ids, context={}): - self.write(cr, uid, ids, { 'state': 'open'}) - self.message_post(cr, uid, ids, body=_('Idea accepted.'), subtype_xml_id="idea_subtype_open", context=context) + self.write(cr, uid, ids, {'state': 'open'}, context=context) + self.message_post(cr, uid, ids, body=_('Idea accepted.'), context=context) return True def idea_close(self, cr, uid, ids, context={}): - self.message_post(cr, uid, ids, body=_('Idea closed.'), subtype_xml_id="idea_subtype_closed", context=context) - self.write(cr, uid, ids, { 'state': 'close' }) + self.write(cr, uid, ids, {'state': 'close'}, context=context) + self.message_post(cr, uid, ids, body=_('Idea closed.'), context=context) return True def idea_draft(self, cr, uid, ids, context={}): - self.message_post(cr, uid, ids, body=_('Idea reset to draft.'), subtype_xml_id="idea_subtype_new", context=context) - self.write(cr, uid, ids, { 'state': 'draft' }) + self.write(cr, uid, ids, {'state': 'draft'}, context=context) + self.message_post(cr, uid, ids, body=_('Idea reset to draft.'), context=context) return True -idea_idea() - diff --git a/addons/idea/idea_data.xml b/addons/idea/idea_data.xml index b4f3f70d2dd..421cb6a9eef 100644 --- a/addons/idea/idea_data.xml +++ b/addons/idea/idea_data.xml @@ -16,25 +16,6 @@ - - - new - idea.idea - - - - open - idea.idea - - - cancelled - idea.idea - - - - closed - idea.idea - diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index bc0baae71e8..b4dece5dfa4 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -1044,27 +1044,27 @@ class mrp_production(osv.osv): # --------------------------------------------------- def create_send_note(self, cr, uid, ids, context=None): - self.message_post(cr, uid, ids, body=_("Manufacturing order has been created."), subtype_xml_id="mrp_subtype_new", context=context) + self.message_post(cr, uid, ids, body=_("Manufacturing order has been created."), subtype_xml_id="mt_mrp_order_new", context=context) return True def action_cancel_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order has been canceled.") - self.message_post(cr, uid, ids, body=message, subtype_xml_id="mrp_subtype_cancelled", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="mt_mrp_order_canceled", context=context) return True def action_ready_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order is ready to produce.") - self.message_post(cr, uid, ids, body=message, subtype_xml_id="mrp_subtype_ready", context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True def action_in_production_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order is in production.") - self.message_post(cr, uid, ids, body=message, subtype_xml_id="mrp_subtype_production", context=context) + self.message_post(cr, uid, ids, body=message, context=context) return True def action_done_send_note(self, cr, uid, ids, context=None): message = _("Manufacturing order has been done.") - self.message_post(cr, uid, ids, body=message, subtype_xml_id="mrp_subtype_closed", context=context) + self.message_post(cr, uid, ids, body=message, subtype_xml_id="mt_mrp_order_closed", context=context) return True def action_confirm_send_note(self, cr, uid, ids, context=None): diff --git a/addons/mrp/mrp_data.xml b/addons/mrp/mrp_data.xml index 3740f03bdc8..79e202cd8e0 100644 --- a/addons/mrp/mrp_data.xml +++ b/addons/mrp/mrp_data.xml @@ -26,27 +26,19 @@ From the Manufacturing Settings, you can choose to compute production schedules 1 1 - - - new + + + + created mrp.production - - ready + + canceled mrp.production - - production - mrp.production - - - cancelled - mrp.production - - - + closed mrp.production From f46b934a7ae845b2327dc76be21102ba4578354b Mon Sep 17 00:00:00 2001 From: "Bharat Devnani (OpenERP)" Date: Wed, 19 Sep 2012 18:54:54 +0530 Subject: [PATCH 297/581] [IMP] removed same buttons from More button located at top bzr revid: bde@tinyerp.com-20120919132454-vic77ff22hjro39t --- .../voucher_payment_receipt_view.xml | 5 ++-- addons/event/event_view.xml | 2 +- addons/hr_contract/hr_contract_view.xml | 15 +++++----- addons/hr_evaluation/hr_evaluation_view.xml | 10 +++++-- addons/hr_payroll/hr_payroll_view.xml | 16 +++++----- .../hr_timesheet_sheet_view.xml | 10 +++++-- .../lunch/wizard/lunch_order_cancel_view.xml | 2 +- .../lunch/wizard/lunch_order_confirm_view.xml | 2 +- .../wizard/mrp_repair_make_invoice_view.xml | 3 +- addons/project/project_view.xml | 25 +++++----------- addons/project_issue/project_issue_view.xml | 13 ++++---- .../project_long_term_view.xml | 30 +++++++++---------- 12 files changed, 65 insertions(+), 68 deletions(-) diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml index c41ed6d5577..a05ae02183b 100644 --- a/addons/account_voucher/voucher_payment_receipt_view.xml +++ b/addons/account_voucher/voucher_payment_receipt_view.xml @@ -153,7 +153,7 @@ - + @@ -325,8 +325,7 @@ - - + diff --git a/addons/event/event_view.xml b/addons/event/event_view.xml index fd396053d5d..27367cca6e6 100644 --- a/addons/event/event_view.xml +++ b/addons/event/event_view.xml @@ -4,7 +4,7 @@ - + + hr.contract + form + tree,form + {'search_default_employee_id': [active_id], 'default_employee_id': active_id} + @@ -21,7 +20,7 @@ - + +
            +

            Message types to follow

            +
              +
              -

                @@ -30,18 +33,14 @@ \ -
              • +
              • - - + +
                - - - -
              • From b1d05506ebe2eb1c262e5dbec05f7305603320f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 20 Sep 2012 13:49:47 +0200 Subject: [PATCH 309/581] [FIX] mail_thread: fixed message_subscribe, not recognizing void list compared to none; misc fixes of subtype. bzr revid: tde@openerp.com-20120920114947-64643cmduzww5i5c --- addons/mail/mail_thread.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 39a8e011f3c..5ad76a44c4f 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -143,13 +143,15 @@ class mail_thread(osv.AbstractModel): - message_is_follower: is uid in the document followers - message_subtype_data: data about document subtypes: which are available, which are followed if any """ - res = dict((id, dict(message_subtype_data='')) for id in ids) + res = dict((id, dict(message_subtype_data='', message_is_follower=False)) for id in ids) user_pid = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0] # find current model subtypes, add them to a dictionary subtype_obj = self.pool.get('mail.message.subtype') subtype_ids = subtype_obj.search(cr, uid, ['|', ('res_model', '=', self._name), ('res_model', '=', False)], context=context) - subtype_dict = dict((subtype.name, dict(default=subtype.default, followed=False)) for subtype in subtype_obj.browse(cr, uid, subtype_ids, context=context)) + subtype_dict = dict((subtype.name, dict(default=subtype.default, followed=False, id=subtype.id)) for subtype in subtype_obj.browse(cr, uid, subtype_ids, context=context)) + for id in ids: + res[id]['message_subtype_data'] = subtype_dict.copy() # find the document followers, update the data fol_obj = self.pool.get('mail.followers') @@ -159,11 +161,11 @@ class mail_thread(osv.AbstractModel): ('res_model', '=', self._name), ], context=context) for fol in fol_obj.browse(cr, uid, fol_ids, context=context): - thread_subtype_dict = subtype_dict.copy() + thread_subtype_dict = res[fol.res_id]['message_subtype_data'] res[fol.res_id]['message_is_follower'] = True for subtype in fol.subtype_ids: thread_subtype_dict[subtype.name]['followed'] = True - res[fol.res_id]['message_subtype_data'] = '%s' % thread_subtype_dict + res[fol.res_id]['message_subtype_data'] = thread_subtype_dict return res @@ -663,6 +665,7 @@ class mail_thread(osv.AbstractModel): def message_subscribe_users(self, cr, uid, ids, user_ids=None, subtype_ids=None, context=None): """ Wrapper on message_subscribe, using users. If user_ids is not provided, subscribe uid instead. """ + print cr, uid, ids, user_ids, subtype_ids, context if not user_ids: user_ids = [uid] partner_ids = [user.partner_id.id for user in self.pool.get('res.users').browse(cr, uid, user_ids, context=context)] @@ -671,15 +674,14 @@ class mail_thread(osv.AbstractModel): def message_subscribe(self, cr, uid, ids, partner_ids, subtype_ids=None, context=None): """ Add partners to the records followers. """ self.write(cr, uid, ids, {'message_follower_ids': [(4, pid) for pid in partner_ids]}, context=context) - - if not subtype_ids: + # if subtypes are not specified (and not set to a void list), fetch default ones + if subtype_ids is None: subtype_obj = self.pool.get('mail.message.subtype') subtype_ids = subtype_obj.search(cr, uid, [('default', '=', True), '|', ('res_model', '=', self._name), ('res_model', '=', False)], context=context) - + # update the subscriptions fol_obj = self.pool.get('mail.followers') fol_ids = fol_obj.search(cr, uid, [('res_model', '=', self._name), ('res_id', 'in', ids), ('partner_id', 'in', partner_ids)], context=context) fol_obj.write(cr, uid, fol_ids, {'subtype_ids': [(6, 0, subtype_ids)]}, context=context) - return True def message_unsubscribe_users(self, cr, uid, ids, user_ids=None, context=None): From 2a33b4cb266e1c087998e9b47bb60431cce5ece7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 20 Sep 2012 13:57:46 +0200 Subject: [PATCH 310/581] [FIX] mail: fixed tests. bzr revid: tde@openerp.com-20120920115746-6ospayxyyi6y9c3z --- addons/mail/tests/test_mail.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py index 28dd3e6fe4f..11bc860fb0f 100644 --- a/addons/mail/tests/test_mail.py +++ b/addons/mail/tests/test_mail.py @@ -306,11 +306,10 @@ class test_mail(TestMailMockups): # ---------------------------------------- group_pigs.refresh() - subtype_data = eval(group_pigs.message_subtype_data) - self.assertEqual(set(subtype_data.keys()), set(['comment', 'mt_mg_def', 'mt_all_def', 'mt_mg_nodef', 'mt_all_nodef']), 'mail.group available subtypes incorrect') - self.assertFalse(subtype_data['comment']['followed'], 'Admin should not follow comments in pigs') - self.assertTrue(subtype_data['mt_mg_nodef']['followed'], 'Admin should follow mt_mg_nodef in pigs') - self.assertTrue(subtype_data['mt_all_nodef']['followed'], 'Admin should follow mt_all_nodef in pigs') + self.assertEqual(set(group_pigs.message_subtype_data.keys()), set(['comment', 'mt_mg_def', 'mt_all_def', 'mt_mg_nodef', 'mt_all_nodef']), 'mail.group available subtypes incorrect') + self.assertFalse(group_pigs.message_subtype_data['comment']['followed'], 'Admin should not follow comments in pigs') + self.assertTrue(group_pigs.message_subtype_data['mt_mg_nodef']['followed'], 'Admin should follow mt_mg_nodef in pigs') + self.assertTrue(group_pigs.message_subtype_data['mt_all_nodef']['followed'], 'Admin should follow mt_all_nodef in pigs') def test_20_message_post(self): """ Tests designed for message_post. """ From 1206b8f7a0c8d2de9cd7ae05eefbd1c84433896f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 20 Sep 2012 13:59:00 +0200 Subject: [PATCH 311/581] [IMP] Addons: added message_is_follower and message_subtype_data invisible fields to all views using Chatter and Followers widgets. bzr revid: tde@openerp.com-20120920115900-vvpfhjvw135vhf91 --- addons/account/account_invoice_view.xml | 6 ++++ .../account_voucher/account_voucher_view.xml | 3 ++ .../voucher_payment_receipt_view.xml | 6 ++++ .../voucher_sales_purchase_view.xml | 6 ++++ addons/analytic/analytic_view.xml | 3 ++ addons/base_calendar/crm_meeting_view.xml | 3 ++ addons/crm/crm_lead_view.xml | 6 ++++ addons/crm/crm_phonecall_view.xml | 3 ++ addons/crm_claim/crm_claim_view.xml | 3 ++ addons/crm_helpdesk/crm_helpdesk_view.xml | 3 ++ addons/event/event_view.xml | 6 ++++ addons/hr_expense/hr_expense_view.xml | 3 ++ addons/hr_holidays/hr_holidays_view.xml | 6 ++++ addons/hr_recruitment/hr_recruitment_view.xml | 3 ++ addons/idea/idea_view.xml | 3 ++ addons/mail/mail_group_view.xml | 6 ++++ addons/mail/mail_thread.py | 1 - addons/mail/res_partner_view.xml | 3 ++ addons/mrp/mrp_view.xml | 6 ++++ addons/mrp_operations/mrp_operations_view.xml | 3 ++ addons/mrp_repair/mrp_repair_view.xml | 3 ++ addons/note/note_view.xml | 32 +++++++++++-------- addons/procurement/procurement_view.xml | 3 ++ addons/product/product_view.xml | 3 ++ addons/project/project_view.xml | 6 ++++ addons/project_issue/project_issue_view.xml | 3 ++ addons/purchase/purchase_view.xml | 3 ++ .../purchase_requisition_view.xml | 3 ++ addons/sale/sale_view.xml | 3 ++ addons/stock/stock_view.xml | 6 ++++ 30 files changed, 133 insertions(+), 14 deletions(-) diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index 1c4d83106ca..a24c86c58f4 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -279,6 +279,9 @@
                + + +
                @@ -438,6 +441,9 @@
                + + +
                diff --git a/addons/account_voucher/account_voucher_view.xml b/addons/account_voucher/account_voucher_view.xml index 07647d02fe3..daf1f7a361e 100644 --- a/addons/account_voucher/account_voucher_view.xml +++ b/addons/account_voucher/account_voucher_view.xml @@ -111,6 +111,9 @@
                + + +
                diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml index c41ed6d5577..0e7e4dd3fe7 100644 --- a/addons/account_voucher/voucher_payment_receipt_view.xml +++ b/addons/account_voucher/voucher_payment_receipt_view.xml @@ -240,6 +240,9 @@
                + + +
                @@ -409,6 +412,9 @@
                + + +
                diff --git a/addons/account_voucher/voucher_sales_purchase_view.xml b/addons/account_voucher/voucher_sales_purchase_view.xml index 5bcecfa268e..2ba0aa6e691 100644 --- a/addons/account_voucher/voucher_sales_purchase_view.xml +++ b/addons/account_voucher/voucher_sales_purchase_view.xml @@ -147,6 +147,9 @@
                + + +
                @@ -302,6 +305,9 @@
                + + +
                diff --git a/addons/analytic/analytic_view.xml b/addons/analytic/analytic_view.xml index 51f5428002f..1613a3a20b0 100644 --- a/addons/analytic/analytic_view.xml +++ b/addons/analytic/analytic_view.xml @@ -54,6 +54,9 @@
                + + +
                diff --git a/addons/base_calendar/crm_meeting_view.xml b/addons/base_calendar/crm_meeting_view.xml index b963de68130..88f62c5320a 100644 --- a/addons/base_calendar/crm_meeting_view.xml +++ b/addons/base_calendar/crm_meeting_view.xml @@ -230,6 +230,9 @@
                + + +
                diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml index f018a355579..4bfa145188c 100644 --- a/addons/crm/crm_lead_view.xml +++ b/addons/crm/crm_lead_view.xml @@ -222,6 +222,9 @@
                + + +
                @@ -522,6 +525,9 @@
                + + +
                diff --git a/addons/crm/crm_phonecall_view.xml b/addons/crm/crm_phonecall_view.xml index 8c1e1c9ec76..160c3bfe388 100644 --- a/addons/crm/crm_phonecall_view.xml +++ b/addons/crm/crm_phonecall_view.xml @@ -151,6 +151,9 @@
                + + +
                diff --git a/addons/crm_claim/crm_claim_view.xml b/addons/crm_claim/crm_claim_view.xml index 820fb38e58a..db9a75eca5e 100644 --- a/addons/crm_claim/crm_claim_view.xml +++ b/addons/crm_claim/crm_claim_view.xml @@ -182,6 +182,9 @@
                + + +
                diff --git a/addons/crm_helpdesk/crm_helpdesk_view.xml b/addons/crm_helpdesk/crm_helpdesk_view.xml index 5399c9880ca..aec2b8c1e4c 100644 --- a/addons/crm_helpdesk/crm_helpdesk_view.xml +++ b/addons/crm_helpdesk/crm_helpdesk_view.xml @@ -100,6 +100,9 @@
                + + +
                diff --git a/addons/event/event_view.xml b/addons/event/event_view.xml index fd396053d5d..b2502c23b06 100644 --- a/addons/event/event_view.xml +++ b/addons/event/event_view.xml @@ -198,6 +198,9 @@
                + + +
                @@ -480,6 +483,9 @@
                + + +
                diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml index 5389f88b885..e577d196695 100644 --- a/addons/hr_expense/hr_expense_view.xml +++ b/addons/hr_expense/hr_expense_view.xml @@ -140,6 +140,9 @@
                + + +
                diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml index 5a2e0603b88..8ac67fa1723 100644 --- a/addons/hr_holidays/hr_holidays_view.xml +++ b/addons/hr_holidays/hr_holidays_view.xml @@ -122,6 +122,9 @@
                + + +
                @@ -159,6 +162,9 @@
                + + +
                diff --git a/addons/hr_recruitment/hr_recruitment_view.xml b/addons/hr_recruitment/hr_recruitment_view.xml index 08e5f31a2d2..e81da63b73c 100644 --- a/addons/hr_recruitment/hr_recruitment_view.xml +++ b/addons/hr_recruitment/hr_recruitment_view.xml @@ -184,6 +184,9 @@
                + + +
                diff --git a/addons/idea/idea_view.xml b/addons/idea/idea_view.xml index eab3d03ceea..3861e86bff8 100644 --- a/addons/idea/idea_view.xml +++ b/addons/idea/idea_view.xml @@ -78,6 +78,9 @@
                + + +
                diff --git a/addons/mail/mail_group_view.xml b/addons/mail/mail_group_view.xml index 31beba80ecc..a805fb3b575 100644 --- a/addons/mail/mail_group_view.xml +++ b/addons/mail/mail_group_view.xml @@ -16,6 +16,9 @@ + + + @@ -83,6 +86,9 @@
                + + +
                diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 5ad76a44c4f..bf50b582323 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -665,7 +665,6 @@ class mail_thread(osv.AbstractModel): def message_subscribe_users(self, cr, uid, ids, user_ids=None, subtype_ids=None, context=None): """ Wrapper on message_subscribe, using users. If user_ids is not provided, subscribe uid instead. """ - print cr, uid, ids, user_ids, subtype_ids, context if not user_ids: user_ids = [uid] partner_ids = [user.partner_id.id for user in self.pool.get('res.users').browse(cr, uid, user_ids, context=context)] diff --git a/addons/mail/res_partner_view.xml b/addons/mail/res_partner_view.xml index 2a8430926d5..9589b6409a7 100644 --- a/addons/mail/res_partner_view.xml +++ b/addons/mail/res_partner_view.xml @@ -11,6 +11,9 @@
                + + +
                diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml index d05893cf778..a379ae9b4cb 100644 --- a/addons/mrp/mrp_view.xml +++ b/addons/mrp/mrp_view.xml @@ -410,6 +410,9 @@
                + + +
                @@ -788,6 +791,9 @@
                + + +
                diff --git a/addons/mrp_operations/mrp_operations_view.xml b/addons/mrp_operations/mrp_operations_view.xml index 834f3000472..f069f06fca7 100644 --- a/addons/mrp_operations/mrp_operations_view.xml +++ b/addons/mrp_operations/mrp_operations_view.xml @@ -108,6 +108,9 @@
                + + +
                diff --git a/addons/mrp_repair/mrp_repair_view.xml b/addons/mrp_repair/mrp_repair_view.xml index 55cbe49c75b..9158944f952 100644 --- a/addons/mrp_repair/mrp_repair_view.xml +++ b/addons/mrp_repair/mrp_repair_view.xml @@ -190,6 +190,9 @@
                + + +
                diff --git a/addons/note/note_view.xml b/addons/note/note_view.xml index 8d943dde44d..4ed2fade43f 100644 --- a/addons/note/note_view.xml +++ b/addons/note/note_view.xml @@ -50,6 +50,7 @@ + @@ -108,19 +109,24 @@ - note.note.form - note.note - -
                -
                - - -
                - - - - - + note.note.form + note.note + +
                +
                + + +
                + +
                + + + + + +
                + +
                diff --git a/addons/procurement/procurement_view.xml b/addons/procurement/procurement_view.xml index bf73b383216..b6138ca78d3 100644 --- a/addons/procurement/procurement_view.xml +++ b/addons/procurement/procurement_view.xml @@ -104,6 +104,9 @@
                + + +
                diff --git a/addons/product/product_view.xml b/addons/product/product_view.xml index d04e6f17fe8..05e3d0b2497 100644 --- a/addons/product/product_view.xml +++ b/addons/product/product_view.xml @@ -202,6 +202,9 @@
                + + +
                diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index ff8ac943a67..4d7bceb4599 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -154,6 +154,9 @@
                + + +
                @@ -482,6 +485,9 @@
                + + +
                diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index be7427fe8f4..6d1d0272ab0 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -160,6 +160,9 @@
                + + +
                diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml index 796fd1351a9..9a2bd02f9a2 100644 --- a/addons/purchase/purchase_view.xml +++ b/addons/purchase/purchase_view.xml @@ -265,6 +265,9 @@
                + + +
                diff --git a/addons/purchase_requisition/purchase_requisition_view.xml b/addons/purchase_requisition/purchase_requisition_view.xml index 1fafec92bc7..13ea40df765 100644 --- a/addons/purchase_requisition/purchase_requisition_view.xml +++ b/addons/purchase_requisition/purchase_requisition_view.xml @@ -103,6 +103,9 @@
                + + +
                diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml index 5c2320a7d5c..32d9b03cdff 100644 --- a/addons/sale/sale_view.xml +++ b/addons/sale/sale_view.xml @@ -352,6 +352,9 @@
                + + +
                diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml index 83fed186f42..1a8e7c0ff3f 100644 --- a/addons/stock/stock_view.xml +++ b/addons/stock/stock_view.xml @@ -918,6 +918,9 @@
                + + +
                @@ -1044,6 +1047,9 @@
                + + +
                From 6fa56dcba546286157a07771c8c5a35e6648cec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 20 Sep 2012 14:20:24 +0200 Subject: [PATCH 312/581] [IMP] Followers widget: cleaned code, and now more clearly uses message_is_follower and message_subtype_data fields. bzr revid: tde@openerp.com-20120920122024-wf8ilufgrp1vhccd --- addons/mail/static/src/js/mail_followers.js | 41 ++++++++++--------- addons/mail/static/src/xml/mail_followers.xml | 4 +- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js index c048550611b..58c53d5556a 100644 --- a/addons/mail/static/src/js/mail_followers.js +++ b/addons/mail/static/src/js/mail_followers.js @@ -55,7 +55,7 @@ openerp_mail_followers = function(session, mail) { .mouseover(function () { $(this).html('Unfollow').removeClass('oe_mail_button_mouseout').addClass('oe_mail_button_mouseover'); }) .mouseleave(function () { $(this).html('Following').removeClass('oe_mail_button_mouseover').addClass('oe_mail_button_mouseout'); }); this.$el.on('click', 'button.oe_mail_button_follow', function () { self.do_follow(); }); - this.$el.on('click', 'ul.oe_mail_recthread_subtypes', function () {self.do_update_subscription(); }) + this.$el.on('click', 'ul.oe_mail_subtypes', function () {self.do_update_subscription(); }) this.$el.on('click', 'button.oe_mail_button_invite', function(event) { action = { type: 'ir.actions.act_window', @@ -80,6 +80,18 @@ openerp_mail_followers = function(session, mail) { }); }, + get_or_set: function(field_name, value) { + if (this.view.fields[field_name]) { + if (value !== undefined) { + this.view.fields[field_name].set_value(value); + } + return this.view.fields[field_name].get_value(); + } + else { + return value; + } + }, + set_value: function(value_, message_is_follower_value_, message_subtype_data_value_) { this.reinit(); if (! this.view.datarecord.id || @@ -87,36 +99,25 @@ openerp_mail_followers = function(session, mail) { this.$el.find('div.oe_mail_recthread_aside').hide(); return; } - if (message_subtype_data_value_ === undefined) { - this.message_subtype_data_value_ = this.view.fields.message_subtype_data && this.view.fields.message_subtype_data.get_value() || {}; - } - else { - this.message_subtype_data_value_ = message_subtype_data_value_; - } - if (message_is_follower_value_ === undefined) { - this.message_is_follower_value_ = this.view.fields.message_is_follower && this.view.fields.message_is_follower.get_value() || false; - } - else { - this.message_is_follower_value_ = message_is_follower_value_; - } + this.message_is_follower_value_ = this.get_or_set('message_is_follower', message_is_follower_value_) || false; + this.message_subtype_data_value_ = this.get_or_set('message_subtype_data', message_subtype_data_value_) || {}; return this.fetch_followers(value_ || this.get_value()); }, fetch_followers: function (value_) { - return this.ds_follow.call('read', [value_, ['name', 'user_ids']]).pipe(this.proxy('display_followers')); + return this.ds_follow.call('read', [value_, ['name']]).pipe(this.proxy('display_followers')); }, /** Display the followers, evaluate is_follower directly */ display_followers: function (records) { var self = this; - this.message_is_follower = _.indexOf(_.flatten(_.pluck(records, 'user_ids')), this.session.uid) != -1; var node_user_list = this.$el.find('ul.oe_mail_followers_display').empty(); this.$el.find('div.oe_mail_recthread_followers h4').html(this.options.title + ' (' + records.length + ')'); _(records).each(function (record) { record.avatar_url = mail.ChatterUtils.get_image(self.session, 'res.partner', 'image_small', record.id); $(session.web.qweb.render('mail.followers.partner', {'record': record})).appendTo(node_user_list); }); - if (this.message_is_follower) { + if (this.message_is_follower_value_) { this.$el.find('button.oe_mail_button_follow').hide(); this.$el.find('button.oe_mail_button_unfollow').show(); } @@ -129,9 +130,11 @@ openerp_mail_followers = function(session, mail) { /** Display subtypes: {'name': default, followed} */ display_subtypes: function (records) { - var self = this - // this.$el.find('ul.oe_mail_recthread_subtype').show(); - var subtype_list = this.$el.find('ul.oe_mail_recthread_subtypes').empty(); + if (! this.message_is_follower_value_) { + this.$('div.oe_mail_recthread_subtypes').remove(); + return; + } + var subtype_list = this.$el.find('ul.oe_mail_subtypes').empty(); _(records).each(function (record, record_name) { record.name = record_name; record.followed = record.followed || undefined; diff --git a/addons/mail/static/src/xml/mail_followers.xml b/addons/mail/static/src/xml/mail_followers.xml index b2922753acf..05eb349ea5d 100644 --- a/addons/mail/static/src/xml/mail_followers.xml +++ b/addons/mail/static/src/xml/mail_followers.xml @@ -10,9 +10,9 @@ -
                +

                Message types to follow

                -
                  +
                    From f5c64f0b1554b683de1a3c4bd42b4ac8640794c2 Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Thu, 20 Sep 2012 14:38:45 +0200 Subject: [PATCH 313/581] [IMP] pre-fill portal's contact form fields e-mail and phone, when it's possible bzr revid: abo@openerp.com-20120920123845-4gjv90n4tn20t3dq --- addons/portal_crm/wizard/contact.py | 34 +++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/addons/portal_crm/wizard/contact.py b/addons/portal_crm/wizard/contact.py index 3a08e1bce9a..516bb30b471 100644 --- a/addons/portal_crm/wizard/contact.py +++ b/addons/portal_crm/wizard/contact.py @@ -40,6 +40,20 @@ class crm_contact_us(osv.TransientModel): r = self.pool.get('res.company').search(cr, uid, [], context=context) return r + def _get_current_user_name(self, cr, uid, context=None): + """ + If the user is logged in (i.e. not anonymous), get the user's name to + pre-fill the partner_name field. + + @return current user's name if the user isn't "anonymous", None otherwise + """ + user = self.pool.get('res.users').read(cr, uid, uid, ['login'], context) + + if (user['login'] != 'anonymous'): + return self.pool.get('res.users').name_get(cr, uid, uid, context)[0][1] + else: + return None + def _get_current_user_email(self, cr, uid, context=None): """ If the user is logged in (i.e. not anonymous), get the user's email to @@ -54,9 +68,25 @@ class crm_contact_us(osv.TransientModel): else: return None + def _get_current_user_phone(self, cr, uid, context=None): + """ + If the user is logged in (i.e. not anonymous), get the user's phone to + pre-fill the phone field. + + @return current user's phone if the user isn't "anonymous", None otherwise + """ + user = self.pool.get('res.users').read(cr, uid, uid, ['login', 'phone'], context) + + if (user['login'] != 'anonymous' and user['phone']): + return user['phone'] + else: + return None + _defaults = { - 'email_from' : _get_current_user_email, - 'company_ids' : _get_companies, + 'partner_name': _get_current_user_name, + 'email_from': _get_current_user_email, + 'phone': _get_current_user_phone, + 'company_ids': _get_companies, } def create(self, cr, uid, values, context=None): From fda33df8a608fd5063ae45b7f9db73c9e1c65013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 20 Sep 2012 14:39:59 +0200 Subject: [PATCH 314/581] [FIX] Followers widget: fixed bad refreshing when going through various form views. bzr revid: tde@openerp.com-20120920123959-3799cpr57f7ac3u1 --- addons/mail/static/src/js/mail_followers.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js index 58c53d5556a..1e650ca7125 100644 --- a/addons/mail/static/src/js/mail_followers.js +++ b/addons/mail/static/src/js/mail_followers.js @@ -130,11 +130,10 @@ openerp_mail_followers = function(session, mail) { /** Display subtypes: {'name': default, followed} */ display_subtypes: function (records) { + var subtype_list = this.$('ul.oe_mail_subtypes').empty(); if (! this.message_is_follower_value_) { - this.$('div.oe_mail_recthread_subtypes').remove(); return; } - var subtype_list = this.$el.find('ul.oe_mail_subtypes').empty(); _(records).each(function (record, record_name) { record.name = record_name; record.followed = record.followed || undefined; From 62926be708d81935f2f47d92e4c312f2699133c5 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 20 Sep 2012 15:46:18 +0200 Subject: [PATCH 315/581] [WIP] oauth provider bzr revid: fme@openerp.com-20120920134618-ema9qyumuorvozig --- addons/auth_oauth_provider/__init__.py | 25 ++++++++++ addons/auth_oauth_provider/__openerp__.py | 42 ++++++++++++++++ .../controllers/__init__.py | 22 ++++++++ .../auth_oauth_provider/controllers/main.py | 38 ++++++++++++++ .../static/src/css/oauth_provider.css | 14 ++++++ .../static/src/css/oauth_provider.sass | 17 +++++++ .../static/src/js/oauth_provider.js | 50 +++++++++++++++++++ .../static/src/xml/oauth_provider.xml | 13 +++++ 8 files changed, 221 insertions(+) create mode 100644 addons/auth_oauth_provider/__init__.py create mode 100644 addons/auth_oauth_provider/__openerp__.py create mode 100644 addons/auth_oauth_provider/controllers/__init__.py create mode 100644 addons/auth_oauth_provider/controllers/main.py create mode 100644 addons/auth_oauth_provider/static/src/css/oauth_provider.css create mode 100644 addons/auth_oauth_provider/static/src/css/oauth_provider.sass create mode 100644 addons/auth_oauth_provider/static/src/js/oauth_provider.js create mode 100644 addons/auth_oauth_provider/static/src/xml/oauth_provider.xml diff --git a/addons/auth_oauth_provider/__init__.py b/addons/auth_oauth_provider/__init__.py new file mode 100644 index 00000000000..c19b731933c --- /dev/null +++ b/addons/auth_oauth_provider/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2010-2011 OpenERP s.a. (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +import controllers + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + diff --git a/addons/auth_oauth_provider/__openerp__.py b/addons/auth_oauth_provider/__openerp__.py new file mode 100644 index 00000000000..71a4971c9b8 --- /dev/null +++ b/addons/auth_oauth_provider/__openerp__.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2010-2012 OpenERP s.a. (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +{ + 'name': 'OAuth Provider', + 'version': '1.0', + 'category': 'Tools', + 'description': """ +Allow an openerp server to provide OAuth service. +================================================= +""", + 'author': 'OpenERP s.a.', + 'maintainer': 'OpenERP s.a.', + 'website': 'http://www.openerp.com', + 'depends': ['base', 'web'], + #'data': ['res_users.xml'], + 'js': ['static/src/js/oauth_provider.js'], + 'css': ['static/src/css/oauth_provider.css'], + 'qweb': ['static/src/xml/oauth_provider.xml'], + 'installable': True, + 'auto_install': False, +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auth_oauth_provider/controllers/__init__.py b/addons/auth_oauth_provider/controllers/__init__.py new file mode 100644 index 00000000000..c5f359681b9 --- /dev/null +++ b/addons/auth_oauth_provider/controllers/__init__.py @@ -0,0 +1,22 @@ +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2011 OpenERP SA (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +import main + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auth_oauth_provider/controllers/main.py b/addons/auth_oauth_provider/controllers/main.py new file mode 100644 index 00000000000..50eed95b234 --- /dev/null +++ b/addons/auth_oauth_provider/controllers/main.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2010-2012 OpenERP s.a. (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +#import oauth.oauth as oauth +try: + import openerp.addons.web.common.http as openerpweb +except ImportError: + import web.common.http as openerpweb # noqa + + +class AuthOAuthProvider(openerpweb.Controller): + _cp_path = '/oauth2' + + @openerpweb.jsonrequest + def get_access_token(self, req, **kw): + return { + 'access_token': 'hefwjkhfejwk' + } + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auth_oauth_provider/static/src/css/oauth_provider.css b/addons/auth_oauth_provider/static/src/css/oauth_provider.css new file mode 100644 index 00000000000..778179b63b4 --- /dev/null +++ b/addons/auth_oauth_provider/static/src/css/oauth_provider.css @@ -0,0 +1,14 @@ +@charset "utf-8"; +.openerp .oe_oauth_provider { + padding: 0 10px; +} +.openerp .oe_oauth_provider .oe_oauth_provider_error span.oe_i { + font-size: 60px; + color: #990000; + float: left; +} +.openerp .oe_oauth_provider .oe_oauth_provider_error ul { + list-style: none; + float: left; + font-weight: bold; +} diff --git a/addons/auth_oauth_provider/static/src/css/oauth_provider.sass b/addons/auth_oauth_provider/static/src/css/oauth_provider.sass new file mode 100644 index 00000000000..7921f4cc055 --- /dev/null +++ b/addons/auth_oauth_provider/static/src/css/oauth_provider.sass @@ -0,0 +1,17 @@ +@charset "utf-8" + + +.openerp .oe_oauth_provider + padding: 0 10px + .oe_oauth_provider_error + span.oe_i + font-size: 60px + color: #900 + float: left + ul + list-style: none + float: left + font-weight: bold + +// au BufWritePost,FileWritePost *.sass :!sass --style expanded --line-numbers > "%:p:r.css" +// vim:tabstop=4:shiftwidth=4:softtabstop=4:fdm=marker: diff --git a/addons/auth_oauth_provider/static/src/js/oauth_provider.js b/addons/auth_oauth_provider/static/src/js/oauth_provider.js new file mode 100644 index 00000000000..9612559d038 --- /dev/null +++ b/addons/auth_oauth_provider/static/src/js/oauth_provider.js @@ -0,0 +1,50 @@ +openerp.auth_oauth_provider = function(instance) { + +var QWeb = instance.web.qweb; +var _t = instance.web._t; + +instance.web.client_actions.add('oauth2_auth', 'instance.auth_oauth_provider.ProviderAction'); +instance.auth_oauth_provider.ProviderAction = instance.web.Widget.extend({ + template: "auth_oauth_provider", + start: function (parent) { + var self = this; + this._super.apply(this, arguments); + var params = $.deparam($.param.querystring()); + if (params.response_type !== 'token') { + this.error(_t("Unsupported 'response_type' parameter")); + } + if (!params.redirect_uri) { + this.error(_t("No 'redirect_uri' parameter given")); + } + // params.client_id TODO + // params.scope TODO + // params.approval_prompt TODO + if (!this._error) { + instance.session.rpc('/oauth2/get_access_token', {}).then(function(r) { + self.redirect(r.access_token); + }).fail(function() { + self.error(_t("An error occured while contacting the OpenERP server.")); + }); + } + }, + redirect: function(access_token) { + var params = $.deparam($.param.querystring()); + var a = document.createElement('a'); + a.href = params.redirect_uri; + var search = (a.search ? '&' : '?') + 'access_token=' + access_token; + if (params.state) { + search += "&state=" + params.state; + } + var redirect = a.protocol + '//' + a.host + a.pathname + search + a.hash; + //window.location = redirect; + console.log("redirect to", redirect); + }, + error: function(msg) { + this._error = true; + var $msg = $('
                  • ').addClass('oe_oauth_provider_error_text').text(msg); + $msg.appendTo(this.$('.oe_oauth_provider_error').show().find('ul')); + return false; + }, +}); + +}; diff --git a/addons/auth_oauth_provider/static/src/xml/oauth_provider.xml b/addons/auth_oauth_provider/static/src/xml/oauth_provider.xml new file mode 100644 index 00000000000..ddf6ff08789 --- /dev/null +++ b/addons/auth_oauth_provider/static/src/xml/oauth_provider.xml @@ -0,0 +1,13 @@ + + From 100c0a60a5e35d8377fd5225a1b77b745d9a9bd3 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 20 Sep 2012 16:00:41 +0200 Subject: [PATCH 316/581] [ADD] Added res_user oauth token field bzr revid: fme@openerp.com-20120920140041-eied4nfw8pjs6ye8 --- addons/auth_oauth_provider/__init__.py | 1 + .../auth_oauth_provider/controllers/main.py | 5 +-- addons/auth_oauth_provider/res_users.py | 33 +++++++++++++++++++ .../static/src/js/oauth_provider.js | 2 +- 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 addons/auth_oauth_provider/res_users.py diff --git a/addons/auth_oauth_provider/__init__.py b/addons/auth_oauth_provider/__init__.py index c19b731933c..a6f4a72100b 100644 --- a/addons/auth_oauth_provider/__init__.py +++ b/addons/auth_oauth_provider/__init__.py @@ -20,6 +20,7 @@ ############################################################################## import controllers +import res_users # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auth_oauth_provider/controllers/main.py b/addons/auth_oauth_provider/controllers/main.py index 50eed95b234..d0ca059aa93 100644 --- a/addons/auth_oauth_provider/controllers/main.py +++ b/addons/auth_oauth_provider/controllers/main.py @@ -30,9 +30,10 @@ class AuthOAuthProvider(openerpweb.Controller): _cp_path = '/oauth2' @openerpweb.jsonrequest - def get_access_token(self, req, **kw): + def get_token(self, req, **kw): + token = req.session.model('res.users').get_oauth_token() return { - 'access_token': 'hefwjkhfejwk' + 'access_token': token, } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auth_oauth_provider/res_users.py b/addons/auth_oauth_provider/res_users.py new file mode 100644 index 00000000000..667ef3f838e --- /dev/null +++ b/addons/auth_oauth_provider/res_users.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2010-2012 OpenERP s.a. (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from openerp.osv import osv, fields + +class res_users(osv.osv): + _inherit = 'res.users' + + _columns = { + 'last_oauth_token': fields.char('Last OAuth Token', size=64, readonly=True, invisible=True), + } + + def get_oauth_token(self, cr, uid, context=None): + return "TOKENJEFILWJLK" + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auth_oauth_provider/static/src/js/oauth_provider.js b/addons/auth_oauth_provider/static/src/js/oauth_provider.js index 9612559d038..f2bd4b21c00 100644 --- a/addons/auth_oauth_provider/static/src/js/oauth_provider.js +++ b/addons/auth_oauth_provider/static/src/js/oauth_provider.js @@ -20,7 +20,7 @@ instance.auth_oauth_provider.ProviderAction = instance.web.Widget.extend({ // params.scope TODO // params.approval_prompt TODO if (!this._error) { - instance.session.rpc('/oauth2/get_access_token', {}).then(function(r) { + instance.session.rpc('/oauth2/get_token', {}).then(function(r) { self.redirect(r.access_token); }).fail(function() { self.error(_t("An error occured while contacting the OpenERP server.")); From 3774f6d54572584b4860c712ad7e15b3d25fb1e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 20 Sep 2012 16:46:45 +0200 Subject: [PATCH 317/581] [IMP] [FIX] Chatter: fixed load more, message_read and expandables. Cleaned tests. bzr revid: tde@openerp.com-20120920144645-o92edguwjzws3t3e --- addons/mail/mail_message.py | 31 ++++++----- addons/mail/static/src/css/mail.css | 25 ++++----- addons/mail/static/src/js/mail.js | 86 ++++------------------------- addons/mail/static/src/xml/mail.xml | 19 ++++++- addons/mail/tests/test_mail.py | 22 ++++---- 5 files changed, 68 insertions(+), 115 deletions(-) diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index 362b027f6d1..dee44d9f8b8 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -208,7 +208,7 @@ class mail_message(osv.Model): if parent_message and current_level < level: base_domain += [('parent_id', '=', parent_message['id'])] elif parent_message: - base_domain += [('id', 'child_of', parent_message['id'])] + base_domain += [('id', 'child_of', parent_message['id']), ('id', '!=', parent_message['id'])] if domain: base_domain += domain extension = { 'type': 'expandable', @@ -219,7 +219,7 @@ class mail_message(osv.Model): } return extension - def message_read_tree_flatten(self, cr, uid, parent_message, messages, domain=[], level=0, current_level=0, context=None, limit=None): + def message_read_tree_flatten(self, cr, uid, parent_message, messages, domain=[], level=0, current_level=0, context=None, limit=None, add_expandable=True): """ Given a tree with several roots of following structure : [ {'id': 1, 'child_ids': [ {'id': 11, 'child_ids': [...] },], @@ -238,33 +238,36 @@ class mail_message(osv.Model): child_ids = msg_dict.pop('child_ids', []) msg_dict['child_ids'] = [] return [msg_dict] + child_ids + context = context or {} limit = limit or self._message_read_limit + # Depth-first flattening for message in messages: if message.get('type') == 'expandable': continue - message['child_ids'] = self.message_read_tree_flatten(cr, uid, message, message['child_ids'], domain, level, current_level + 1, context=context) + message['child_ids'] = self.message_read_tree_flatten(cr, uid, message, message['child_ids'], domain, level, current_level + 1, context=context, limit=limit) for child in message['child_ids']: + if child.get('type') == 'expandable': + continue message['child_nbr'] += child['child_nbr'] # Flatten if above maximum depth if current_level < level: return_list = messages else: return_list = [flat_message for message in messages for flat_message in _flatten(message)] + # Add expandable return_list = sorted(return_list, key=itemgetter(context.get('sort_key', 'id')), reverse=context.get('sort_reverse', True)) - if current_level == 0: - expandable = self.message_read_tree_get_expandable(cr, uid, parent_message, return_list and return_list[-1] or parent_message, [], current_level, level, context=context) - if len(return_list) >= limit: - print 'we need an expandable here' - print 'expandable', expandable - elif current_level <= level: - expandable = self.message_read_tree_get_expandable(cr, uid, parent_message, return_list and return_list[-1] or parent_message, [], current_level, level, context=context) - print 'expandable', expandable + if return_list and current_level == 0 and add_expandable: + expandable = self.message_read_tree_get_expandable(cr, uid, parent_message, return_list and return_list[-1] or parent_message, domain, current_level, level, context=context) + return_list.append(expandable) + elif return_list and current_level <= level and add_expandable: + expandable = self.message_read_tree_get_expandable(cr, uid, parent_message, return_list and return_list[-1] or parent_message, domain, current_level, level, context=context) + return_list.append(expandable) return return_list - def message_read(self, cr, uid, ids=False, domain=[], level=0, context=None, limit=None, parent_id=False): + def message_read(self, cr, uid, ids=False, domain=[], level=0, context=None, parent_id=False, limit=None): """ Read messages from mail.message, and get back a structured tree of messages to be displayed as discussion threads. If IDs is set, fetch these records. Otherwise use the domain to fetch messages. @@ -278,11 +281,11 @@ class mail_message(osv.Model): further parents :return list: list of trees of messages """ - limit = limit or self._message_read_limit context = context or {} if not ids: ids = self.search(cr, uid, domain, context=context, limit=limit) messages = self.browse(cr, uid, ids, context=context) + add_expandable = (len(messages) >= limit) # key: ID, value: record tree = {} @@ -305,7 +308,7 @@ class mail_message(osv.Model): tree[msg.id] = record # Flatten the result - result = self.message_read_tree_flatten(cr, uid, None, result, domain, level, context=context) + result = self.message_read_tree_flatten(cr, uid, None, result, domain, level, context=context, limit=limit, add_expandable=add_expandable) return result #------------------------------------------------------ diff --git a/addons/mail/static/src/css/mail.css b/addons/mail/static/src/css/mail.css index 2f9b35f1c95..8e4185b17f9 100644 --- a/addons/mail/static/src/css/mail.css +++ b/addons/mail/static/src/css/mail.css @@ -55,16 +55,6 @@ height: 28px; } -.openerp div.oe_mail_msg_content { - position: relative; - width: 486px; -} - -.openerp div.oe_mail_msg_content > li { - float: left; - margin-right: 3px; -} - .openerp div.oe_mail_thread_subthread div.oe_mail_msg_content { width: 440px; } @@ -196,14 +186,16 @@ margin: 0 0 4px 0; } -.openerp .oe_mail_msg_notification, -.openerp .oe_mail_msg_comment, +.openerp .oe_mail_msg_notification, +.openerp .oe_mail_msg_expandable, +.openerp .oe_mail_msg_comment, .openerp .oe_mail_msg_email { padding: 8px; background: white; border-top: 1px solid #ccc; } +.openerp div.oe_mail_thread_subthread .oe_mail_msg_expandable, .openerp div.oe_mail_thread_subthread .oe_mail_msg_comment { background: #eee; } @@ -216,8 +208,15 @@ clear: both; } -.openerp .oe_mail_msg_content { +.openerp div.oe_mail_msg_content { + float: right; + position: relative; + width: 486px; +} + +.openerp div.oe_mail_msg_content > li { float: left; + margin-right: 3px; } .openerp .oe_mail_msg_content:after { diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js index 3ab566d2e21..eb25084f530 100644 --- a/addons/mail/static/src/js/mail.js +++ b/addons/mail/static/src/js/mail.js @@ -32,27 +32,6 @@ openerp.mail = function(session) { }); - /** - * ------------------------------------------------------------ - * Sidebar - * ------------------------------------------------------------ - * - * Override of sidebar do_attachment_new method, to catch attachments added - * through the sidebar and show them in the Chatter composition form. - */ - - // session.web.Sidebar = session.web.Sidebar.extend({ - // do_attachment_new: function(attachment) { - // this._super(attachment); - // var message_ids = this.getParent().fields.message_ids || undefined; - // if (! message_ids) { return; } - // var compose_message_widget = message_ids.thread.compose_message_widget; - // if (! compose_message_widget) { return; } - // compose_message_widget.attachments.push(attachment); - // compose_message_widget.display_attachments(); - // }, - // }); - /** * ------------------------------------------------------------ * ChatterUtils @@ -308,7 +287,6 @@ openerp.mail = function(session) { show_dd_reply_by_email:options.show_dd_reply_by_email != undefined ? options.show_dd_reply_by_email: true, show_dd_delete: options.show_dd_delete || false, show_dd_hide: options.show_dd_hide || false, - show_more: options.show_more || false, truncate_limit: options.truncate_limit || 250, } // datasets and internal vars @@ -346,7 +324,7 @@ openerp.mail = function(session) { bind_events: function() { var self = this; // event: click on 'More' at bottom of thread - this.$el.on('click', 'button.oe_mail_button_more', this.do_message_fetch_more); + this.$el.on('click', 'a.oe_mail_fetch_more', this.do_message_fetch_more); // event: writing in basic textarea of composition form (quick reply) this.$el.find('textarea.oe_mail_compose_textarea').keyup(function (event) { var charCode = (event.which) ? event.which : window.event.keyCode; @@ -421,7 +399,6 @@ openerp.mail = function(session) { 'default_parent_id': this.context.default_parent_id, 'default_content_subtype': 'plain'} ); } - // return this._super(action, on_close); }, /** Instantiate the composition form, with every parameters in context @@ -459,14 +436,14 @@ openerp.mail = function(session) { message_fetch: function (initial_mode, additional_domain, additional_context) { var self = this; // domain and context: options + additional - fetch_domain = _.flatten([this.domain, additional_domain || []], true) - fetch_context = _.extend(this.context, additional_context || {}) + fetch_domain = _.flatten([this.domain, additional_domain || []], true); + fetch_context = _.extend({}, this.context, additional_context || {}); // initial mode: try to use message_data or message_ids if (initial_mode && this.options.message_data) { return this.message_display(this.options.message_data); } message_ids = initial_mode && this.options.message_ids != null && this.options.message_ids || false; - return this.ds_message.call('message_read', [message_ids, fetch_domain, this.options.thread_level, fetch_context] + return this.ds_message.call('message_read', [message_ids, fetch_domain, this.options.thread_level, fetch_context, this.context.default_parent_id || undefined] ).then(this.proxy('message_display')); }, @@ -476,13 +453,12 @@ openerp.mail = function(session) { */ message_display: function (records) { var self = this; - var _expendable = false; _(records).each(function (record) { if (record.type == 'expandable') { - _expendable = true; - self.update_fetch_more(true); self.fetch_more_domain = record.domain; self.fetch_more_context = record.context; + var rendered = session.web.qweb.render('mail.thread.message.expandable', {'record': record}); + $(rendered).appendTo(self.$el.children('div.oe_mail_thread_display:first')); } else { self.display_record(record); @@ -501,9 +477,6 @@ openerp.mail = function(session) { self.thread.appendTo(self.$el.find('div.oe_mail_thread_subthread:last')); } }); - if (! _expendable) { - this.update_fetch_more(false); - } }, /** Displays a record and performs some formatting on the record : @@ -558,15 +531,6 @@ openerp.mail = function(session) { vote_node.html(vote_element); }, - /** Display 'show more' button */ - update_fetch_more: function (new_value) { - if (new_value) { - this.$el.find('div.oe_mail_thread_more:last').show(); - } else { - this.$el.find('div.oe_mail_thread_more:last').hide(); - } - }, - display_user_avatar: function () { var avatar = mail.ChatterUtils.get_image(this.session, 'res.users', 'image_small', this.session.uid); return this.$el.find('img.oe_mail_icon').attr('src', avatar); @@ -581,45 +545,15 @@ openerp.mail = function(session) { } return this.ds_thread.call('message_post', [ [this.context.default_res_id], body, false, 'comment', this.context.default_parent_id, undefined] - ).then(self.message_fetch()); + ).pipe(self.message_clean()).pipe(self.message_fetch(false)); }, /** Action: 'shows more' to fetch new messages */ - do_message_fetch_more: function () { + do_message_fetch_more: function (event) { + event.stopPropagation(); + $(event.srcElement).parents('li').eq(0).remove(); return this.message_fetch(false, this.fetch_more_domain, this.fetch_more_context); }, - - // TDE: keep currently because need something similar - // /** - // * Create a domain to fetch new comments according to - // * comment already present in comments_structure - // * @param {Object} comments_structure (see chatter utils) - // * @returns {Array} fetch_domain (OpenERP domain style) - // */ - // get_fetch_domain: function (comments_structure) { - // var domain = []; - // var ids = comments_structure.root_ids.slice(); - // var ids2 = []; - // // must be child of current parent - // if (this.options.parent_id) { domain.push(['id', 'child_of', this.options.parent_id]); } - // _(comments_structure.root_ids).each(function (id) { // each record - // ids.push(id); - // ids2.push(id); - // }); - // if (this.options.parent_id != false) { - // ids2.push(this.options.parent_id); - // } - // // must not be children of already fetched messages - // if (ids.length > 0) { - // domain.push('&'); - // domain.push('!'); - // domain.push(['id', 'child_of', ids]); - // } - // if (ids2.length > 0) { - // domain.push(['id', 'not in', ids2]); - // } - // return domain; - // }, }); diff --git a/addons/mail/static/src/xml/mail.xml b/addons/mail/static/src/xml/mail.xml index e3586e723e4..cddccedbf6a 100644 --- a/addons/mail/static/src/xml/mail.xml +++ b/addons/mail/static/src/xml/mail.xml @@ -101,9 +101,9 @@
                    -
                    + @@ -161,6 +161,21 @@
                  • + +
                  • +
                    +
                    + + +
                    +
                  • + form tree,form + + + + + hr.evaluation.interview + form + tree,form + {'search_default_user_to_review_id': [active_id], 'default_user_to_review_id': active_id} + @@ -134,6 +143,9 @@ + +