[IMP] code review of csn branch about packs
bzr revid: qdp-launchpad@openerp.com-20130802080007-tw5ymuva623qxvhc
This commit is contained in:
commit
992d1bf816
|
@ -1739,13 +1739,9 @@ class stock_package(osv.osv):
|
|||
parent = m.parent_id
|
||||
while parent:
|
||||
res[m.id] = parent.name + ' / ' + res[m.id]
|
||||
parent = parent.location_id
|
||||
parent = parent.parent_id
|
||||
return res
|
||||
|
||||
def _get_subpackages(self, cr, uid, ids, context=None):
|
||||
""" return all sublocations of the given stock locations (included) """
|
||||
return self.search(cr, uid, [('id', 'child_of', ids)], context=context)
|
||||
|
||||
def _get_packages(self, cr, uid, ids, context=None):
|
||||
"""Returns packages from quants for store"""
|
||||
res = set()
|
||||
|
@ -1754,17 +1750,36 @@ class stock_package(osv.osv):
|
|||
res.add(quant.package_id.id)
|
||||
return list(res)
|
||||
|
||||
def _get_packages_to_relocate(self, cr, uid, ids, context=None):
|
||||
res = set()
|
||||
for pack in self.browse(cr, uid, ids, context=context):
|
||||
res.add(pack.id)
|
||||
if pack.parent_id:
|
||||
res.add(pack.parent_id.id)
|
||||
return list(res)
|
||||
|
||||
def _get_package_location(self, cr, uid, ids, name, args, context=None):
|
||||
res = {}.fromkeys(ids, False)
|
||||
for pack in self.browse(cr, uid, ids, context=context):
|
||||
if pack.quant_ids:
|
||||
res[pack.id] = pack.quant_ids[0].location_id.id
|
||||
elif pack.children_ids:
|
||||
res[pack.id] = pack.children_ids[0].location_id.id
|
||||
return res
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Package Reference', size=64, select=True),
|
||||
'complete_name': fields.function(_complete_name, type='char', string="Package Name",
|
||||
store={'stock.quant.package': (_get_subpackages, ['name', 'parent_id'], 10)}),
|
||||
'complete_name': fields.function(_complete_name, type='char', string="Package Name",),
|
||||
'parent_left': fields.integer('Left Parent', select=1),
|
||||
'parent_right': fields.integer('Right Parent', select=1),
|
||||
'packaging_id': fields.many2one('product.packaging', 'Type of Packaging'),
|
||||
'location_id': fields.related('quant_ids', 'location_id', type='many2one', relation='stock.location', string='Location',
|
||||
store={'stock.quant': (_get_packages, ['location_id'], 10)}, readonly=True),
|
||||
'location_id': fields.function(_get_package_location, type='many2one', relation='stock.location', string='Location',
|
||||
store={
|
||||
'stock.quant': (_get_packages, ['location_id'], 10),
|
||||
'stock.quant.package': (_get_packages_to_relocate, ['children_ids', 'quant_ids', 'parent_id'], 10),
|
||||
}, readonly=True),
|
||||
'quant_ids': fields.one2many('stock.quant', 'package_id', 'Bulk Content'),
|
||||
'parent_id': fields.many2one('stock.quant.package', 'Container Package', help="The package containing this item"),
|
||||
'parent_id': fields.many2one('stock.quant.package', 'Parent Package', help="The package containing this item"),
|
||||
'children_ids': fields.one2many('stock.quant.package', 'parent_id', 'Contained Packages'),
|
||||
}
|
||||
_defaults = {
|
||||
|
@ -1772,12 +1787,20 @@ class stock_package(osv.osv):
|
|||
}
|
||||
def _check_location(self, cr, uid, ids, context=None):
|
||||
'''checks that all quants in a package are stored in the same location'''
|
||||
quant_obj = self.pool.get('stock.quant')
|
||||
for pack in self.browse(cr, uid, ids, context=context):
|
||||
if not all([quant.location_id.id == pack.quant_ids[0].location_id.id for quant in pack.quant_ids]):
|
||||
parent = pack
|
||||
while parent.parent_id:
|
||||
parent = parent.parent_id
|
||||
quant_ids = self.get_content(cr, uid, [parent.id], context=context)
|
||||
quants = quant_obj.browse(cr, uid, quant_ids, context=context)
|
||||
location_id = quants and quants[0].location_id.id or False
|
||||
if not all([quant.location_id.id == location_id for quant in quants]):
|
||||
return False
|
||||
return True
|
||||
|
||||
_constraints = [
|
||||
(_check_location, 'All quants inside a package should be in the same location', ['location_id']),
|
||||
(_check_location, 'Everything inside a package should be in the same location', ['location_id']),
|
||||
]
|
||||
|
||||
def action_print(self, cr, uid, ids, context=None):
|
||||
|
@ -1794,19 +1817,31 @@ class stock_package(osv.osv):
|
|||
'datas': datas
|
||||
}
|
||||
|
||||
def quants_get(self, cr, uid, package, context=None):
|
||||
''' find all the quants in the given package (browse record) recursively'''
|
||||
res = []
|
||||
for child in package.children_ids:
|
||||
res += self.quants_get(cr, uid, child, context=context)
|
||||
res += package.quant_ids
|
||||
def unpack(self, cr, uid, ids, context=None):
|
||||
quant_obj = self.pool.get('stock.quant')
|
||||
for package in self.browse(cr, uid, ids, context=context):
|
||||
quant_ids = [quant.id for quant in package.quant_ids]
|
||||
quant_obj.write(cr, uid, quant_ids, {'package_id': package.parent_id.id or False}, context=context)
|
||||
children_package_ids = [child_package.id for child_package in package.children_ids]
|
||||
self.write(cr, uid, children_package_ids, {'parent_id': package.parent_id.id or False}, context=context)
|
||||
#delete current package since it contains nothing anymore
|
||||
self.unlink(cr, uid, ids, context=context)
|
||||
return self.pool.get('ir.actions.act_window').for_xml_id(cr, uid, 'stock', 'action_package_view', context=context)
|
||||
|
||||
def get_content(self, cr, uid, ids, context=None):
|
||||
child_package_ids = self.search(cr, uid, [('id', 'child_of', ids)], context=context)
|
||||
return self.pool.get('stock.quant').search(cr, uid, [('package_id', 'in', child_package_ids)], context=context)
|
||||
|
||||
def get_content_package(self, cr, uid, ids, context=None):
|
||||
quants_ids = self.get_content(cr, uid, ids, context=context)
|
||||
res = self.pool.get('ir.actions.act_window').for_xml_id(cr, uid, 'stock', 'quantsact', context=context)
|
||||
res['domain'] = [('id', 'in', quants_ids)]
|
||||
return res
|
||||
|
||||
def _get_product_total_qty(self, cr, uid, package_record, product_id, context=None):
|
||||
''' find the total of given product 'product_id' inside the given package 'package_id'''
|
||||
quant_obj = self.pool.get('stock.quant')
|
||||
included_package_ids = self.search(cr, uid, [('parent_id', 'child_of', [package_record.id])], context=context)
|
||||
all_quant_ids = quant_obj.search(cr, uid, [('package_id', 'in', included_package_ids)], context=context)
|
||||
all_quant_ids = self.get_content(cr, uid, [package_record.id], context=context)
|
||||
total = 0
|
||||
for quant in quant_obj.browse(cr, uid, all_quant_ids, context=context):
|
||||
if quant.product_id.id == product_id:
|
||||
|
|
|
@ -1668,13 +1668,54 @@
|
|||
<field name="model">stock.quant.package</field>
|
||||
<field eval="10" name="priority"/>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Package">
|
||||
<field name="complete_name"/>
|
||||
<field name="name"/>
|
||||
<field name="packaging_id"/>
|
||||
<field name="location_id"/>
|
||||
<field name="quant_ids"/>
|
||||
<field name="children_ids"/>
|
||||
<form string="Package" version="7.0">
|
||||
<sheet>
|
||||
<div class="oe_right oe_button_box">
|
||||
<button name="unpack" string="Unpack" type="object"/>
|
||||
</div>
|
||||
<div class="oe_title">
|
||||
<h1>
|
||||
<label string="Package Reference" class="oe_edit_only"/>
|
||||
<field name="name" class="oe_inline"/>
|
||||
</h1>
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="packaging_id"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="location_id"/>
|
||||
<field name="parent_id"/>
|
||||
</group>
|
||||
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Content">
|
||||
<separator string="Bulk Content" />
|
||||
<field name="quant_ids">
|
||||
<tree string="Quants">
|
||||
<field name="product_id"/>
|
||||
<field name="qty"/>
|
||||
<field name="location_id"/>
|
||||
<field name="in_date"/>
|
||||
</tree>
|
||||
</field>
|
||||
|
||||
<div class="oe_right oe_button_box" style="margin-top: 10px">
|
||||
<button name="get_content_package" type="object" string="View Contained Packages content" icon="gtk-execute" attrs="{'invisible': [('children_ids','=',[])]}"/>
|
||||
</div>
|
||||
<separator string="Contained Packages"/>
|
||||
<field name="children_ids">
|
||||
<tree string="Contained Packages">
|
||||
<field name="complete_name"/>
|
||||
<field name="packaging_id"/>
|
||||
<field name="location_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
|
Loading…
Reference in New Issue