X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=addons%2Fstock%2Fstock.py;h=e075c172b03ce001ee67a4d7b29fbb2867956215;hb=8c4a7cb37143285da0a1a25d0d5e720c45e4346a;hp=16565871de318ddd435d96fade5eea7262fce36d;hpb=5035c76f42bc2999c24e4943ee27f96ee426d47c;p=odoo%2Fodoo.git diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 1656587..e075c17 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -27,7 +27,7 @@ from itertools import groupby from openerp.osv import fields, osv, orm from openerp.tools.translate import _ -from openerp import netsvc +from openerp import workflow from openerp import tools from openerp.tools import float_compare, DEFAULT_SERVER_DATETIME_FORMAT import openerp.addons.decimal_precision as dp @@ -49,7 +49,6 @@ class stock_incoterms(osv.osv): 'active': True, } -stock_incoterms() class stock_journal(osv.osv): _name = "stock.journal" @@ -62,7 +61,6 @@ class stock_journal(osv.osv): 'user_id': lambda s, c, u, ctx: u } -stock_journal() #---------------------------------------------------------- # Stock Location @@ -161,6 +159,10 @@ class stock_location(osv.osv): \n* Production: Virtual counterpart location for production operations: this location consumes the raw material and produces finished products """, select = True), # temporarily removed, as it's unused: 'allocation_method': fields.selection([('fifo', 'FIFO'), ('lifo', 'LIFO'), ('nearest', 'Nearest')], 'Allocation Method', required=True), + + # as discussed on bug 765559, the main purpose of this field is to allow sorting the list of locations + # according to the displayed names, and reversing that sort by clicking on a column. It does not work for + # translated values though - so it needs fixing. 'complete_name': fields.function(_complete_name, type='char', size=256, string="Location Name", store={'stock.location': (_get_sublocations, ['name', 'location_id'], 10)}), @@ -487,7 +489,6 @@ class stock_location(osv.osv): continue return False -stock_location() class stock_tracking(osv.osv): @@ -553,7 +554,6 @@ class stock_tracking(osv.osv): """ return self.pool.get('action.traceability').action_traceability(cr,uid,ids,context) -stock_tracking() #---------------------------------------------------------- # Stock Picking @@ -631,7 +631,7 @@ class stock_picking(osv.osv): return res def create(self, cr, user, vals, context=None): - if ('name' not in vals) or (vals.get('name')=='/'): + if ('name' not in vals) or (vals.get('name')=='/') or (vals.get('name') == False): seq_obj_name = self._name vals['name'] = self.pool.get('ir.sequence').get(cr, user, seq_obj_name) new_id = super(stock_picking, self).create(cr, user, vals, context) @@ -768,10 +768,9 @@ class stock_picking(osv.osv): """ Changes state of picking to available if all moves are confirmed. @return: True """ - wf_service = netsvc.LocalService("workflow") for pick in self.browse(cr, uid, ids): if pick.state == 'draft': - wf_service.trg_validate(uid, 'stock.picking', pick.id, 'button_confirm', cr) + self.signal_button_confirm(cr, uid, [pick.id]) move_ids = [x.id for x in pick.move_lines if x.state == 'confirmed'] if not move_ids: raise osv.except_osv(_('Warning!'),_('Not enough stock, unable to reserve the products.')) @@ -782,46 +781,41 @@ class stock_picking(osv.osv): """ Changes state of picking to available if moves are confirmed or waiting. @return: True """ - wf_service = netsvc.LocalService("workflow") for pick in self.browse(cr, uid, ids): move_ids = [x.id for x in pick.move_lines if x.state in ['confirmed','waiting']] self.pool.get('stock.move').force_assign(cr, uid, move_ids) - wf_service.trg_write(uid, 'stock.picking', pick.id, cr) + workflow.trg_write(uid, 'stock.picking', pick.id, cr) return True def draft_force_assign(self, cr, uid, ids, *args): """ Confirms picking directly from draft state. @return: True """ - wf_service = netsvc.LocalService("workflow") for pick in self.browse(cr, uid, ids): if not pick.move_lines: raise osv.except_osv(_('Error!'),_('You cannot process picking without stock moves.')) - wf_service.trg_validate(uid, 'stock.picking', pick.id, - 'button_confirm', cr) + self.signal_button_confirm(cr, uid, [pick.id]) return True def draft_validate(self, cr, uid, ids, context=None): """ Validates picking directly from draft state. @return: True """ - wf_service = netsvc.LocalService("workflow") self.draft_force_assign(cr, uid, ids) for pick in self.browse(cr, uid, ids, context=context): move_ids = [x.id for x in pick.move_lines] self.pool.get('stock.move').force_assign(cr, uid, move_ids) - wf_service.trg_write(uid, 'stock.picking', pick.id, cr) + workflow.trg_write(uid, 'stock.picking', pick.id, cr) return self.action_process( cr, uid, ids, context=context) def cancel_assign(self, cr, uid, ids, *args): """ Cancels picking and moves. @return: True """ - wf_service = netsvc.LocalService("workflow") for pick in self.browse(cr, uid, ids): move_ids = [x.id for x in pick.move_lines] self.pool.get('stock.move').cancel_assign(cr, uid, move_ids) - wf_service.trg_write(uid, 'stock.picking', pick.id, cr) + workflow.trg_write(uid, 'stock.picking', pick.id, cr) return True def action_assign_wkf(self, cr, uid, ids, context=None): @@ -1237,7 +1231,6 @@ class stock_picking(osv.osv): currency_obj = self.pool.get('res.currency') uom_obj = self.pool.get('product.uom') sequence_obj = self.pool.get('ir.sequence') - wf_service = netsvc.LocalService("workflow") for pick in self.browse(cr, uid, ids, context=context): new_picking = None complete, too_many, too_few = [], [], [] @@ -1361,19 +1354,19 @@ class stock_picking(osv.osv): # At first we confirm the new picking (if necessary) if new_picking: - wf_service.trg_validate(uid, 'stock.picking', new_picking, 'button_confirm', cr) + self.signal_button_confirm(cr, uid, [new_picking]) # Then we finish the good picking self.write(cr, uid, [pick.id], {'backorder_id': new_picking}) self.action_move(cr, uid, [new_picking], context=context) - wf_service.trg_validate(uid, 'stock.picking', new_picking, 'button_done', cr) - wf_service.trg_write(uid, 'stock.picking', pick.id, cr) + self.signal_button_done(cr, uid, [new_picking]) + workflow.trg_write(uid, 'stock.picking', pick.id, cr) delivered_pack_id = new_picking self.message_post(cr, uid, new_picking, body=_("Back order %s has been created.") % (pick.name), context=context) elif empty_picking: delivered_pack_id = pick.id else: self.action_move(cr, uid, [pick.id], context=context) - wf_service.trg_validate(uid, 'stock.picking', pick.id, 'button_done', cr) + self.signal_button_done(cr, uid, [pick.id]) delivered_pack_id = pick.id delivered_pack = self.browse(cr, uid, delivered_pack_id, context=context) @@ -1512,7 +1505,6 @@ class stock_production_lot(osv.osv): default.update(date=time.strftime('%Y-%m-%d %H:%M:%S'), move_ids=[]) return super(stock_production_lot, self).copy(cr, uid, id, default=default, context=context) -stock_production_lot() class stock_production_lot_revision(osv.osv): _name = 'stock.production.lot.revision' @@ -1533,7 +1525,6 @@ class stock_production_lot_revision(osv.osv): 'date': fields.date.context_today, } -stock_production_lot_revision() # ---------------------------------------------------- # Move @@ -2071,7 +2062,6 @@ class stock_move(osv.osv): res_obj = self.pool.get('res.company') location_obj = self.pool.get('stock.location') move_obj = self.pool.get('stock.move') - wf_service = netsvc.LocalService("workflow") new_moves = [] if context is None: context = {} @@ -2115,7 +2105,7 @@ class stock_move(osv.osv): }) new_moves.append(self.browse(cr, uid, [new_id])[0]) if pickid: - wf_service.trg_validate(uid, 'stock.picking', pickid, 'button_confirm', cr) + self.pool.get('stock.picking').signal_button_confirm(cr, uid, [pickid]) if new_moves: new_moves += self.create_chained_picking(cr, uid, new_moves, context) return new_moves @@ -2145,10 +2135,9 @@ 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) + workflow.trg_write(uid, 'stock.picking', move.picking_id.id, cr) return True def cancel_assign(self, cr, uid, ids, context=None): @@ -2160,10 +2149,9 @@ class stock_move(osv.osv): # fix for bug lp:707031 # called write of related picking because changing move availability does # not trigger workflow of picking in order to change the state of picking - 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) + workflow.trg_write(uid, 'stock.picking', move.picking_id.id, cr) return True # @@ -2210,8 +2198,7 @@ class stock_move(osv.osv): if count: for pick_id in pickings: - wf_service = netsvc.LocalService("workflow") - wf_service.trg_write(uid, 'stock.picking', pick_id, cr) + workflow.trg_write(uid, 'stock.picking', pick_id, cr) return count def setlast_tracking(self, cr, uid, ids, context=None): @@ -2254,17 +2241,15 @@ class stock_move(osv.osv): if move.move_dest_id and move.move_dest_id.state == 'waiting': self.write(cr, uid, [move.move_dest_id.id], {'state': 'confirmed'}, context=context) if context.get('call_unlink',False) and move.move_dest_id.picking_id: - wf_service = netsvc.LocalService("workflow") - wf_service.trg_write(uid, 'stock.picking', move.move_dest_id.picking_id.id, cr) + workflow.trg_write(uid, 'stock.picking', move.move_dest_id.picking_id.id, cr) self.write(cr, uid, ids, {'state': 'cancel', 'move_dest_id': False}, context=context) if not context.get('call_unlink',False): for pick in self.pool.get('stock.picking').browse(cr, uid, list(pickings), context=context): if all(move.state == 'cancel' for move in pick.move_lines): self.pool.get('stock.picking').write(cr, uid, [pick.id], {'state': 'cancel'}, context=context) - wf_service = netsvc.LocalService("workflow") for id in ids: - wf_service.trg_trigger(uid, 'stock.move', id, cr) + workflow.trg_trigger(uid, 'stock.move', id, cr) return True def _get_accounting_data_for_valuation(self, cr, uid, move, context=None): @@ -2394,7 +2379,6 @@ class stock_move(osv.osv): """ picking_ids = [] move_ids = [] - wf_service = netsvc.LocalService("workflow") if context is None: context = {} @@ -2422,7 +2406,7 @@ class stock_move(osv.osv): if move.move_dest_id.state in ('waiting', 'confirmed'): self.force_assign(cr, uid, [move.move_dest_id.id], context=context) if move.move_dest_id.picking_id: - wf_service.trg_write(uid, 'stock.picking', move.move_dest_id.picking_id.id, cr) + workflow.trg_write(uid, 'stock.picking', move.move_dest_id.picking_id.id, cr) if move.move_dest_id.auto_validate: self.action_done(cr, uid, [move.move_dest_id.id], context=context) @@ -2435,10 +2419,10 @@ class stock_move(osv.osv): self.write(cr, uid, move_ids, {'state': 'done', 'date': time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)}, context=context) for id in move_ids: - wf_service.trg_trigger(uid, 'stock.move', id, cr) + workflow.trg_trigger(uid, 'stock.move', id, cr) for pick_id in picking_ids: - wf_service.trg_write(uid, 'stock.picking', pick_id, cr) + workflow.trg_write(uid, 'stock.picking', pick_id, cr) return True @@ -2691,7 +2675,6 @@ class stock_move(osv.osv): product_obj = self.pool.get('product.product') currency_obj = self.pool.get('res.currency') uom_obj = self.pool.get('product.uom') - wf_service = netsvc.LocalService("workflow") if context is None: context = {} @@ -2792,11 +2775,10 @@ class stock_move(osv.osv): res = cr.fetchall() if len(res) == len(move.picking_id.move_lines): picking_obj.action_move(cr, uid, [move.picking_id.id]) - wf_service.trg_validate(uid, 'stock.picking', move.picking_id.id, 'button_done', cr) + picking_obj.signal_button_done(cr, uid, [move.picking_id.id]) return [move.id for move in complete] -stock_move() class stock_inventory(osv.osv): _name = "stock.inventory" @@ -2919,7 +2901,6 @@ class stock_inventory(osv.osv): self.write(cr, uid, [inv.id], {'state': 'cancel'}, context=context) return True -stock_inventory() class stock_inventory_line(osv.osv): _name = "stock.inventory.line" @@ -2964,7 +2945,6 @@ class stock_inventory_line(osv.osv): result = {'product_qty': amount, 'product_uom': uom, 'prod_lot_id': False} return {'value': result} -stock_inventory_line() #---------------------------------------------------------- # Stock Warehouse @@ -3008,7 +2988,6 @@ class stock_warehouse(osv.osv): 'lot_output_id': _default_lot_output_id, } -stock_warehouse() #---------------------------------------------------------- # "Empty" Classes that are used to vary from the original stock.picking (that are dedicated to the internal pickings) @@ -3037,15 +3016,25 @@ class stock_picking_in(osv.osv): #override in order to redirect the check of acces rules on the stock.picking object return self.pool.get('stock.picking').check_access_rule(cr, uid, ids, operation, context=context) - def _workflow_trigger(self, cr, uid, ids, trigger, context=None): - #override in order to trigger the workflow of stock.picking at the end of create, write and unlink operation - #instead of it's own workflow (which is not existing) - return self.pool.get('stock.picking')._workflow_trigger(cr, uid, ids, trigger, context=context) + def create_workflow(self, cr, uid, ids, context=None): + # overridden in order to trigger the workflow of stock.picking at the end of create, + # write and unlink operation instead of its own workflow (which is not existing) + return self.pool.get('stock.picking').create_workflow(cr, uid, ids, context=context) + + def delete_workflow(self, cr, uid, ids, context=None): + # overridden in order to trigger the workflow of stock.picking at the end of create, + # write and unlink operation instead of its own workflow (which is not existing) + return self.pool.get('stock.picking').delete_workflow(cr, uid, ids, context=context) - def _workflow_signal(self, cr, uid, ids, signal, context=None): - #override in order to fire the workflow signal on given stock.picking workflow instance - #instead of it's own workflow (which is not existing) - return self.pool.get('stock.picking')._workflow_signal(cr, uid, ids, signal, context=context) + def step_workflow(self, cr, uid, ids, context=None): + # overridden in order to trigger the workflow of stock.picking at the end of create, + # write and unlink operation instead of its own workflow (which is not existing) + return self.pool.get('stock.picking').step_workflow(cr, uid, ids, context=context) + + def signal_workflow(self, cr, uid, ids, signal, context=None): + # overridden in order to fire the workflow signal on given stock.picking workflow instance + # instead of its own workflow (which is not existing) + return self.pool.get('stock.picking').signal_workflow(cr, uid, ids, signal, context=context) def message_post(self, *args, **kwargs): """Post the message on stock.picking to be able to see it in the form view when using the chatter""" @@ -3110,15 +3099,25 @@ class stock_picking_out(osv.osv): #override in order to redirect the check of acces rules on the stock.picking object return self.pool.get('stock.picking').check_access_rule(cr, uid, ids, operation, context=context) - def _workflow_trigger(self, cr, uid, ids, trigger, context=None): - #override in order to trigger the workflow of stock.picking at the end of create, write and unlink operation - #instead of it's own workflow (which is not existing) - return self.pool.get('stock.picking')._workflow_trigger(cr, uid, ids, trigger, context=context) - - def _workflow_signal(self, cr, uid, ids, signal, context=None): - #override in order to fire the workflow signal on given stock.picking workflow instance - #instead of it's own workflow (which is not existing) - return self.pool.get('stock.picking')._workflow_signal(cr, uid, ids, signal, context=context) + def create_workflow(self, cr, uid, ids, context=None): + # overridden in order to trigger the workflow of stock.picking at the end of create, + # write and unlink operation instead of its own workflow (which is not existing) + return self.pool.get('stock.picking').create_workflow(cr, uid, ids, context=context) + + def delete_workflow(self, cr, uid, ids, context=None): + # overridden in order to trigger the workflow of stock.picking at the end of create, + # write and unlink operation instead of its own workflow (which is not existing) + return self.pool.get('stock.picking').delete_workflow(cr, uid, ids, context=context) + + def step_workflow(self, cr, uid, ids, context=None): + # overridden in order to trigger the workflow of stock.picking at the end of create, + # write and unlink operation instead of its own workflow (which is not existing) + return self.pool.get('stock.picking').step_workflow(cr, uid, ids, context=context) + + def signal_workflow(self, cr, uid, ids, signal, context=None): + # overridden in order to fire the workflow signal on given stock.picking workflow instance + # instead of its own workflow (which is not existing) + return self.pool.get('stock.picking').signal_workflow(cr, uid, ids, signal, context=context) def message_post(self, *args, **kwargs): """Post the message on stock.picking to be able to see it in the form view when using the chatter"""