From 97af63cbf9c3f005b0a9691e5dca77669e7f00b4 Mon Sep 17 00:00:00 2001 From: LemonNexus Date: Mon, 9 Feb 2026 20:20:58 +0000 Subject: [PATCH] fix: add safe decimal conversion to AttachmentConfig.from_dict and better error logging - AttachmentConfig.from_dict now uses safe_decimal() for all decimal fields - Added traceback logging to _load_saved_loadouts to see exact error location - Handles int/float/Decimal/string values for all numeric fields --- ui/loadout_manager.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/ui/loadout_manager.py b/ui/loadout_manager.py index ba5ea56..33a5e7d 100644 --- a/ui/loadout_manager.py +++ b/ui/loadout_manager.py @@ -75,15 +75,25 @@ class AttachmentConfig: @classmethod def from_dict(cls, data: dict) -> "AttachmentConfig": + """Create from dictionary with safe decimal conversion.""" + def safe_decimal(val): + if isinstance(val, Decimal): + return val + if isinstance(val, (int, float)): + return Decimal(str(val)) + if isinstance(val, str): + return Decimal(val) if val else Decimal('0') + return Decimal('0') + return cls( name=data['name'], item_id=data['item_id'], attachment_type=data['attachment_type'], - decay_pec=Decimal(data['decay_pec']), - damage_bonus=Decimal(data.get('damage_bonus', '0')), - range_bonus=Decimal(data.get('range_bonus', '0')), - efficiency_bonus=Decimal(data.get('efficiency_bonus', '0')), - protection_bonus={k: Decimal(v) for k, v in data.get('protection_bonus', {}).items()}, + decay_pec=safe_decimal(data.get('decay_pec', '0')), + damage_bonus=safe_decimal(data.get('damage_bonus', '0')), + range_bonus=safe_decimal(data.get('range_bonus', '0')), + efficiency_bonus=safe_decimal(data.get('efficiency_bonus', '0')), + protection_bonus={k: safe_decimal(v) for k, v in data.get('protection_bonus', {}).items()}, ) @@ -2371,7 +2381,9 @@ class LoadoutManagerDialog(QDialog): item.setToolTip(tooltip) self.saved_list.addItem(item) except Exception as e: + import traceback logger.error(f"Failed to load {filepath}: {e}") + logger.error(traceback.format_exc()) continue except Exception as e: logger.error(f"Failed to list loadouts: {e}")