openerp学习笔记 计算字段支持搜索

时间:2023-02-18 16:44:26

示例1:

# -*- encoding: utf-8 -*-
import pooler
import logging
import
netsvc
import tools
logger = netsvc.Logger()
import datetime
import
time
import math
from osv import fields,osv
from
openerp.tools.translate import _  #用于翻译代码中的静态字符串

class res_users(osv.osv):
    _name =
"res.users"
    _inherit = 'res.users'
   

    _columns={
       
'location_ids': fields.many2many('stock.location', id1='user_id',
id2='location_id', string=u'允许的库位'),     

    }
   
res_users()

class stock_picking(osv.osv):
    _name =
"stock.picking"
    _inherit = 'stock.picking'

    def _get_location_ids(self, cr, uid, ids, name,
arg, context=None):
        res =
{}
        for pick in self.browse(cr,
uid, ids):
           
location_ids =
set()
            for
move in
pick.move_lines:
               
location_ids.add(move.location_id.id)
           
res[pick.id] = list(location_ids)
       
return res

    def _location_ids_search(self, cr, uid, obj, name,
args, context=None):
        for
arg in
args:
            if
arg[0] ==
'location_ids':
               
operator =
arg[1]
               
search_term = arg[2]
        if operator
and
search_term:
           
move_obj =
self.pool.get('stock.move')
           
move_ids = move_obj.search(cr,
uid,
               
[('location_id', operator, search_term)],
context=context)
       
else:
           
move_ids = []
        return
[('move_lines', 'in', move_ids)]
   

    def _get_location_dest_ids(self, cr, uid, ids,
name, arg, context=None):
       
res = {}
        for pick in
self.browse(cr, uid,
ids):
           
location_ids =
set()
            for
move in
pick.move_lines:
               
location_ids.add(move.location_id.id)
           
res[pick.id] = list(location_ids)
       
return res

    def _location_dest_ids_search(self, cr, uid, obj,
name, args,
context=None):
        for arg in
args:
            if
arg[0] ==
'location_dest_ids':
               
operator =
arg[1]
               
search_term = arg[2]
        if operator
and
search_term:
           
move_obj =
self.pool.get('stock.move')
           
move_ids = move_obj.search(cr,
uid,
               
[('location_dest_id', operator, search_term)],
context=context)
       
else:
           
move_ids = []
        return
[('move_lines', 'in', move_ids)]

_columns = { 

       
'location_ids':fields.function(_get_location_ids,
fnct_search=_location_ids_search,
           
method=True, type='many2many', relation='stock.location', string='源库位
ids'),
               

       
'location_dest_ids':fields.function(_get_location_dest_ids,
fnct_search=_location_dest_ids_search,
           
method=True, type='many2many', relation='stock.location', string='目标库位
ids'),
    }

stock_picking()

示例2:

class stock_production_lot(osv.osv):

_name = 'stock.production.lot'

_description = 'Serial Number'

    def _get_stock(self, cr, uid, ids, field_name, arg, context=None):

""" Gets stock of products for locations

@return: Dictionary of values

"""

if context is None:

context = {}

if 'location_id' not in context:

locations = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'internal')], context=context)

else:

locations = context['location_id'] and [context['location_id']] or []

if isinstance(ids, (int, long)):

ids = [ids]

res = {}.fromkeys(ids, 0.0)

if locations:

cr.execute('''select

prodlot_id,

sum(qty)

from

stock_report_prodlots

where

location_id IN %s and prodlot_id IN %s group by prodlot_id''',(tuple(locations),tuple(ids),))

res.update(dict(cr.fetchall()))

return res

    def _stock_search(self, cr, uid, obj, name, args, context=None):

""" Searches Ids of products

@return: Ids of locations

"""

locations = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'internal')])

cr.execute('''select

prodlot_id,

sum(qty)

from

stock_report_prodlots

where

location_id IN %s group by prodlot_id

having  sum(qty) '''+ str(args[0][1]) + str(args[0][2]),(tuple(locations),))

res = cr.fetchall()

ids = [('id', 'in', map(lambda x: x[0], res))]

return ids

_columns = {

'name': fields.char('Serial Number', size=64, required=True, help="Unique Serial Number, will be displayed as: PREFIX/SERIAL [INT_REF]"),

'ref': fields.char('Internal Reference', size=256, help="Internal reference number in case it differs from the manufacturer's serial number"),

'prefix': fields.char('Prefix', size=64, help="Optional prefix to prepend when displaying this serial number: PREFIX/SERIAL [INT_REF]"),

'product_id': fields.many2one('product.product', 'Product', required=True, domain=[('type', '<>', 'service')]),

'date': fields.datetime('Creation Date', required=True),

        'stock_available': fields.function(_get_stock, fnct_search=_stock_search, type="float", string="Available", select=True,

help="Current quantity of products with this Serial Number available in company warehouses",

digits_compute=dp.get_precision('Product Unit of Measure')),

'revisions': fields.one2many('stock.production.lot.revision', 'lot_id', 'Revisions'),

'company_id': fields.many2one('res.company', 'Company', select=True),

'move_ids': fields.one2many('stock.move', 'prodlot_id', 'Moves for this serial number', readonly=True),

}

