Add data migration script for Serial No grades
Run after bench migrate. Maps cosmetic_grade C# values to new grade field: - C5-C9 → High - C4 → Med - C3 → Low - C0-C2, blank → Flagged Requires: bench migrate has already created the new fields.
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
"""
|
||||
Data Migration: Populate new Serial No fields from existing data.
|
||||
|
||||
Run this IMMEDIATELY after `bench migrate` on production.
|
||||
Requires: all new fields already exist (grade, cpu_test, ram_test, etc.)
|
||||
|
||||
Maps cosmetic_grade C# values → new grade field:
|
||||
C5-C9 → High
|
||||
C4 → Med
|
||||
C3 → Low
|
||||
C0-C2, blank, anything else → Flagged
|
||||
"""
|
||||
|
||||
import frappe
|
||||
from frappe.utils import now
|
||||
|
||||
def run():
|
||||
print(f"[{now()}] Starting Serial No grade migration...")
|
||||
|
||||
serials = frappe.get_all("Serial No",
|
||||
fields=["name", "cosmetic_grade", "grade", "pricing_status"],
|
||||
limit_page_length=0
|
||||
)
|
||||
|
||||
stats = {"high": 0, "med": 0, "low": 0, "flagged": 0, "skipped": 0, "errors": 0}
|
||||
|
||||
for i, s in enumerate(serials):
|
||||
try:
|
||||
cosmetic = (s.cosmetic_grade or "").strip().upper()
|
||||
|
||||
# Map cosmetic_grade → new grade
|
||||
if cosmetic in ("C5", "C6", "C7", "C8", "C9"):
|
||||
new_grade = "High"
|
||||
elif cosmetic == "C4":
|
||||
new_grade = "Med"
|
||||
elif cosmetic == "C3":
|
||||
new_grade = "Low"
|
||||
else:
|
||||
new_grade = "Flagged"
|
||||
|
||||
# Only update if grade is blank or old value
|
||||
if s.grade and s.grade in ("High", "Med", "Low", "Flagged"):
|
||||
stats["skipped"] += 1
|
||||
continue
|
||||
|
||||
# Determine pricing_status
|
||||
if new_grade == "Flagged":
|
||||
pricing_status = "Flagged"
|
||||
else:
|
||||
pricing_status = "Needs Pricing"
|
||||
|
||||
frappe.db.set_value("Serial No", s.name, {
|
||||
"grade": new_grade,
|
||||
"pricing_status": pricing_status
|
||||
})
|
||||
|
||||
stats[new_grade.lower()] += 1
|
||||
|
||||
if (i + 1) % 1000 == 0:
|
||||
frappe.db.commit()
|
||||
print(f" Processed {i + 1}/{len(serials)}...")
|
||||
|
||||
except Exception as e:
|
||||
stats["errors"] += 1
|
||||
frappe.log_error(f"Migration error for {s.name}: {e}", "Serial Grade Migration")
|
||||
|
||||
frappe.db.commit()
|
||||
|
||||
print(f"\n[{now()}] Migration complete!")
|
||||
print(f" Total Serial Nos: {len(serials)}")
|
||||
print(f" High: {stats['high']}")
|
||||
print(f" Med: {stats['med']}")
|
||||
print(f" Low: {stats['low']}")
|
||||
print(f" Flagged: {stats['flagged']}")
|
||||
print(f" Skipped (already new grade): {stats['skipped']}")
|
||||
print(f" Errors: {stats['errors']}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
run()
|
||||
Reference in New Issue
Block a user