2016-11-11 11 views
0

На клик древовидной записи я хочу открыть формуляр. Когда этот вид формы открыт, у меня есть два one2many поля, которые необходимо заполнять динамически (в моем случае у меня есть список продуктов и по щелчку продукта, который я хочу найти, сколько было сделано для этого продукта)Openerp v7 API-поле функции 'one2many' type

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 

Что я хочу, это аналогичная функциональность для поля fields.function. Это должно работать, но это не делает:

'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()

Я могу видеть на https://www.odoo.com/forum/help-1/question/can-i-store-field-function-with-the-type-one2many-356

, что это, кажется, не поддерживается. Правильно ли ответ? Есть ли обходное решение?

+0

Обновите свой вопрос методом * _get_last_sales *. –

+0

@Odedra Обновлен мой вопрос –

ответ

1

Да, хранение функция x2many или вычисляемые поля не имеет смысла вообще. Зачем? Оба типа требуют некоторой специальной настройки, которая не может быть выполнена при определении поля. На один2 вам понадобится соответствующий внешний ключ на другой модели. На many2many вы должны определить таблицу для обеих моделей.

Мой опыт работы с odoo показал: используйте неработающие многозначные поля функций (функция должна возвращать список идентификаторов в своем обычном словаре).

Плюс, ваши функции неверны, как отметил в своем ответе @Odedra.

1

Try с помощью следующего кода:

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') 
+0

Просьба уточнить, что делает этот код? Зачем мне это ставить? –

+0

Этот код решит вашу проблему. В вашем коде есть много проблем. Например, вы не передали значение определенному идентификатору записи. Когда мы используем оператор * = *, нам нужно установить правильное значение. В вашем случае вы передали список. * (customer_loc_id) * и * (production_loc_id) * –

+0

Благодарим вас за ваше время и ответ @Odedra. Но моя основная проблема заключается не в этом методе. Моя основная проблема заключается в том, как вызвать метод, когда открывается представление формы моей записи. Пожалуйста, проигнорируйте эти методы, я уже удалил их, я просто вставил их, чтобы увидеть, будут ли они вызваны. –