# -*- coding: utf-8 -*- import logging from odoo import models, fields, api, _ _logger = logging.getLogger(__name__) class ProductProduct(models.Model): _inherit = 'product.product' meta_product_id = fields.Char(string='Meta Retailer ID', copy=False, help='Unique ID / SKU used in Meta Commerce Catalog.') meta_sync_status = fields.Selection([ ('pending', 'Pending Sync'), ('synced', 'Synced'), ('failed', 'Sync Error'), ('excluded', 'Excluded') ], string='Meta Sync Status', default='pending', copy=False) meta_last_sync = fields.Datetime(string='Meta Last Synced', readonly=True, copy=False) meta_sync_error = fields.Text(string='Meta Sync Error', readonly=True, copy=False) def action_sync_to_meta(self): queue_model = self.env['social.meta.sync.queue'] for product in self: queue_model.enqueue_product(product, operation='create_update') queue_model.process_queue(limit=50) return { 'type': 'ir.actions.client', 'tag': 'display_notification', 'params': { 'title': _("Meta Sync Triggered"), 'message': _("Product variant enqueued for Meta catalog synchronization."), 'type': 'info', 'sticky': False, } } def write(self, vals): res = super().write(vals) sync_trigger_fields = { 'lst_price', 'default_code', 'active', 'image_variant_1920', 'product_template_attribute_value_ids' } if any(f in vals for f in sync_trigger_fields): try: queue_model = self.env['social.meta.sync.queue'] for product in self: if not product.product_tmpl_id.meta_sync_enabled: continue operation = 'delete' if vals.get('active') is False else 'create_update' queue_model.enqueue_product(product, operation=operation) except Exception as e: _logger.warning("Non-blocking error enqueuing Meta sync for variant: %s", e) return res def unlink(self): for product in self: try: queue_model = self.env['social.meta.sync.queue'] queue_model.enqueue_product(product, operation='delete') except Exception as e: _logger.warning("Non-blocking error enqueuing Meta deletion for variant %s: %s", product.id, e) return super().unlink()