_defaults = {

'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),

'name': lambda x, y, z, c: x.pool.get('ir.sequence').get(y, z, 'stock.lot.serial'),

'product_id': lambda x, y, z, c: c.get('product_id', False),

}

_sql_constraints = [

('name_ref_uniq', 'unique (name, ref)', 'The combination of Serial Number and internal reference must be unique !'),

]

stock_production_lot()

示例3:

# -*- coding: utf-8 -*-
from openerp.osv import fields, osv
import
decimal_precision as dp
from openerp.addons.stock.product import
product_product as spp
from openerp.addons.product.product import
product_product as pp

_product_available = spp._product_available
_product_lst_price =
pp._product_lst_price

SORTABLE_FUNC_FIELD = ('qty_available', 'virtual_available', 'lst_price')

def condition(operand, left, right):
   
if operand == '=':
        operand =
'=='
    return eval('
'.join((str(left),operand,str(right))))

class product_product(osv.osv):
   
_inherit = "product.product"

    def _search_fnct(self, cr, uid, args, qty_type,
context=None):
        context =
context or {}
        print 'context',
context
        ids = self.search(cr, uid,
[], context=context)
        qty_products
= self.read(cr, uid, ids, [qty_type],
context=context)
        res =
[]
        for q in
qty_products:
           
if condition(args[0][1], q[qty_type], args[0][2]):

               
res.append(q['id'])
        return [('id',
'in', res)]
   
    def
_search_qty_available(self, cr, uid, obj, name, args,
context):
        return
self._search_fnct(cr, uid, args, 'qty_available', context)

    def _search_virtual_available(self, cr, uid, obj,
name, args, context):
       
return self._search_fnct(cr, uid, args, 'virtual_available', context)

    def _search_lst_price(self, cr, uid, obj, name,
args, context):
        return
self._search_fnct(cr, uid, args, 'lst_price',
context)
           

    _columns =
{
        'qty_available':
fields.function(_product_available,
           
multi='qty_available',
type='float',
           
digits_compute=dp.get_precision('Product Unit of
Measure'),
           
fnct_search=_search_qty_available,
           
string='Quantity On
Hand',
           
help="Current quantity of
products.\n"
                
"In a context with a single Stock Location, this includes
"
                
"goods stored at this Location, or any of its
children.\n"
                
"In a context with a single Warehouse, this includes
"
                
"goods stored in the Stock Location of this Warehouse, or
any"
                
"of its
children.\n"
                
"In a context with a single Shop, this includes goods
"
                
"stored in the Stock Location of the Warehouse of this Shop,
"
                
"or any of its
children.\n"
                
"Otherwise, this includes goods stored in any Stock Location
"
                
"with 'internal' type."),
       
'virtual_available':
fields.function(_product_available,
           
multi='qty_available',
type='float',
           
digits_compute=dp.get_precision('Product Unit of
Measure'),
           
fnct_search=_search_virtual_available,
           
string='Forecasted
Quantity',
           
help="Forecast quantity (computed as Quantity On Hand
"
                
"- Outgoing +
Incoming)\n"
                
"In a context with a single Stock Location, this includes
"
                
"goods stored in this location, or any of its
children.\n"
                
"In a context with a single Warehouse, this includes
"
                
"goods stored in the Stock Location of this Warehouse, or
any"
                
"of its
children.\n"
                
"In a context with a single Shop, this includes goods
"
                
"stored in the Stock Location of the Warehouse of this Shop,
"
                
"or any of its
children.\n"
                
"Otherwise, this includes goods stored in any Stock Location
"
                
"with 'internal' type."),
       
'lst_price' : fields.function(_product_lst_price,
type='float',
           
string='Public Price',
fnct_search=_search_lst_price,
           
digits_compute=dp.get_precision('Product
Price')),
        }

def search(self, cr, uid, args, offset=0, limit=None,
order=None,
           
context=None, count=False):
       
context = context or {}
        func_flds
= []
        if
order:
           
order_part =
order.split(',')[0]
           
order_split = order_part.strip().split('
')
           
order_field =
order_split[0].strip()
           
order_direction = order_split[1].strip() if len(order_split) == 2 else
''
            if
order_field in
SORTABLE_FUNC_FIELD:
                   
func_flds.append((order_field,
order_direction))
        ids =
super(product_product, self).search(cr, uid, args, offset,
limit,
               
order, context, count)
        if
func_flds:
           
for fld, order in
func_flds:
               
val = self.read(cr, uid, ids, [fld],
context=context)
               
sorted_val = sorted(val, key=lambda x:
x[fld],
                       
reverse=(order=='DESC'))
           
ids = map(lambda x: x['id'],
sorted_val)
        return ids

# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: