Coverage for backend/django/Economics/studies/services/read_api.py: 86%

23 statements  

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

1"""API workflow helpers for study read endpoints.""" 

2 

3from __future__ import annotations 

4 

5from rest_framework.exceptions import NotFound 

6 

7from Economics.costing.costable_items.deleted_objects import delete_economics_lines_for_deleted_simulation_objects 

8from Economics.results.serializers import EconomicsChartDatasetSerializer, EconomicsResultRunSerializer 

9from Economics.shared.access import has_write_access 

10from Economics.studies.models import EconomicsStudy 

11from Economics.studies.services.baseline_access import require_readable_baseline_studies_for_user 

12 

13 

14def full_study_instance(*, study: EconomicsStudy, user, queryset): 

15 """Apply full-read cleanup side effects and return a refreshed study.""" 

16 

17 if has_write_access(user): 

18 delete_economics_lines_for_deleted_simulation_objects(study) 

19 return queryset.get(pk=study.pk) 

20 

21 

22def current_result_data(*, study: EconomicsStudy, user, serializer_context: dict) -> dict: 

23 """Return the current result run payload for a study.""" 

24 

25 require_readable_baseline_studies_for_user(study, user=user) 

26 run = study.result_runs.filter(status="current").order_by("-created_at", "-pk").first() 

27 if run is None: 27 ↛ 28line 27 didn't jump to line 28 because the condition on line 27 was never true

28 raise NotFound("No current economics result run exists for this study.") 

29 return EconomicsResultRunSerializer(run, context=serializer_context).data 

30 

31 

32def chart_datasets_data(*, study: EconomicsStudy, user, serializer_context: dict) -> list[dict]: 

33 """Return current chart datasets for a study, or an empty list when no current run exists.""" 

34 

35 require_readable_baseline_studies_for_user(study, user=user) 

36 run = study.result_runs.filter(status="current").order_by("-created_at", "-pk").first() 

37 if run is None: 37 ↛ 38line 37 didn't jump to line 38 because the condition on line 37 was never true

38 return [] 

39 return EconomicsChartDatasetSerializer( 

40 run.chart_datasets.order_by("chart_key"), 

41 many=True, 

42 context=serializer_context, 

43 ).data