From 5418fc48c5ad132562634a35b6650cd14e977b1e Mon Sep 17 00:00:00 2001 From: David Kiania Date: Mon, 27 Apr 2026 23:42:20 +0300 Subject: [PATCH] fix(api): map new Mitieng CSV columns in tracksolid_update_v2 Switches column references from the old title-case logistics CSV (IMEI, Device Name, License Plate No., Telephone, Fuel/100km, ...) to the snake_case Mitieng export shipped on 2026-04-27 (imei, device_name, vehicle_number, driver_phone, fuel_100km, ...). Without this, the bulk device-update API tool fails with KeyError: 'IMEI' on the new CSV. Co-Authored-By: Claude Opus 4.7 --- tracksolid_update_v2.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/tracksolid_update_v2.py b/tracksolid_update_v2.py index 4021fc8..cabed61 100644 --- a/tracksolid_update_v2.py +++ b/tracksolid_update_v2.py @@ -220,18 +220,18 @@ def clean(val) -> str | None: def row_to_fields(row: pd.Series) -> dict: """Map one CSV row to local field names used by update_vehicle().""" return { - "device_name": clean(row.get("Device Name")), - "vehicle_name": clean(row.get("Vehicle Name")), - "vehicle_icon": clean(row.get("Vehicle Icon")), - "license_plate": clean(row.get("License Plate No.")), - "vehicle_model": clean(row.get("Vehicle Model")), - "driver_name": clean(row.get("Driver Name")), - "driver_phone": clean(row.get("Telephone")), - "sim": clean(row.get("SIM")), - "vin": clean(row.get("VIN")), - "engine_number": clean(row.get("Engine Number")), - "fuel_per_100": clean(row.get("Fuel/100km")), - "remarks": clean(row.get("Remarks")), + "device_name": clean(row.get("device_name")), + "vehicle_name": clean(row.get("vehicle_name")), + "vehicle_icon": clean(row.get("vehicle_icon")), + "license_plate": clean(row.get("vehicle_number")), + "vehicle_model": clean(row.get("vehicle_models")), + "driver_name": clean(row.get("driver_name")), + "driver_phone": clean(row.get("driver_phone")), + "sim": clean(row.get("sim")), + "vin": clean(row.get("vin")), + "engine_number": clean(row.get("engine_number")), + "fuel_per_100": clean(row.get("fuel_100km")), + "remarks": clean(row.get("remarks")), } @@ -263,14 +263,14 @@ def main(): log.error("CSV file not found: %s", csv_file) sys.exit(1) - df = pd.read_csv(csv_file, dtype={"IMEI": str}) + df = pd.read_csv(csv_file, dtype={"imei": str}) log.info("Loaded %d rows from %s", len(df), csv_file) if args.limit: df = df.head(args.limit) log.info("Limiting to first %d rows.", args.limit) - df = df[df["IMEI"].notna() & (df["IMEI"].str.strip() != "")] + df = df[df["imei"].notna() & (df["imei"].str.strip() != "")] log.info("%d rows have a valid IMEI.", len(df)) if df.empty: @@ -295,7 +295,7 @@ def main(): skipped = 0 for idx, row in df.iterrows(): - imei = str(row["IMEI"]).strip() + imei = str(row["imei"]).strip() fields = row_to_fields(row) # Skip rows where every updatable field is empty