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
« prev ^ index » next coverage.py v7.10.7, created at 2026-07-22 05:22 +0000
1"""API workflow helpers for study read endpoints."""
3from __future__ import annotations
5from rest_framework.exceptions import NotFound
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
14def full_study_instance(*, study: EconomicsStudy, user, queryset):
15 """Apply full-read cleanup side effects and return a refreshed study."""
17 if has_write_access(user):
18 delete_economics_lines_for_deleted_simulation_objects(study)
19 return queryset.get(pk=study.pk)
22def current_result_data(*, study: EconomicsStudy, user, serializer_context: dict) -> dict:
23 """Return the current result run payload for a study."""
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
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."""
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