From a69a679ff9a8800f3ddf45dc92b3993ea3c7610f Mon Sep 17 00:00:00 2001 From: mso Date: Tue, 13 Apr 2010 16:05:39 +0530 Subject: [PATCH] [FIX] sale, auction: small changes regarding contexts in sale & bug in auction bzr revid: mso@mso-20100413103539-f73if06mhbqyanvv --- addons/auction/auction.py | 7 +- addons/sale/sale.py | 152 ++++++++++++++++++++++++++------------ 2 files changed, 110 insertions(+), 49 deletions(-) diff --git a/addons/auction/auction.py b/addons/auction/auction.py index cf5f27775df..62bf4bcbda9 100644 --- a/addons/auction/auction.py +++ b/addons/auction/auction.py @@ -481,10 +481,11 @@ class auction_lots(osv.osv): return result def name_search(self, cr, user, name, args=None, operator='ilike', context={}): - if not args: + if args is None: args = [] - - ids = self.search(cr, user, [('obj_num','=',int(name))] + args) + ids = [] + if name: + ids = self.search(cr, user, [('obj_num','=',int(name))] + args) if not ids: ids = self.search(cr, user, [('name',operator,name)] + args) return self.name_get(cr, user, ids) diff --git a/addons/sale/sale.py b/addons/sale/sale.py index 8b77719171a..60c3ed60dc4 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -43,7 +43,9 @@ class sale_shop(osv.osv): sale_shop() -def _incoterm_get(self, cr, uid, context={}): +def _incoterm_get(self, cr, uid, context=None): + if context is None: + context = {} cr.execute('select code, code||\', \'||name from stock_incoterms where active') return cr.fetchall() @@ -52,7 +54,9 @@ class sale_order(osv.osv): _name = "sale.order" _description = "Sale Order" - def copy(self, cr, uid, id, default=None, context={}): + def copy(self, cr, uid, id, default=None, context=None): + if context is None: + context = {} if not default: default = {} default.update({ @@ -62,18 +66,22 @@ class sale_order(osv.osv): 'picking_ids': [], 'name': self.pool.get('ir.sequence').get(cr, uid, 'sale.order'), }) - return super(sale_order, self).copy(cr, uid, id, default, context) + return super(sale_order, self).copy(cr, uid, id, default, context=context) - def _amount_line_tax(self, cr, uid, line, context={}): + def _amount_line_tax(self, cr, uid, line, context=None): + if context is None: + context = {} val = 0.0 for c in self.pool.get('account.tax').compute(cr, uid, line.tax_id, line.price_unit * (1-(line.discount or 0.0)/100.0), line.product_uom_qty, line.order_id.partner_invoice_id.id, line.product_id, line.order_id.partner_id): val += c['amount'] return val - def _amount_all(self, cr, uid, ids, field_name, arg, context): + def _amount_all(self, cr, uid, ids, field_name, arg, context=None): + if context is None: + context = {} res = {} cur_obj = self.pool.get('res.currency') - for order in self.browse(cr, uid, ids): + for order in self.browse(cr, uid, ids, context): res[order.id] = { 'amount_untaxed': 0.0, 'amount_tax': 0.0, @@ -83,13 +91,15 @@ class sale_order(osv.osv): cur = order.pricelist_id.currency_id for line in order.order_line: val1 += line.price_subtotal - val += self._amount_line_tax(cr, uid, line, context) + val += self._amount_line_tax(cr, uid, line, context=context) res[order.id]['amount_tax'] = cur_obj.round(cr, uid, cur, val) res[order.id]['amount_untaxed'] = cur_obj.round(cr, uid, cur, val1) res[order.id]['amount_total'] = res[order.id]['amount_untaxed'] + res[order.id]['amount_tax'] return res def _picked_rate(self, cr, uid, ids, name, arg, context=None): + if context is None: + context = {} if not ids: return {} res = {} @@ -116,12 +126,14 @@ class sale_order(osv.osv): res[r] = 0.0 else: res[r] = 100.0 * res[r][0] / res[r][1] - for order in self.browse(cr, uid, ids, context): + for order in self.browse(cr, uid, ids, context=context): if order.shipped: res[order.id] = 100.0 return res def _invoiced_rate(self, cursor, user, ids, name, arg, context=None): + if context is None: + context = {} res = {} for sale in self.browse(cursor, user, ids, context=context): if sale.invoiced: @@ -139,6 +151,8 @@ class sale_order(osv.osv): return res def _invoiced(self, cursor, user, ids, name, arg, context=None): + if context is None: + context = {} res = {} for sale in self.browse(cursor, user, ids, context=context): res[sale.id] = True @@ -150,7 +164,9 @@ class sale_order(osv.osv): res[sale.id] = False return res - def _invoiced_search(self, cursor, user, obj, name, args, context): + def _invoiced_search(self, cursor, user, obj, name, args, context=None): + if context is None: + context = {} if not len(args): return [] clause = '' @@ -177,7 +193,9 @@ class sale_order(osv.osv): return [('id', '=', 0)] return [('id', 'in', [x[0] for x in res])] - def _get_order(self, cr, uid, ids, context={}): + def _get_order(self, cr, uid, ids, context=None): + if context is None: + context = {} result = {} for line in self.pool.get('sale.order.line').browse(cr, uid, ids, context=context): result[line.order_id.id] = True @@ -277,7 +295,9 @@ class sale_order(osv.osv): # Form filling def unlink(self, cr, uid, ids, context=None): - sale_orders = self.read(cr, uid, ids, ['state']) + if context is None: + context = {} + sale_orders = self.read(cr, uid, ids, ['state'], context=context) unlink_ids = [] for s in sale_orders: if s['state'] in ['draft', 'cancel']: @@ -336,7 +356,9 @@ class sale_order(osv.osv): return {'value': val} - def shipping_policy_change(self, cr, uid, ids, policy, context={}): + def shipping_policy_change(self, cr, uid, ids, policy, context=None): + if context is None: + context = {} if not policy: return {} inv_qty = 'order' @@ -347,6 +369,8 @@ class sale_order(osv.osv): return {'value': {'invoice_quantity': inv_qty}} def write(self, cr, uid, ids, vals, context=None): + if context is None: + context = {} if 'order_policy' in vals: if vals['order_policy'] == 'prepaid': vals.update({'invoice_quantity': 'order'}) @@ -354,7 +378,9 @@ class sale_order(osv.osv): vals.update({'invoice_quantity': 'procurement'}) return super(sale_order, self).write(cr, uid, ids, vals, context=context) - def create(self, cr, uid, vals, context={}): + def create(self, cr, uid, vals, context=None): + if context is None: + context = {} if 'order_policy' in vals: if vals['order_policy'] == 'prepaid': vals.update({'invoice_quantity': 'order'}) @@ -362,17 +388,23 @@ class sale_order(osv.osv): vals.update({'invoice_quantity': 'procurement'}) return super(sale_order, self).create(cr, uid, vals, context=context) - def button_dummy(self, cr, uid, ids, context={}): + def button_dummy(self, cr, uid, ids, context=None): + if context is None: + context = {} return True #FIXME: the method should return the list of invoices created (invoice_ids) # and not the id of the last invoice created (res). The problem is that we # cannot change it directly since the method is called by the sale order # workflow and I suppose it expects a single id... - def _inv_get(self, cr, uid, order, context={}): + def _inv_get(self, cr, uid, order, context=None): + if context is None: + context = {} return {} - def _make_invoice(self, cr, uid, order, lines, context={}): + def _make_invoice(self, cr, uid, order, lines, context=None): + if context is None: + context = {} a = order.partner_id.property_account_receivable.id if order.payment_term: pay_term = order.payment_term.id @@ -408,7 +440,7 @@ class sale_order(osv.osv): } inv_obj = self.pool.get('account.invoice') inv.update(self._inv_get(cr, uid, order)) - inv_id = inv_obj.create(cr, uid, inv, context) + inv_id = inv_obj.create(cr, uid, inv, context=context) data = inv_obj.onchange_payment_term_date_invoice(cr, uid, [inv_id], pay_term, time.strftime('%Y-%m-%d')) if data.get('value', False): inv_obj.write(cr, uid, [inv_id], data['value'], context=context) @@ -458,8 +490,10 @@ class sale_order(osv.osv): cr.execute('insert into sale_order_invoice_rel (order_id,invoice_id) values (%s,%s)', (order.id, res)) return res - def action_invoice_cancel(self, cr, uid, ids, context={}): - for sale in self.browse(cr, uid, ids): + def action_invoice_cancel(self, cr, uid, ids, context=None): + if context is None: + context = {} + for sale in self.browse(cr, uid, ids, context=context): for line in sale.order_line: invoiced = False for iline in line.invoice_lines: @@ -471,8 +505,10 @@ class sale_order(osv.osv): self.write(cr, uid, ids, {'state': 'invoice_except', 'invoice_ids': False}) return True - def action_invoice_end(self, cr, uid, ids, context={}): - for order in self.browse(cr, uid, ids): + def action_invoice_end(self, cr, uid, ids, context=None): + if context is None: + context = {} + for order in self.browse(cr, uid, ids, context=context): val = {'invoiced': True} if order.state == 'invoice_except': val['state'] = 'progress' @@ -487,10 +523,12 @@ class sale_order(osv.osv): return True - def action_cancel(self, cr, uid, ids, context={}): + def action_cancel(self, cr, uid, ids, context=None): + if context is None: + context = {} ok = True sale_order_line_obj = self.pool.get('sale.order.line') - for sale in self.browse(cr, uid, ids): + for sale in self.browse(cr, uid, ids, context=context): for pick in sale.picking_ids: if pick.state not in ('draft', 'cancel'): raise osv.except_osv( @@ -687,8 +725,10 @@ class sale_order(osv.osv): return True - def action_ship_end(self, cr, uid, ids, context={}): - for order in self.browse(cr, uid, ids): + def action_ship_end(self, cr, uid, ids, context=None): + if context is None: + context = {} + for order in self.browse(cr, uid, ids, context=context): val = {'shipped': True} if order.state == 'shipping_except': val['state'] = 'progress' @@ -742,24 +782,30 @@ sale_order() # - update it on change product and unit price # - use it in report if there is a uos class sale_order_line(osv.osv): - def _amount_line_net(self, cr, uid, ids, field_name, arg, context): + def _amount_line_net(self, cr, uid, ids, field_name, arg, context=None): + if context is None: + context = {} res = {} - for line in self.browse(cr, uid, ids): + for line in self.browse(cr, uid, ids, context=context): res[line.id] = line.price_unit * (1 - (line.discount or 0.0) / 100.0) return res - def _amount_line(self, cr, uid, ids, field_name, arg, context): + def _amount_line(self, cr, uid, ids, field_name, arg, context=None): + if context is None: + context = {} res = {} cur_obj = self.pool.get('res.currency') - for line in self.browse(cr, uid, ids): + for line in self.browse(cr, uid, ids, context=context): res[line.id] = line.price_unit * line.product_uom_qty * (1 - (line.discount or 0.0) / 100.0) cur = line.order_id.pricelist_id.currency_id res[line.id] = cur_obj.round(cr, uid, cur, res[line.id]) return res - def _number_packages(self, cr, uid, ids, field_name, arg, context): + def _number_packages(self, cr, uid, ids, field_name, arg, context=None): + if context is None: + context = {} res = {} - for line in self.browse(cr, uid, ids): + for line in self.browse(cr, uid, ids, context=context): try: res[line.id] = int(line.product_uom_qty / line.product_packaging.qty) except: @@ -817,7 +863,9 @@ class sale_order_line(osv.osv): 'product_packaging': lambda *a: False } - def invoice_line_create(self, cr, uid, ids, context={}): + def invoice_line_create(self, cr, uid, ids, context=None): + if context is None: + context = {} def _get_line_qty(line): if (line.order_id.invoice_quantity=='order') or not line.procurement_id: if line.product_uos: @@ -825,7 +873,7 @@ class sale_order_line(osv.osv): return line.product_uom_qty else: return self.pool.get('mrp.procurement').quantity_get(cr, uid, - line.procurement_id.id, context) + line.procurement_id.id, context=context) def _get_line_uom(line): if (line.order_id.invoice_quantity=='order') or not line.procurement_id: @@ -834,11 +882,11 @@ class sale_order_line(osv.osv): return line.product_uom.id else: return self.pool.get('mrp.procurement').uom_get(cr, uid, - line.procurement_id.id, context) + line.procurement_id.id, context=context) create_ids = [] sales = {} - for line in self.browse(cr, uid, ids, context): + for line in self.browse(cr, uid, ids, context=context): if not line.invoiced: if line.product_id: a = line.product_id.product_tmpl_id.property_account_income.id @@ -889,19 +937,25 @@ class sale_order_line(osv.osv): wf_service.trg_write(uid, 'sale.order', sid, cr) return create_ids - def button_cancel(self, cr, uid, ids, context={}): + def button_cancel(self, cr, uid, ids, context=None): + if context is None: + context = {} for line in self.browse(cr, uid, ids, context=context): if line.invoiced: raise osv.except_osv(_('Invalid action !'), _('You cannot cancel a sale order line that has already been invoiced !')) return self.write(cr, uid, ids, {'state': 'cancel'}) - def button_confirm(self, cr, uid, ids, context={}): + def button_confirm(self, cr, uid, ids, context=None): + if context is None: + context = {} return self.write(cr, uid, ids, {'state': 'confirmed'}) - def button_done(self, cr, uid, ids, context={}): + def button_done(self, cr, uid, ids, context=None): + if context is None: + context = {} wf_service = netsvc.LocalService("workflow") res = self.write(cr, uid, ids, {'state': 'done'}) - for line in self.browse(cr, uid, ids, context): + for line in self.browse(cr, uid, ids, context=context): wf_service.trg_write(uid, 'sale.order', line.order_id.id, cr) return res @@ -926,11 +980,13 @@ class sale_order_line(osv.osv): pass return {'value': value} - def copy_data(self, cr, uid, id, default=None, context={}): + def copy_data(self, cr, uid, id, default=None, context=None): + if context is None: + context = {} if not default: default = {} default.update({'state': 'draft', 'move_ids': [], 'invoiced': False, 'invoice_lines': []}) - return super(sale_order_line, self).copy_data(cr, uid, id, default, context) + return super(sale_order_line, self).copy_data(cr, uid, id, default, context=context) def product_id_change(self, cr, uid, ids, pricelist, product, qty=0, uom=False, qty_uos=0, uos=False, name='', partner_id=False, @@ -961,7 +1017,7 @@ class sale_order_line(osv.osv): if packaging: default_uom = product_obj.uom_id and product_obj.uom_id.id - pack = self.pool.get('product.packaging').browse(cr, uid, packaging, context) + pack = self.pool.get('product.packaging').browse(cr, uid, packaging, context=context) q = product_uom_obj._compute_qty(cr, uid, uom, pack.qty, default_uom) # qty = qty - qty % q + q if qty and (q and not (qty % q) == 0): @@ -1070,7 +1126,9 @@ class sale_order_line(osv.osv): res['value']['price_unit'] = 0.0 return res - def unlink(self, cr, uid, ids, context={}): + def unlink(self, cr, uid, ids, context=None): + if context is None: + context = {} """Allows to delete sale order lines in draft,cancel states""" for rec in self.browse(cr, uid, ids, context=context): if rec.state not in ['draft', 'cancel']: @@ -1110,6 +1168,8 @@ class sale_config_picking_policy(osv.osv_memory): } def execute(self, cr, uid, ids, context=None): + if context is None: + context = {} for o in self.browse(cr, uid, ids, context=context): ir_values_obj = self.pool.get('ir.values') ir_values_obj.set(cr, uid, 'default', False, 'picking_policy', ['sale.order'], o.picking_policy) @@ -1118,13 +1178,13 @@ class sale_config_picking_policy(osv.osv_memory): if o.step == 'one': md = self.pool.get('ir.model.data') group_id = md._get_id(cr, uid, 'base', 'group_no_one') - group_id = md.browse(cr, uid, group_id, context).res_id + group_id = md.browse(cr, uid, group_id, context=context).res_id menu_id = md._get_id(cr, uid, 'stock', 'menu_action_picking_tree_delivery') - menu_id = md.browse(cr, uid, menu_id, context).res_id + menu_id = md.browse(cr, uid, menu_id, context=context).res_id self.pool.get('ir.ui.menu').write(cr, uid, [menu_id], {'groups_id': [(6, 0, [group_id])]}) location_id = md._get_id(cr, uid, 'stock', 'stock_location_output') - location_id = md.browse(cr, uid, location_id, context).res_id + location_id = md.browse(cr, uid, location_id, context=context).res_id self.pool.get('stock.location').write(cr, uid, [location_id], {'chained_auto_packing': 'transparent'}) sale_config_picking_policy()