def converte_produto_novo(item, categorias): """ recebe um produto e suas categorias e o converte para Magento Object para ser enviado para o site """ stock = Stock() stock.qty = item.saldo.qtdatualestoque stock.is_in_stock = 1 if stock.qty else 0 if item.valmultivendas != 1: stock.enable_qty_increments = 1 stock.qty_increments = f'{item.valmultivendas:.2f}' attr = Attribute() attr.marca = item.produto.fabricante attr.codigo_ciss = item.idsubproduto attr.multiplicador = '{0:.2f}'.format(float(item.valmultivendas)) attr.embalagem = str(item.produto.embalagem.descrembalagem) nome_produto = '{0} {1} - {2}'.format(item.produto.descrcomproduto, item.subdescricao, item.produto.fabricante) nome_produto = nome_produto.title() product = Product() product.sku = item.idsubproduto product.name = nome_produto product.description = nome_produto product.short_description = nome_produto product.price = item.preco.valprecovarejo product.weight = item.pesoliquido product.status = '1' product.visibility = '4' product.tax_class_id = '0' product.stock_data = stock product.categories = categorias product.additional_attributes = attr dt_cadastro = item.dtcadastro dt_novo = date.today() + timedelta(-45) if dt_cadastro >= dt_novo: from_date = str(dt_cadastro) to_date = str(dt_cadastro + timedelta(45)) product.news_from_date = from_date product.news_to_date = to_date imagens = read_images() image = os.getcwd() + '/uploads/photos/sem_imagem.jpg' if product.sku in imagens: image = imagens[product.sku] return { 'sku': str(item.idsubproduto), 'data': product.to_soap(), 'image': image }
def enviar_novos(): """ Envia os produtos novos para o site """ template = 'produtos/form-enviar-produtos.html' form = EnviarProdutosNovosForm() imagens = read_images().keys() task = current_app.enviar_novos_task clear_task = request.args.get('clear_task', None) if clear_task and clear_task == 'yes': if task and task.state == 'SUCCESS': current_app.enviar_novos_task = task = None return redirect(url_for('produtos.enviar_novos')) produtos = None if not task: produtos = buscar_produtos_novos() if not produtos and not task: warning('Não existem produtos para serem enviados para o site') categorias = buscar_categorias_produtos() if not categorias: warning('Não existem categorias do site cadastradas') if form.validate_on_submit() and produtos and categorias: produtos_task = {} for p in produtos: secao = int(request.form.get(f'secao-{p.idsubproduto}', 0)) grupo = int(request.form.get(f'grupo-{p.idsubproduto}', 0)) subgrupo = int(request.form.get(f'subgrupo-{p.idsubproduto}', 0)) if secao and grupo and subgrupo: categorias = [secao, grupo, subgrupo] produtos_task[p.idsubproduto] = categorias task = enviar_novos_task.apply_async(args=(produtos_task, )) current_app.enviar_novos_task = task success(f'Tarefa iniciada com sucesso') return redirect(url_for('produtos.enviar_novos')) result = { 'title': 'Produtos', 'subtitle': 'Enviar Novos', 'form': form, 'imagens': imagens, 'produtos': produtos, 'categorias': categorias, 'task': task } return render_template(template, **result)
def listar_nao_enviados(): """ Lista os produtos que ainda não foram enviados para o site """ template = 'produtos/lista-produtos-nao-enviados.html' produtos = buscar_produtos_nao_enviados() imagens = read_images().keys() if not produtos: warning('Não existem produtos pendentes de serem enviados') result = { 'title': 'Produtos', 'subtitle': 'Não Enviados', 'produtos': produtos, 'imagens': imagens } return render_template(template, **result)
def converteProdutos(produtos): """ recebe um lista dos produtos e categorias e a converte para Magento Object para ser enviado para o site """ result = {'produtos': [], 'erros': []} for p in produtos: categoria_produto = MagCategoriaProduto.query categoria_produto = categoria_produto.filter_by(sku=p.idsubproduto) categoria_produto = categoria_produto.first() if not categoria_produto: result['erros'].append( [p.idsubproduto, 'Produto sem categoria cadastrada']) continue stock = Stock() stock.qty = p.saldo[0].qtdatualestoque stock.is_in_stock = 1 attr = Attribute() attr.marca = p.produto.fabricante attr.codigo_ciss = p.idsubproduto attr.multiplicador = '{0:.2f}'.format(float(p.valmultivendas)) attr.embalagem = str(p.produto.embalagem.descrembalagem) nome_produto = '{0} {1} - {2}'.format(p.produto.descrcomproduto, p.subdescricao, p.produto.fabricante) nome_produto = nome_produto.title() product = Product() product.sku = p.idsubproduto product.name = nome_produto product.description = nome_produto product.short_description = nome_produto product.price = p.preco[0].valprecovarejo product.weight = 1.23 product.status = 1 product.visibility = 1 product.tax_class_id = 0 product.stock_data = stock product.categories = [ categoria_produto.secao, categoria_produto.grupo, categoria_produto.subgrupo ] product.additional_attributes = attr dt_cadastro = p.dtcadastro dt_novo = date.today() + timedelta(-45) if dt_cadastro >= dt_novo: from_date = str(dt_cadastro) to_date = str(dt_cadastro + timedelta(45)) product.news_from_date = from_date product.news_to_date = to_date imagens = read_images() image = os.getcwd() + '/uploads/photos/sem_imagem.jpg' if product.sku in imagens: image = imagens[product.sku] result['produtos'].append({ 'sku': str(p.idsubproduto), 'produto': p, 'data': product.to_soap(), 'image': image }) return result
def atualiza_imagem_task(self): """ Usado para atualizar as imagens de produtos que ja estão no site """ with app.app_context(): Log.info(f'[IMAGENS] Iniciando o envio dos produtos.') db.engine.dispose() produtos = MagProduto.query.filter( MagProduto.atualiza_imagem == True ).all() imagens = read_images() concluidos = 0 erros_count = 0 erros = [] count = 0 total = len(produtos) for p in produtos: Log.info(f'[IMAGENS] Iniciando o envio do item {p.sku}.') self.update_state( state='PROGRESS', meta={ 'name': format_task_name(self.name), 'complete': concluidos, 'errors_count': erros_count, 'errors': erros, 'current': count, 'total': total, 'status': f'Enviando o produto {p.sku}' } ) try: imagem = imagens.get(p.sku, None) nome_imagem = str(p.sku) if not imagem: Log.info(f'[IMAGENS]------ Produto sem imagem') count += 1 continue imagens_site = listImage( p.sku ) # verifca se o produto possui imagens para serem excluidas # antes de enviar a nova if imagens_site: for im in imagens_site: # se ao tentar excluir a imagem gerar a exceção de que # a imagem nao existe na galeria do produto salva como # erro para ser exida ao usuario try: removeImage( p.sku, im['file'], ) except Fault as e: pass # se existir imagens altera o nome para adcionar um contador # exemplo: 13504_6 nome_imagem = f'{nome_imagem}_{len(imagens_site) + 1}' updateImage( imagem, nome_imagem, str(p.sku) ) Log.info(f'[IMAGENS]------ Imagem enviada com sucesso') p.atualiza_imagem = False p.update() Log.info(f'[IMAGENS]------ Produto Atulizado no Integrador') concluidos += 1 except Exception as e: erros_count += 1 erros.append(f'Produto: {p.sku} -------- Erro: {e}') Log.error( f'[IMAGENS] Erro ao enviar o produto {p.sku} erro: {e}') count += 1 Log.info(f'[IMAGENS] Envio de produtos finalizado.') return { 'name': format_task_name(self.name), 'complete': concluidos, 'errors_count': erros_count, 'errors': erros, 'current': total, 'total': total, 'status': 'complete' }
def enviar_novos_task(self, produtos): """ cria uma tarefa para enviar os produtos no site Params ----------- produtos <dict> onde a chave é o código do produto e o valor é a lista com as categorias dos produtos. Raises ----------- Fault<sku já existe no site> Exceção lançada quando o produto já existe no site """ Log.info(f'[NOVOS] Iniciando o envio dos produtos.') imagens = read_images().keys() concluidos = 0 erros_count = 0 erros = [] count = 0 total = len(produtos) with app.app_context(): db.engine.dispose() for sku, categorias in produtos.items(): self.update_state( state='PROGRESS', meta={ 'name': format_task_name(self.name), 'complete': concluidos, 'errors_count': erros_count, 'errors': erros, 'current': count, 'total': total, 'status': f'Enviando o produto {sku}' } ) try: Log.info(f'[NOVOS] Iniciando o envio do item {sku}.') produto_erp = CissProdutoGrade.by(idsubproduto=int(sku)) mag_produto = MagProduto.by(sku=int(sku)) if not mag_produto: mag_produto = MagProduto() mag_produto.sku = produto_erp.idsubproduto mag_produto.idsecao = categorias[0] mag_produto.idgrupo = categorias[1] mag_produto.idsubgrupo = categorias[2] produto = converte_produto_novo(produto_erp, categorias) createProduct( produto['sku'], 'simple', '4', produto['data'] ) updateImage( produto['image'], produto['sku'], produto['sku'] ) Log.info(f'[NOVOS]------ Enviado para o site') # altera o tipo do produto como enviado no erp produto_erp.idtipo = 2 produto_erp.update() # salva se o produto possui imagem ou nao possui_imagem = True if sku in imagens else False mag_produto.atualiza_imagem = False mag_produto.possui_imagem = possui_imagem mag_produto.update() Log.info(f'[NOVOS]------ Gravado no ERP e Integrador') concluidos += 1 except Fault as fault: if fault.faultCode == 1: produto_erp.idtipo = 2 produto_erp.update() erros_count += 1 erros.append(f'Produto: {sku} -------- Erro: {fault}') Log.error( f'[NOVOS] Erro ao enviar o produto {sku} erro: {fault}') except Exception as e: erros_count += 1 erros.append(f'Produto: {sku} -------- Erro: {e}') Log.error( f'[NOVOS] Erro ao enviar o produto {sku} erro: {e}') count += 1 self.update_state( state='PROGRESS', meta={ 'name': format_task_name(self.name), 'complete': concluidos, 'errors_count': erros_count, 'errors': erros, 'current': count, 'total': total, 'status': f'Enviando o produto {sku}' } ) Log.info(f'[NOVOS] Envio de produtos finalizado.') return { 'name': format_task_name(self.name), 'complete': concluidos, 'errors_count': erros_count, 'errors': erros, 'current': total, 'total': total, 'status': 'complete' }