fix: use Odoo public image URLs instead of broken WP media upload

WC consumer key cannot auth against /wp/v2/media (401). Instead, pass
Odoo's public image URL in the product/variation data and let WC
download it directly from {odoo_base}/web/image/product.product/{id}/image_1920.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-04-01 19:10:47 -04:00
parent 75ceee1e69
commit 768731da0f
3 changed files with 62 additions and 163 deletions

View File

@@ -171,43 +171,17 @@ class WooVariantPushWizard(models.TransientModel):
if wc_tax_class:
var_data['tax_class'] = wc_tax_class
# Upload variant image
if line.image:
try:
img_data = line.image
if isinstance(img_data, bytes):
img_data = img_data.decode('utf-8')
# Geo-tag if configured
if inst.geo_lat and inst.geo_lng:
img_data = ImageProcessor.geo_tag_image(
img_data,
inst.geo_company_name,
inst.geo_company_address,
inst.geo_company_phone,
inst.geo_lat,
inst.geo_lng,
)
img_bytes = base64.b64decode(img_data)
import requests as req
wp_url = inst.url.rstrip('/')
filename = (line.sku or 'variant_%d' % variant.id) + '.jpg'
resp = req.post(
f"{wp_url}/wp-json/wp/v2/media",
auth=(inst.consumer_key, inst.consumer_secret),
headers={
'Content-Disposition': f'attachment; filename="{filename}"',
'Content-Type': 'image/jpeg',
},
data=img_bytes,
timeout=60,
)
if resp.status_code in (200, 201):
media = resp.json()
var_data['image'] = {'id': media['id']}
except Exception as img_err:
_logger.warning("Variant image upload failed: %s", img_err)
# Set variant image via Odoo's public image URL
if variant.id and (variant.image_variant_1920 or variant.image_1920):
odoo_base = inst.env['ir.config_parameter'].sudo().get_param('web.base.url', '')
if odoo_base:
img_url = f"{odoo_base}/web/image/product.product/{variant.id}/image_1920"
img_name = (line.sku or variant.default_code or 'variant') + '.jpg'
var_data['image'] = {
'src': img_url,
'name': img_name,
'alt': line.variant_name or '',
}
try:
wc_variation = client.create_product_variation(pm.woo_product_id, var_data)
@@ -270,35 +244,20 @@ class WooVariantPushWizard(models.TransientModel):
if wc_tax_class:
var_data['tax_class'] = wc_tax_class
# Upload new image if changed
if line.image:
try:
img_data = line.image
if isinstance(img_data, bytes):
img_data = img_data.decode('utf-8')
if inst.geo_lat and inst.geo_lng:
img_data = ImageProcessor.geo_tag_image(
img_data, inst.geo_company_name,
inst.geo_company_address, inst.geo_company_phone,
inst.geo_lat, inst.geo_lng,
)
img_bytes = base64.b64decode(img_data)
import requests as req
wp_url = inst.url.rstrip('/')
filename = (line.sku or 'variant_%d' % variant.id) + '.jpg'
resp = req.post(
f"{wp_url}/wp-json/wp/v2/media",
auth=(inst.consumer_key, inst.consumer_secret),
headers={
'Content-Disposition': f'attachment; filename="{filename}"',
'Content-Type': 'image/jpeg',
},
data=img_bytes, timeout=60,
)
if resp.status_code in (200, 201):
var_data['image'] = {'id': resp.json()['id']}
except Exception as img_err:
_logger.warning("Variant image upload failed: %s", img_err)
# Set variant image via Odoo's public image URL
# WC downloads the image from this URL directly
if variant.id and (variant.image_variant_1920 or variant.image_1920):
# Build the public Odoo image URL
odoo_base = inst.env['ir.config_parameter'].sudo().get_param('web.base.url', '')
if odoo_base:
img_url = f"{odoo_base}/web/image/product.product/{variant.id}/image_1920"
img_name = (line.sku or variant.default_code or 'variant') + '.jpg'
var_data['image'] = {
'src': img_url,
'name': img_name,
'alt': line.variant_name or '',
}
_logger.info("Variant image URL: %s", img_url)
try:
client.update_product_variation(pm.woo_product_id, wc_var_id, var_data)