how to read a record of each row by row from the database of the module I create from the products in python? I need a help and I am new programming in odoo.
This is my code
class ImportFile(models.TransientModel): _name = 'import.file' _description = 'Importar Archivo de Excel de Mercado Libre'
# formatos del archivo de excel para la importación desde la aplicación
file_type = fields.Selection( [('CSV', 'Archivo CSV'), ('XLS', 'Archivo XLS')], string='Tipo de Archivo', default='CSV') file = fields.Binary(string="Cargar Archivo")
def import_file(self): if not self.file: raise ValidationError( _("Por favor seleccione el formato válido para importar!"))
# Para el formato CSV
if self.file_type == 'CSV': line = keys = ['code_meli', 'name', 'price', 'quantity', 'currency_id', 'shipping_method', 'listing_method', 'fee_per_sale', 'status'] try: csv_data = base64.b64decode(self.file) data_file = io.StringIO(csv_data.decode("utf-8")) data_file.seek(0) file_reader = [] csv_reader = csv.reader(data_file, delimiter=',') file_reader.extend(csv_reader) except Exception: raise ValidationError( _("Por favor seleccione el formato CSV válido para importar"))
values = {} for i in range(len(file_reader)): field = list(map(str, file_reader[i])) values = dict(zip(keys, field)) if values: if i == 0: continue else: res = self.create_menu(values) else: # Para el formato XLSX try: file = tempfile.NamedTemporaryFile( delete=False, suffix=".xlsx") file.write(binascii.a2b_base64(self.file)) file.seek(0) values = {} # Variable para la búsuqeda del archivo open_file = xlrd.open_workbook(file.name) # La hoja donde empieza a leer la data del archivo sheet = open_file.sheet_by_index(2) except Exception: raise ValidationError( _("Por favor seleccione el formato XLSX válido para importar!"))
# Empezar a leer la data del archivo desde la fila 0, columna 3 for row_no in range(3, sheet.nrows): val = {} if row_no <= 0: fields = list( map(lambda row: row.value.encode('utf-8'), sheet.row(row_no))) else: line = list(map(lambda row: isinstance(row.value, bytes) and row.value.encode( 'utf-8') or str(row.value), sheet.row(row_no))) values.update({ 'code_meli': line[0], 'name': line[2], 'quantity': line[4], 'price': line[5], 'currency_id': line[6], 'shipping_method': line[7], 'listing_type': line[8], 'fee_per_sale': line[9], 'status': line[10], }) res = self.create_menu(values)
def create_menu(self, values): menu = self.env['mercado_libre_connector.menu'] currency_id = self.get_currency_id(values.get('currency_id'))
vals = { 'code_meli': values.get('code_meli'), 'name': values.get('name'), 'currency_id': currency_id.id, 'price': values.get('price'), 'quantity': values.get('quantity'), 'shipping_method': values.get('shipping_method'), 'listing_type': values.get('listing_type'), 'fee_per_sale': values.get('fee_per_sale'), 'status': values.get('status'), }
if values.get('code_meli') == '': raise UserError(_('El Codigo ML debe tener información !')) if values.get('name') == '': raise UserError(_('El nombre del producto es Requerido !')) if values.get('quantity') == '': raise UserError( _('La cantidad del producto no debe estar vacio!'))
res = menu.create(vals) return res
def get_currency_id(self, name): currency_id = self.env['res.currency'].search( [('name', '=', name)], limit=1) if currency_id: return currency_id else: raise UserError(_('El precio tiene que ser en U$S o Bs.'))
Can anyone help me on this one? Please I new for odoo's development on python