0
votes

On the click of a treeview record I want to open a formview. When that formview is opened I have two one2many fields that need to be populated dynamically (in my case I have a list of products and on the click of a product I want to search how many stock moves have been made for this product)

def get_last_sales(self, cr, uid, ids, context=None):
    customer_loc_id = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'customer')])
    result = self.pool.get('stock.move').search(cr, uid, [('product_id', '=', ids), ('location_dest_id', '=', customer_loc_id)])
    print result
    #raise Exception
    return result

def get_last_productions(self, cr, uid, ids, context=None, args=None, kwargs=None):
    production_loc_id = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'production')])
    result = self.pool.get('stock.move').search(cr, uid, [('product_id', '=', ids), ('location_dest_id', '=', production_loc_id)])
    return result

What I want is similar functionality to the fields.function field. This should work but it does not:

'last_sales':fields.function(_get_last_sales, type='one2many', relation='stock.move', readonly=True, store=store_triggers)

Server Traceback (most recent call last): File "/home/george/odoo/mattia_v7/openerp/addons/web/session.py", line 89, in send return openerp.netsvc.dispatch_rpc(service_name, method, args) File "/home/george/odoo/mattia_v7/openerp/netsvc.py", line 296, in dispatch_rpc result = ExportService.getService(service_name).dispatch(method, params) File "/home/george/odoo/mattia_v7/openerp/service/web_services.py", line 626, in dispatch res = fn(db, uid, *params) File "/home/george/odoo/mattia_v7/openerp/osv/osv.py", line 190, in execute_kw return self.execute(db, uid, obj, method, *args, **kw or {}) File "/home/george/odoo/mattia_v7/openerp/osv/osv.py", line 132, in wrapper return f(self, dbname, *args, **kwargs) File "/home/george/odoo/mattia_v7/openerp/osv/osv.py", line 199, in execute res = self.execute_cr(cr, uid, obj, method, *args, **kw) File "/home/george/odoo/mattia_v7/openerp/osv/osv.py", line 187, in execute_cr return getattr(object, method)(cr, uid, *args, **kw) File "/home/george/odoo/mattia_v7/openerp/osv/orm.py", line 3718, in read result = self._read_flat(cr, user, select, fields, context, load) File "/home/george/odoo/mattia_v7/openerp/osv/orm.py", line 3841, in _read_flat res2 = self._columns[f].get(cr, self, ids, f, user, context=context, values=res) File "/home/george/odoo/mattia_v7/openerp/osv/fields.py", line 1152, in get result = self._fnct(obj, cr, uid, ids, name, self._arg, context) File "/home/george/odoo/mattia_v7/openerp/addons/product/product.py", line 461, in _product_lst_price res[product.id] = product.list_price File "/home/george/odoo/mattia_v7/openerp/osv/orm.py", line 503, in __getattr__ return self[name] File "/home/george/odoo/mattia_v7/openerp/osv/orm.py", line 469, in __getitem__ elif field_column._type in ('one2many', 'many2many') and len(result_line[field_name]): TypeError: object of type 'bool' has no len()

I can see on https://www.odoo.com/forum/help-1/question/can-i-store-field-function-with-the-type-one2many-356

that this does not seem to be supported. Is the answer there correct? Is there any workaround on this?

2
Please update your question with _get_last_sales method.Bhavesh Odedra
@Odedra Updated my questionGeorge Daramouskas

2 Answers

1
votes

Yes, storing x2many function or computed fields makes no sense at all. Why? Both types need some special setup, which can't be made on field definition. On one2many you would need the related foreign key on the other model. On many2many you would have to define the table for both models keys.

My experience with odoo showed: use unstored many2many function fields (function needs to return a list of ids in its usual dictionary).

Plus, your functions aren't correct, as @Odedra has mentioned in his answer.

1
votes

Try with following code:

def get_last_sales(self, cr, uid, ids, context=None):

    customer_loc_id = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'customer')])
    result = {}

    if customer_loc_id:

        for record in self.browse(cr, uid, ids):

            result[record.id] = self.pool.get('stock.move').search(cr, uid, [('product_id', '=', record.id), ('location_dest_id', '=', customer_loc_id[0])])

    return result

def get_last_productions(self, cr, uid, ids, context=None, args=None, kwargs=None):

    production_loc_id = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'production')])
    result = {}

    if production_loc_id:

        for record in self.browse(cr, uid, ids):

            result[record.id] =  self.pool.get('stock.move').search(cr, uid, [('product_id', '=', record.id), ('location_dest_id', '=', production_loc_id[0])])

    return result

'last_sales':fields.function(_get_last_sales, type='one2many', relation='stock.move', readonly=True, string='Last Sales')