Coverage for backend/django/Economics/costing/cost_curves/library.py: 79%
18 statements
« prev ^ index » next coverage.py v7.10.7, created at 2026-07-22 05:22 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2026-07-22 05:22 +0000
1from __future__ import annotations
3from Economics.costing.models import COST_CURVE_DEFINITION_FIELDS, CostCurve, CostCurveTemplate
6def save_private_template_from_curve(*, curve: CostCurve, owner) -> CostCurveTemplate:
7 """Save one private reusable snapshot without coupling later project edits to it."""
8 definition = {field: getattr(curve, field) for field in COST_CURVE_DEFINITION_FIELDS}
9 comparison_fields = tuple(field for field in COST_CURVE_DEFINITION_FIELDS if field != "curve_key")
10 for template in CostCurveTemplate._base_manager.filter(owner=owner):
11 if all(getattr(template, field) == definition[field] for field in comparison_fields): 11 ↛ 10line 11 didn't jump to line 10 because the condition on line 11 was always true
12 return template
14 definition["curve_key"] = _available_template_key(owner=owner, preferred=curve.curve_key)
15 return CostCurveTemplate.objects.create(owner=owner, **definition)
18def _available_template_key(*, owner, preferred: str) -> str:
19 """Keep project keys where possible while resolving private-library collisions."""
20 candidate = preferred
21 suffix = 2
22 while CostCurveTemplate._base_manager.filter(owner=owner, curve_key=candidate).exists(): 22 ↛ 23line 22 didn't jump to line 23 because the condition on line 22 was never true
23 marker = f"_{suffix}"
24 candidate = f"{preferred[:128 - len(marker)]}{marker}"
25 suffix += 1
26 return candidate