2016-11-10 1 views
1

Я перенес модуль, который может создавать движения stock.inventory, загружая csv's.AttributeError: объект 'int' не имеет атрибута 'id' - сообщества Odoo v9

Это функционирует очень хорошо, но иногда, когда я загрузить определенный CSV, он бросает мне эту ошибку:

Odoo 

Odoo Server Error 

Traceback (most recent call last): 
File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 648, in _handle_exception 
return super(JsonRequest, self)._handle_exception(exception) 
File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 685, in dispatch 
result = self._call_function(**self.params) 
File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 321, in _call_function 
return checked_call(self.db, *args, **kwargs) 
File "/usr/lib/python2.7/dist-packages/openerp/service/model.py", line 118, in wrapper 
return f(dbname, *args, **kwargs) 
File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 314, in checked_call 
result = self.endpoint(*a, **kw) 
File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 964, in __call__ 
return self.method(*args, **kw) 
File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 514, in response_wrap 
response = f(*args, **kw) 
File "/usr/lib/python2.7/dist-packages/openerp/addons/web/controllers/main.py", line 892, in call_button 
action = self._call_kw(model, method, args, {}) 
File "/usr/lib/python2.7/dist-packages/openerp/addons/web/controllers/main.py", line 880, in _call_kw 
return getattr(request.registry.get(model), method)(request.cr, request.uid, *args, **kwargs) 
File "/usr/lib/python2.7/dist-packages/openerp/api.py", line 250, in wrapper 
return old_api(self, *args, **kwargs) 
File "/usr/lib/python2.7/dist-packages/openerp/api.py", line 421, in old_api 
result = new_api(recs, *args, **kwargs) 
File "/usr/lib/python2.7/dist-packages/openerp/api.py", line 425, in new_api 
result = [method(rec, *args, **kwargs) for rec in self] 
File "/usr/lib/python2.7/dist-packages/openerp/custom_addons/stock_inventory_import/wizard/import_inventory.py", line 85, in action_import 
val['location_id'] = prod_location.id 
AttributeError: 'int' object has no attribute 'id' 

Код заключается в следующем:

@api.one 
def action_import(self): 
    """Load Inventory data from the CSV file.""" 
    ctx = self._context 
    stloc_obj = self.env['stock.location'] 
    inventory_obj = self.env['stock.inventory'] 
    inv_imporline_obj = self.env['stock.inventory.import.line'] 
    product_obj = self.env['product.product'] 
    if 'active_id' in ctx: 
     inventory = inventory_obj.browse(ctx['active_id']) 
    if not self.data: 
     raise exceptions.Warning(_("You need to select a file!")) 
    # Decode the file data 
    data = base64.b64decode(self.data) 
    file_input = cStringIO.StringIO(data) 
    file_input.seek(0) 
    location = self.location 
    reader_info = [] 
    if self.delimeter: 
     delimeter = str(self.delimeter) 
    else: 
     delimeter = ',' 
    reader = csv.reader(file_input, delimiter=delimeter, 
         lineterminator='\r\n') 
    try: 
     reader_info.extend(reader) 
    except Exception: 
     raise exceptions.Warning(_("Not a valid file!")) 
    keys = reader_info[0] 
    # check if keys exist 
    if not isinstance(keys, list) or ('code' not in keys or 
             'quantity' not in keys): 
     raise exceptions.Warning(
      _("Not 'code' or 'quantity' keys found")) 
    del reader_info[0] 
    values = {} 
    actual_date = fields.Date.today() 
    inv_name = self.name + ' - ' + actual_date 
    inventory.write({'name': inv_name, 
        'date': fields.Datetime.now(), 
        'imported': True, 'state': 'confirm'}) 
    for i in range(len(reader_info)): 
     val = {} 
     field = reader_info[i] 
     values = dict(zip(keys, field)) 
     prod_location = location.id 
     if 'location' in values and values['location']: 
      locat_lst = stloc_obj.search([('name', '=', 
              values['location'])]) 
      if locat_lst: 
       prod_location = locat_lst[0] 
     prod_lst = product_obj.search([('default_code', '=', 
             values['code'])]) 
     if prod_lst: 
      val['product'] = prod_lst[0].id 
     if 'lot' in values and values['lot']: 
      val['lot'] = values['lot'] 
     val['code'] = values['code'] 
     val['quantity'] = values['quantity'] 
     val['location_id'] = prod_location.id 
     val['inventory_id'] = inventory.id 
     val['fail'] = True 
     val['fail_reason'] = _('No processed') 
     inv_imporline_obj.create(val) 

и посмотреть Csv как это:

id  product_id  reference     code combinacion avanzadastock location       quantity qty 
2780 Piloto trasero Recambio Ecológico Original M0002780       gsx 600 f 600 1988-1991/4316/A8I 1 

Эта ошибка появляется время от времени, часто она работает без проблем, но некоторые из них ther times вызывает эту ошибку.

Это точно на location колонке.

У меня есть csv с более чем 5k элементов, поэтому мне сложно отслеживать ошибку.

Связано ли это csv? Или это вопрос кода?

ответ

3

Проблема ваша логика

prod_location = location.id 

Тогда следующее, если оператор никогда не вошел, и вы переезжаете в

val['location_id'] = prod_location.id 

И ошибка возникает

+0

Hi @ cricket_007 большое спасибо, извините, пожалуйста, знаете ли вы обходное решение для этого? Я имею в виду, похоже, что объекты не совпадают? – NeoVe

+1

Я не знаю, какую библиотеку вы используете, извините. Просто 'prod_location' получает значение integer.Вы должны исправить оператор if, чтобы получить 'prod_location = locat_lst [0]', чтобы всегда запускать –

+0

Большое спасибо, если он пойдет не так, я открою новый вопрос, Еще раз спасибо! – NeoVe

0

На самом деле проблема была в формате CSV содержание

Поскольку в системе не существует каких-либо мест, то это выбрасывает эту ошибку.

Итак, перед продолжением процесса необходимо проверить места, которые существуют.

Thank you.

1

Да, правильно. Некоторое место в системе не существует. Вот и все. Чтобы избежать такой ошибки, вы можете использовать следующий трюк.

prod_location = self.location and self.location.id or False 

Значит, если система имеет местоположение, то prod_location переменной заданное значение с идентификатором местоположения иначе Ложные

Примечание:

В модели декларации LOCATION_ID поле устанавливается с требуемым = False, иначе вы не можете создать запись с location_id = False Это будет giv e вы ошибка целостности.