forked from Agofer/fix_views_14
Se agrega script para escribir los atributos en los productos desde drive
This commit is contained in:
parent
dd72a57917
commit
3c10cce0da
82
write_AttributeProduct_DriveToOdoo.py
Normal file
82
write_AttributeProduct_DriveToOdoo.py
Normal file
@ -0,0 +1,82 @@
|
||||
import os
|
||||
import odooly
|
||||
import argparse
|
||||
import pygsheets
|
||||
import pandas as pd
|
||||
|
||||
def update_attributes_in_product(odoo_items, id, value_ids):
|
||||
if not id:
|
||||
return
|
||||
|
||||
product_id = odoo_items.browse(int(id))
|
||||
|
||||
if not product_id.exists():
|
||||
print(f'el producto {product_id} no existe')
|
||||
return
|
||||
|
||||
product_tmp = product_id.product_tmpl_id
|
||||
|
||||
if len(product_tmp.product_variant_ids) > 1:
|
||||
print(f'Plantilla {product_tmp.name} #{product_tmp.id}: más de una variante.')
|
||||
return
|
||||
|
||||
attribute_lines = {line.attribute_id.id: line for line in product_tmp.attribute_line_ids}
|
||||
|
||||
for product_attribute in value_ids:
|
||||
if not product_attribute:
|
||||
print(f'Revisar el producto {product_tmp.default_code}, No se encuentra el valor de algun atributo')
|
||||
continue
|
||||
|
||||
attribute_id = product_attribute[0]['attribute_id'][0]
|
||||
attribute_value_id = product_attribute[0]['id']
|
||||
|
||||
if attribute_id in attribute_lines:
|
||||
product_with_attribute = attribute_lines[attribute_id]
|
||||
value_exist = attribute_value_id in product_with_attribute.value_ids[0].ids
|
||||
|
||||
if value_exist:
|
||||
continue
|
||||
|
||||
product_with_attribute.value_ids = [(6, 0, [product_attribute[0]['id']])]
|
||||
|
||||
else:
|
||||
product_tmp.attribute_line_ids = [(0, 0, {
|
||||
'attribute_id': product_attribute[0]['attribute_id'][0],
|
||||
'value_ids': [(4, product_attribute[0]['id'], 0)]
|
||||
})]
|
||||
|
||||
def main(odoo, filename, args):
|
||||
|
||||
gc = pygsheets.authorize(service_file=os.path.expanduser('config/0a4abc985039aa.json'))
|
||||
ss = gc.open(filename)
|
||||
ws = ss.worksheet_by_title('Atributos')
|
||||
|
||||
Value = odoo.env['product.attribute.value']
|
||||
values = Value.search_read([], ['id', 'name', 'attribute_id']) # Obtiene todos los valores creados en Odoo
|
||||
|
||||
df = ws.get_as_df()
|
||||
attributes_df = df.iloc[:, int(args.num_atributo_primer):int(args.num_atributo_ultimo)] # df de atributos
|
||||
product_attributes_df = df[(attributes_df != '').any(axis=1)] # df de los productos filtrados donde almenos tengan un atributo
|
||||
|
||||
product_ids = product_attributes_df.iloc[:, int(args.num_product_ids)] # product_id de los productos con almenos un atributo
|
||||
attributes_list = product_attributes_df.iloc[:, int(args.num_atributo_primer):int(args.num_atributo_ultimo)].values #valores del productos en tuplas
|
||||
|
||||
# Recorre cada producto con su valores y actualiza el campo
|
||||
|
||||
for product_id, product_attributes in zip(product_ids, attributes_list):
|
||||
value_ids = [list(filter(lambda l: l['attribute_id'][1] == attribute and l['name'] == str(value), values))
|
||||
for attribute, value in zip(list(attributes_df.columns), product_attributes) if value]
|
||||
update_attributes_in_product(odoo.env['product.product'], product_id, value_ids)
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description='Escribir Atributos y valores a los productos')
|
||||
parser.add_argument('--num_product_ids', required=True, help='Numero de la columna donde se encuentra el id de los productos, Ejem: 1')
|
||||
parser.add_argument('--num_atributo_primer', required=True, help='Numero de la primera columna de los atributos, Ejem: 6')
|
||||
parser.add_argument('--num_atributo_ultimo', required=True, help='Numero de la primera columna de los atributos, Ejem: 18')
|
||||
args = parser.parse_args()
|
||||
|
||||
filename = 'Maestro de Productos'
|
||||
|
||||
odooly.Client._config_file = os.path.expanduser('config/odooly.ini')
|
||||
odoo = odooly.Client.from_config('odootest25')
|
||||
main(odoo, filename, args)
|
||||
Loading…
Reference in New Issue
Block a user