diff options
| author | IT Fixcomart <it@fixcomart.co.id> | 2025-05-26 06:43:10 +0000 |
|---|---|---|
| committer | IT Fixcomart <it@fixcomart.co.id> | 2025-05-26 06:43:10 +0000 |
| commit | 32cd67bd573fb5baa98b8bcdba13359d5acf4b33 (patch) | |
| tree | def3da9157b2b949b3907cd7f66a4a6075dd31e1 | |
| parent | 34df4d4a90027adb19af295359e1bdfc8f3fb5b5 (diff) | |
| parent | 7d7a6d4421a664e2ddd9308b15ea9f9e5e54c4a9 (diff) | |
Merged in po-lock-and-logproduct (pull request #314)
(andri) revisi log note product variant
| -rwxr-xr-x | indoteknik_custom/models/product_template.py | 160 |
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): |
