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

1"""Assemble Economics study comparison response payloads.""" 

2 

3from __future__ import annotations 

4 

5from authentication.user.models import User 

6from Economics.studies.models import EconomicsStudy 

7 

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 

16 

17 

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 ) 

75 

76 

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 )