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

1from __future__ import annotations 

2 

3from Economics.costing.models import COST_CURVE_DEFINITION_FIELDS, CostCurve, CostCurveTemplate 

4 

5 

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 

13 

14 definition["curve_key"] = _available_template_key(owner=owner, preferred=curve.curve_key) 

15 return CostCurveTemplate.objects.create(owner=owner, **definition) 

16 

17 

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