Coverage for backend/django/Economics/studies/api_mutations.py: 66%

29 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2026-07-22 05:22 +0000

1from Economics.costing.capital.generated_lines import sync_generated_capital_lines 

2from Economics.studies.models import EconomicsStudy 

3from Economics.studies.services.result_staleness import mark_study_stale 

4 

5 

6class StudyMutationMixin: 

7 """Mark existing presentation runs stale after mutating study-owned rows.""" 

8 

9 stale_reason = "economics_api_saved" 

10 sync_generated_capital_lines = False 

11 

12 def _study_for_instance(self, instance) -> EconomicsStudy | None: 

13 return getattr(instance, "study", None) 

14 

15 def perform_create(self, serializer): 

16 instance = serializer.save() 

17 study = self._study_for_instance(instance) 

18 if study is not None: 18 ↛ exitline 18 didn't return from function 'perform_create' because the condition on line 18 was always true

19 if self.sync_generated_capital_lines: 19 ↛ 20line 19 didn't jump to line 20 because the condition on line 19 was never true

20 sync_generated_capital_lines(study) 

21 mark_study_stale(study, reason=self.stale_reason) 

22 

23 def perform_update(self, serializer): 

24 instance = serializer.save() 

25 study = self._study_for_instance(instance) 

26 if study is not None: 26 ↛ exitline 26 didn't return from function 'perform_update' because the condition on line 26 was always true

27 if self.sync_generated_capital_lines: 

28 sync_generated_capital_lines(study) 

29 mark_study_stale(study, reason=self.stale_reason) 

30 

31 def perform_destroy(self, instance): 

32 study = self._study_for_instance(instance) 

33 super().perform_destroy(instance) 

34 if study is not None: 

35 if self.sync_generated_capital_lines: 

36 sync_generated_capital_lines(study) 

37 mark_study_stale(study, reason=self.stale_reason)