diff options
| author | Indoteknik . <andrifebriyadiputra@gmail.com> | 2025-05-09 11:21:46 +0700 |
|---|---|---|
| committer | Indoteknik . <andrifebriyadiputra@gmail.com> | 2025-05-09 11:21:46 +0700 |
| commit | 0f7e495ae7a28bd897929322e0419de91ecb1675 (patch) | |
| tree | e8899d9a7386c6775c86e72a918bf25507484ce0 | |
| parent | 0d34982dfd6d644e87733459bf0de5c05aad7cb6 (diff) | |
(andri) penyesuaian log note pada purchase pricelist & handle perubahan log note image di product & variant (only notif add/update/delete)
| -rwxr-xr-x | indoteknik_custom/models/product_template.py | 170 | ||||
| -rwxr-xr-x | indoteknik_custom/models/purchase_pricelist.py | 41 |
2 files changed, 127 insertions, 84 deletions
diff --git a/indoteknik_custom/models/product_template.py b/indoteknik_custom/models/product_template.py index 99ae73d3..373b8ebd 100755 --- a/indoteknik_custom/models/product_template.py +++ b/indoteknik_custom/models/product_template.py @@ -402,6 +402,11 @@ class ProductTemplate(models.Model): # log perubahan field def _log_field_changes(self, vals, old_values): exclude_fields = ['solr_flag', 'desc_update_solr', 'last_update_solr', 'is_edited'] + custom_labels = { + 'image_1920': 'Main Image', + 'image_carousel_lines': 'Carousel Images', + 'product_template_image_ids': 'Extra Product Media', + } for record in self: changes = [] @@ -410,11 +415,11 @@ class ProductTemplate(models.Model): continue field = record._fields[field_name] - field_label = field.string or 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 - def stringify(val): + def stringify(val, field, record): if val in [None, False]: return 'None' if isinstance(field, fields.Selection): @@ -425,25 +430,40 @@ class ProductTemplate(models.Model): if isinstance(field, fields.Boolean): return 'Yes' if val else 'No' if isinstance(field, fields.Many2one): - return val.name if hasattr(val, 'name') else str(val) + 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.Model) else val - names = [] - if records: - for attr in ['name', 'x_name', 'display_name']: - if hasattr(records[0], attr): - names = records.mapped(attr) - break - if not names: - names = [str(r.id) for r in records] - return ", ".join(names) if names else 'None' + 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) - new_val_str = stringify(new_value) + old_val_str = stringify(old_value, field, record) + new_val_str = stringify(new_value, field, record) if old_val_str != new_val_str: - changes.append(f"<li><b>{field_label}</b>: '{old_val_str}' → '{new_val_str}'</li>") + if field_name in custom_labels: + 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>") if changes: message = "<b>Updated:</b><ul>%s</ul>" % "".join(changes) @@ -793,64 +813,74 @@ class ProductProduct(models.Model): # log perubahan field def _log_field_changes(self, vals, old_values): - exclude_fields = ['solr_flag', 'desc_update_solr', 'last_update_solr', 'is_edited'] - - 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 = field.string or field_name - old_value = old_values.get(record.id, {}).get(field_name) - new_value = record[field_name] + 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', + } - def stringify(val): - 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 = self.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 = record[field_name] - names = [] - if records: + 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 + + 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): - names = records.mapped(attr) - break - if not names: - names = [str(r.id) for r in records] - return ", ".join(names) if names else 'None' - - return str(val) - - - old_val_str = stringify(old_value) - new_val_str = stringify(new_value) - - if old_val_str != new_val_str: - changes.append(f"<li><b>{field_label}</b>: '{old_val_str}' → '{new_val_str}'</li>") + 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) - if changes: - message = "<b>Updated:</b><ul>%s</ul>" % "".join(changes) - record.message_post(body=message) + 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>") + + if changes: + message = "<b>Updated:</b><ul>%s</ul>" % "".join(changes) + record.message_post(body=message) # simpan data lama dan log perubahan field def write(self, vals): diff --git a/indoteknik_custom/models/purchase_pricelist.py b/indoteknik_custom/models/purchase_pricelist.py index 6ac74c69..764911cf 100755 --- a/indoteknik_custom/models/purchase_pricelist.py +++ b/indoteknik_custom/models/purchase_pricelist.py @@ -146,33 +146,46 @@ class PurchasePricelist(models.Model): old_value = old_values.get(record.id, {}).get(field_name) new_value = record[field_name] - def stringify(val): + def stringify(val, field, record): if val in [None, False]: return 'None' + # Handle Selection if isinstance(field, fields.Selection): selection = field.selection if callable(selection): selection = selection(record) return dict(selection).get(val, str(val)) + # Handle Boolean if isinstance(field, fields.Boolean): return 'Yes' if val else 'No' + # Handle Many2one if isinstance(field, fields.Many2one): - return val.name if hasattr(val, 'name') else str(val) + 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) + # Handle Many2many if isinstance(field, fields.Many2many): - records = val if isinstance(val, models.Model) else val - names = [] - if records: - for attr in ['name', 'x_name', 'display_name']: - if hasattr(records[0], attr): - names = records.mapped(attr) - break - if not names: - names = [str(r.id) for r in records] - return ", ".join(names) if names else 'None' + 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) + # Handle One2many + 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)})" + # Default case (Char, Float, Integer, etc) return str(val) - old_val_str = stringify(old_value) - new_val_str = stringify(new_value) + old_val_str = stringify(old_value, field, record) + new_val_str = stringify(new_value, field, record) if old_val_str != new_val_str: changes.append(f"<li><b>{field_label}</b>: '{old_val_str}' → '{new_val_str}'</li>") |
