Source code for comparison
import json
import itertools
from flask import (
g,
render_template,
redirect,
request,
session,
)
import sqlalchemy as sql
from app.model.orm import MeasurementContext
from app.view.forms.comparative_chart_form import ComparativeChartForm
[docs]
def comparison_show_page():
compare_data = _init_compare_data()
measurement_contexts = g.db_session.scalars(
sql.select(MeasurementContext)
.where(MeasurementContext.id.in_(compare_data['contexts']))
).all()
measurement_contexts_by_study = {
s: list(mcs)
for (s, mcs)
in itertools.groupby(measurement_contexts, lambda mc: mc.study)
}
# TODO (2025-05-18) Convert time units between studies
chart_form = ComparativeChartForm(g.db_session, 'h')
return render_template(
"pages/comparison/show.html",
measurement_contexts_by_study=measurement_contexts_by_study,
chart_form=chart_form,
)
[docs]
def comparison_update_json(action):
compare_data = _init_compare_data()
contexts = request.json['contexts']
context_set = set(compare_data['contexts'])
for context in contexts:
if action == 'add':
context_set.add(context)
elif action == 'remove':
context_set.discard(context)
else:
raise ValueError(f"Unexpected action: {action}")
compare_data['contexts'] = list(context_set)
session['compareData'] = compare_data
return json.dumps({'contextCount': len(compare_data['contexts'])})
[docs]
def comparison_clear_action():
if 'compareData' in session:
del session['compareData']
return redirect(request.referrer)
[docs]
def comparison_chart_fragment():
args = request.form.to_dict()
width = request.args.get('width', None)
# TODO (2025-05-18) Convert time units between studies
chart_form = ComparativeChartForm(g.db_session, time_units='h')
chart = chart_form.build_chart(args, width, legend_position='top', clamp_x_data=True)
return render_template(
'pages/comparison/_chart.html',
chart_form=chart_form,
chart=chart,
)
[docs]
def _init_compare_data():
data = session.get('compareData', {})
if 'contexts' not in data:
data['contexts'] = []
return data