Coverage for backend/django/Economics/results/services/comparison/payloads.py: 100%
32 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"""Assemble Economics study comparison response payloads."""
3from __future__ import annotations
5from authentication.user.models import User
6from Economics.studies.models import EconomicsStudy
8from .charts import comparison_chart_datasets
9from .config import baseline_mode, baseline_study_id, comparison_config, config_payload
10from .contracts import ComparisonPayload, ComparisonStudyPayload, ComparisonTarget, ResultContext
11from .metrics import comparison_rows
12from .recalculation import comparison_contexts_with_ephemeral_baseline
13from .resources import resource_comparison_rows
14from .results import result_context
15from .targets import comparison_targets
18def saved_comparison_payload(*, active_study: EconomicsStudy, user: User) -> ComparisonPayload:
19 """Return the saved comparison configuration and evaluated metric rows."""
20 config = comparison_config(active_study)
21 selection_rows = list(config.selections.all()) if config is not None else []
22 baseline_id = baseline_study_id(active_study=active_study, config=config)
23 selected_baseline_mode = baseline_mode(config=config)
24 studies = comparison_targets(active_study=active_study, selections=selection_rows, user=user)
25 result_contexts = {
26 study.study_id: (
27 result_context(study=study.study, user=user)
28 if study.study is not None and study.study_id is not None
29 else None
30 )
31 for study in studies
32 }
33 recalculation = comparison_contexts_with_ephemeral_baseline(
34 active_study=active_study,
35 studies=studies,
36 baseline_mode=selected_baseline_mode,
37 baseline_id=baseline_id,
38 result_contexts=result_contexts,
39 )
40 recalculated_contexts = recalculation.contexts
41 baseline_context = recalculated_contexts.get(baseline_id)
42 return ComparisonPayload(
43 active_study_id=active_study.pk,
44 baseline_mode=selected_baseline_mode,
45 baseline_study_id=baseline_id,
46 config=config_payload(
47 active_study=active_study,
48 config=config,
49 selections=selection_rows,
50 ),
51 studies=[
52 _study_payload(target=target, context=result_contexts.get(target.study_id))
53 for target in studies
54 ],
55 rows=comparison_rows(
56 studies=studies,
57 baseline_mode=selected_baseline_mode,
58 baseline_id=baseline_id,
59 baseline_context=baseline_context,
60 result_contexts=recalculated_contexts,
61 ),
62 resource_rows=resource_comparison_rows(
63 studies=studies,
64 baseline_mode=selected_baseline_mode,
65 baseline_id=baseline_id,
66 baseline_context=baseline_context,
67 result_contexts=recalculated_contexts,
68 ),
69 chart_datasets=comparison_chart_datasets(
70 studies=studies,
71 result_contexts=recalculated_contexts,
72 ),
73 warnings=recalculation.warnings,
74 )
77def _study_payload(*, target: ComparisonTarget, context: ResultContext | None) -> ComparisonStudyPayload:
78 run = context.run if context is not None else None
79 result_status = "missing_result"
80 result_currency = ""
81 if target.availability_status == "unavailable":
82 result_status = "unavailable"
83 elif run is not None:
84 result_status = context.classification or run.status
85 result_currency = run.result_currency
86 return ComparisonStudyPayload(
87 id=target.study_id,
88 name=target.name,
89 flowsheet_id=target.flowsheet_id,
90 flowsheet_name=target.flowsheet_name,
91 result_run_id=run.pk if run is not None else None,
92 result_status=result_status,
93 result_currency=result_currency,
94 availability_status=target.availability_status,
95 )