summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndoteknik . <andrifebriyadiputra@gmail.com>2025-05-09 11:21:46 +0700
committerIndoteknik . <andrifebriyadiputra@gmail.com>2025-05-09 11:21:46 +0700
commit0f7e495ae7a28bd897929322e0419de91ecb1675 (patch)
treee8899d9a7386c6775c86e72a918bf25507484ce0
parent0d34982dfd6d644e87733459bf0de5c05aad7cb6 (diff)
(andri) penyesuaian log note pada purchase pricelist & handle perubahan log note image di product & variant (only notif add/update/delete)
-rwxr-xr-xindoteknik_custom/models/product_template.py170
-rwxr-xr-xindoteknik_custom/models/purchase_pricelist.py41
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>")