summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2025-05-26 06:43:10 +0000
committerIT Fixcomart <it@fixcomart.co.id>2025-05-26 06:43:10 +0000
commit32cd67bd573fb5baa98b8bcdba13359d5acf4b33 (patch)
treedef3da9157b2b949b3907cd7f66a4a6075dd31e1
parent34df4d4a90027adb19af295359e1bdfc8f3fb5b5 (diff)
parent7d7a6d4421a664e2ddd9308b15ea9f9e5e54c4a9 (diff)
Merged in po-lock-and-logproduct (pull request #314)
(andri) revisi log note product variant
-rwxr-xr-xindoteknik_custom/models/product_template.py160
1 files changed, 66 insertions, 94 deletions
diff --git a/indoteknik_custom/models/product_template.py b/indoteknik_custom/models/product_template.py
index c62ca63e..3bb54f44 100755
--- a/indoteknik_custom/models/product_template.py
+++ b/indoteknik_custom/models/product_template.py
@@ -797,7 +797,7 @@ class ProductTemplate(models.Model):
self.message_post(body=f"<b>Vendor Pricelist</b>: all removed")
def _log_field_changes_product(self, vals, old_values):
- """Log general field changes for product template"""
+ """Revised - Log general field changes for product template without posting to variants"""
exclude_fields = ['solr_flag', 'desc_update_solr', 'last_update_solr', 'is_edited']
image_fields = ['image_1920', 'image_carousel_lines', 'product_template_image_ids']
@@ -867,13 +867,9 @@ class ProductTemplate(models.Model):
changes.append(f"<li><b>{field_label}</b>: '{old_val_str}' → '{new_val_str}'</li>")
if changes:
+ # PERBAIKAN: Hanya post ke template, HAPUS bagian log ke variants
record.message_post(body=f"<b>Updated:</b><ul>{''.join(changes)}</ul>")
- # log changes to product variants
- variant_message = f"<b>Updated:</b><ul>{''.join(changes)}</ul>"
- for variant in record.product_variant_ids:
- variant.message_post(body=variant_message)
-
# simpan data lama dan log perubahan field
def write(self, vals):
context = self._get_context_with_all_info(vals)
@@ -1235,101 +1231,77 @@ class ProductProduct(models.Model):
# log perubahan field
def _log_field_changes_product_variants(self, vals, old_values):
- exclude_fields = ['solr_flag', 'desc_update_solr', 'last_update_solr', 'is_edited']
- # for image fields, use custom labels
- custom_labels = {
- 'image_1920': 'Main Image',
- 'image_carousel_lines': 'Carousel Images',
- 'product_template_image_ids': 'Extra Product Media',
- }
-
- template_changes = {}
+ """Revised - Log field changes for variants without posting to template"""
+ exclude_fields = ['solr_flag', 'desc_update_solr', 'last_update_solr', 'is_edited']
+
+ # Custom labels for image fields
+ custom_labels = {
+ 'image_1920': 'Main Image',
+ 'image_carousel_lines': 'Carousel Images',
+ 'product_template_image_ids': 'Extra Product Media',
+ }
- for record in self:
- changes = []
- for field_name in vals:
- if field_name not in record._fields or field_name in exclude_fields:
- continue
+ for record in self:
+ changes = []
+ for field_name in vals:
+ if field_name not in record._fields or field_name in exclude_fields:
+ continue
- field = record._fields[field_name]
- field_label = custom_labels.get(field_name, field.string or field_name)
- old_value = old_values.get(record.id, {}).get(field_name)
- new_value = record[field_name] # nilai setelah write
+ field = record._fields[field_name]
+ field_label = custom_labels.get(field_name, field.string or field_name)
+ old_value = old_values.get(record.id, {}).get(field_name)
+ new_value = record[field_name]
- def stringify(val, field, record):
- if val in [None, False]:
- return 'None'
- if isinstance(field, fields.Selection):
- selection = field.selection
- if callable(selection):
- selection = selection(record)
- return dict(selection).get(val, str(val))
- if isinstance(field, fields.Boolean):
- return 'Yes' if val else 'No'
- if isinstance(field, fields.Many2one):
- if isinstance(val, int):
- rec = record.env[field.comodel_name].browse(val)
- return rec.display_name if rec.exists() else str(val)
- elif isinstance(val, models.BaseModel):
- return val.display_name
- return str(val)
- if isinstance(field, fields.Many2many):
- records = val if isinstance(val, models.BaseModel) else record[field.name]
- if not records:
- return 'None'
- for attr in ['name', 'x_name', 'display_name']:
- if hasattr(records[0], attr):
- return ", ".join(records.mapped(attr))
- return ", ".join(str(r.id) for r in records)
- if isinstance(field, fields.One2many):
- records = val if isinstance(val, models.BaseModel) else record[field.name]
- if not records:
- return 'None'
- return f"{field.comodel_name}({', '.join(str(r.id) for r in records)})"
+ def stringify(val, field, record):
+ if val in [None, False]:
+ return 'None'
+ if isinstance(field, fields.Selection):
+ selection = field.selection
+ if callable(selection):
+ selection = selection(record)
+ return dict(selection).get(val, str(val))
+ if isinstance(field, fields.Boolean):
+ return 'Yes' if val else 'No'
+ if isinstance(field, fields.Many2one):
+ if isinstance(val, int):
+ rec = record.env[field.comodel_name].browse(val)
+ return rec.display_name if rec.exists() else str(val)
+ elif isinstance(val, models.BaseModel):
+ return val.display_name
return str(val)
+ if isinstance(field, fields.Many2many):
+ records = val if isinstance(val, models.BaseModel) else record[field.name]
+ if not records:
+ return 'None'
+ for attr in ['name', 'x_name', 'display_name']:
+ if hasattr(records[0], attr):
+ return ", ".join(records.mapped(attr))
+ return ", ".join(str(r.id) for r in records)
+ if isinstance(field, fields.One2many):
+ records = val if isinstance(val, models.BaseModel) else record[field.name]
+ if not records:
+ return 'None'
+ return f"{field.comodel_name}({', '.join(str(r.id) for r in records)})"
+ return str(val)
- old_val_str = stringify(old_value, field, record)
- new_val_str = stringify(new_value, field, record)
-
- if old_val_str != new_val_str:
- if field_name in custom_labels: # handle image field
- if old_val_str == 'None' and new_val_str != 'None':
- changes.append(f"<li><b>{field_label}</b>: image added</li>")
- elif old_val_str != 'None' and new_val_str == 'None':
- changes.append(f"<li><b>{field_label}</b>: image removed</li>")
- else:
- changes.append(f"<li><b>{field_label}</b>: image updated</li>")
- else:
- changes.append(f"<li><b>{field_label}</b>: '{old_val_str}' → '{new_val_str}'</li>")
+ old_val_str = stringify(old_value, field, record)
+ new_val_str = stringify(new_value, field, record)
- if changes:
- # Post message to variant
- variant_message = "<b>Updated:</b><ul>%s</ul>" % "".join(changes)
- record.message_post(body=variant_message)
-
- # Group changes by template for posting to template
- template_id = record.product_tmpl_id.id
- if template_id not in template_changes:
- template_changes[template_id] = {}
-
- # Store variant information including ID for creating clickable link
- template_changes[template_id][record.id] = {
- 'name': record.display_name or f"Variant {record.id}",
- 'changes': changes
- }
+ if old_val_str != new_val_str:
+ if field_name in custom_labels: # handle image field
+ if old_val_str == 'None' and new_val_str != 'None':
+ changes.append(f"<li><b>{field_label}</b>: image added</li>")
+ elif old_val_str != 'None' and new_val_str == 'None':
+ changes.append(f"<li><b>{field_label}</b>: image removed</li>")
+ else:
+ changes.append(f"<li><b>{field_label}</b>: image updated</li>")
+ else:
+ changes.append(f"<li><b>{field_label}</b>: '{old_val_str}' → '{new_val_str}'</li>")
- # Post grouped messages to templates with clickable links using your format
- for template_id, variants_data in template_changes.items():
- template = self.env['product.template'].browse(template_id)
- if template.exists():
- template_message = "<b>Variant Updates:</b><br/>"
-
- for variant_id, variant_data in variants_data.items():
- # Create clickable link using your format
- variant_link = f"<a href=\"#id={variant_id}&model=product.product&view_type=form\">{variant_data['name']}</a><br/>"
- template_message += f"{variant_link}<ul>{''.join(variant_data['changes'])}</ul><br/>"
-
- template.message_post(body=template_message)
+ if changes:
+ # PERBAIKAN: Hanya post message ke variant, HAPUS bagian template_changes
+ variant_message = "<b>Updated:</b><ul>%s</ul>" % "".join(changes)
+ record.message_post(body=variant_message)
# simpan data lama dan log perubahan field
def write(self, vals):