🎉 Initial commit - Hazard Odoo 16 project
- Custom modules: hazard_shopify, hazard_inventory_report, hazard_website - Third-party modules: bi_sql_editor, query_deluxe, sql_request_abstract, l10n_mx_sat_sync_itadmin_ee - Docker setup: Odoo 16 + PostgreSQL 17 - Utility scripts: backup_hazard.sh, update_module.py - Agent configuration: .agents/AGENTS.md - Security: Enterprise modules, credentials, backups and production data excluded via .gitignore
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
#!/usr/bin/env python3
|
||||
import xmlrpc.client
|
||||
import requests
|
||||
import sys
|
||||
|
||||
ODOO_URL = 'http://localhost:16001'
|
||||
ODOO_DB = 'hazard_new'
|
||||
ODOO_USER = 'admin'
|
||||
ODOO_PASS = 'admin'
|
||||
|
||||
def main():
|
||||
common = xmlrpc.client.ServerProxy(f'{ODOO_URL}/xmlrpc/2/common')
|
||||
uid = common.authenticate(ODOO_DB, ODOO_USER, ODOO_PASS, {})
|
||||
models = xmlrpc.client.ServerProxy(f'{ODOO_URL}/xmlrpc/2/object')
|
||||
|
||||
print("Obteniendo credenciales de Shopify desde Odoo...")
|
||||
config_ids = models.execute_kw(ODOO_DB, uid, ODOO_PASS, 'shopify.config', 'search', [[]])
|
||||
if not config_ids:
|
||||
print("No se encontró configuración de shopify.")
|
||||
return
|
||||
|
||||
config = models.execute_kw(ODOO_DB, uid, ODOO_PASS, 'shopify.config', 'read', [config_ids[0]], {'fields': ['shop_url', 'access_token']})[0]
|
||||
|
||||
shop_url = config.get('shop_url')
|
||||
access_token = config.get('access_token')
|
||||
|
||||
if not shop_url or not access_token:
|
||||
print("Faltan credenciales de Shopify.")
|
||||
return
|
||||
|
||||
base_url = f"https://{shop_url}/admin/api/2023-10"
|
||||
headers = {
|
||||
'X-Shopify-Access-Token': access_token,
|
||||
'Content-Type': 'application/json',
|
||||
}
|
||||
|
||||
print(f"Conectando a Shopify ({shop_url})... esto puede tomar un poco dependiendo del número de productos.")
|
||||
|
||||
url = f"{base_url}/products.json?limit=250"
|
||||
wrong_barcodes = []
|
||||
|
||||
while url:
|
||||
resp = requests.get(url, headers=headers)
|
||||
if resp.status_code != 200:
|
||||
print(f"Error consultando Shopify: {resp.status_code} {resp.text}")
|
||||
break
|
||||
|
||||
data = resp.json()
|
||||
products = data.get('products', [])
|
||||
|
||||
for p in products:
|
||||
for v in p.get('variants', []):
|
||||
barcode = v.get('barcode')
|
||||
if barcode and not barcode.startswith('200001'):
|
||||
wrong_barcodes.append({
|
||||
'product_title': p.get('title'),
|
||||
'variant_title': v.get('title'),
|
||||
'sku': v.get('sku'),
|
||||
'barcode': barcode,
|
||||
'id': v.get('id')
|
||||
})
|
||||
|
||||
# Paginación (Link header)
|
||||
link_header = resp.headers.get('Link')
|
||||
url = None
|
||||
if link_header:
|
||||
links = link_header.split(',')
|
||||
for link in links:
|
||||
if 'rel="next"' in link:
|
||||
url = link[link.find('<')+1 : link.find('>')]
|
||||
break
|
||||
|
||||
print(f"\nSe encontraron {len(wrong_barcodes)} variantes en Shopify con un código de barras que NO empieza con 200001:\n")
|
||||
for b in wrong_barcodes:
|
||||
print(f"Producto: {b['product_title']} - {b['variant_title']}")
|
||||
print(f"SKU: {b['sku']} | Barcode: {b['barcode']} | Variant ID: {b['id']}")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user