Add reports for temperature readings

This commit is contained in:
Pavol Gazda 2023-01-03 00:27:15 +01:00 committed by Christopher Charbonneau Wells
parent c5a56aaabd
commit 2519dad74c
7 changed files with 87 additions and 0 deletions

View File

@ -9,5 +9,6 @@ from .height_change import height_change # NOQA
from .pumping_amounts import pumping_amounts # NOQA
from .sleep_pattern import sleep_pattern # NOQA
from .sleep_totals import sleep_totals # NOQA
from .temperature_change import temperature_change # NOQA
from .tummytime_duration import tummytime_duration # NOQA
from .weight_change import weight_change # NOQA

View File

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
from django.utils.translation import gettext as _
import plotly.offline as plotly
import plotly.graph_objs as go
from reports import utils
def temperature_change(objects):
"""
Create a graph showing temperature over time.
:param objects: a QuerySet of Temperature instances.
:returns: a tuple of the graph's html and javascript.
"""
objects = objects.order_by("-time")
trace = go.Scatter(
name=_("Temperature"),
x=list(objects.values_list("time", flat=True)),
y=list(objects.values_list("temperature", flat=True)),
fill="tozeroy",
)
layout_args = utils.default_graph_layout_options()
layout_args["barmode"] = "stack"
layout_args["title"] = _("<b>Temperature</b>")
layout_args["xaxis"]["title"] = _("Time")
layout_args["xaxis"]["rangeselector"] = utils.rangeselector_time()
layout_args["yaxis"]["title"] = _("Temperature")
fig = go.Figure({"data": [trace], "layout": go.Layout(**layout_args)})
output = plotly.plot(fig, output_type="div", include_plotlyjs=False)
return utils.split_graph_output(output)

View File

@ -27,6 +27,7 @@
<a href="{% url 'reports:report-pumping-amounts-child' object.slug %}" class="list-group-item list-group-item-action">{% trans "Pumping Amounts" %}</a>
<a href="{% url 'reports:report-sleep-pattern-child' object.slug %}" class="list-group-item list-group-item-action">{% trans "Sleep Pattern" %}</a>
<a href="{% url 'reports:report-sleep-totals-child' object.slug %}" class="list-group-item list-group-item-action">{% trans "Sleep Totals" %}</a>
<a href="{% url 'reports:report-temperature-change-child' object.slug %}" class="list-group-item list-group-item-action">{% trans "Temperature" %}</a>
<a href="{% url 'reports:report-tummy-time-duration-child' object.slug %}" class="list-group-item list-group-item-action">{% trans "Tummy Time Durations (Sum)" %}</a>
<a href="{% url 'reports:report-weight-change-child' object.slug %}" class="list-group-item list-group-item-action">{% trans "Weight" %}</a>
</div>

View File

@ -0,0 +1,10 @@
{% extends 'reports/report_base.html' %}
{% load i18n %}
{% block title %}{% trans "Temperature" %} - {{ object }}{% endblock %}
{% block breadcrumbs %}
{{ block.super }}
{% include 'reports/breadcrumb_common_chunk.html' with target_url='reports:report-temperature-change-child' %}
<li class="breadcrumb-item active" aria-current="page">{% trans "Temperature" %}</li>
{% endblock %}

View File

@ -66,6 +66,11 @@ urlpatterns = [
views.SleepTotalsChildReport.as_view(),
name="report-sleep-totals-child",
),
path(
"children/<str:slug>/reports/temperature/temperature/",
views.TemperatureChangeChildReport.as_view(),
name="report-temperature-change-child",
),
path(
"children/<str:slug>/reports/tummy-time/duration/",
views.TummyTimeDurationChildReport.as_view(),

View File

@ -50,6 +50,24 @@ def rangeselector_date():
}
def rangeselector_time():
"""
Graph time range selectors settings for 12h, 24h, 48h, 3d and all.
:returns: a dict of settings for the selectors.
"""
return {
"bgcolor": "rgb(35, 149, 86)",
"activecolor": "rgb(25, 108, 62)",
"buttons": [
{"count": 12, "label": "12h", "step": "hour", "stepmode": "backward"},
{"count": 24, "label": "24h", "step": "hour", "stepmode": "backward"},
{"count": 48, "label": "48h", "step": "hour", "stepmode": "backward"},
{"count": 3, "label": "3d", "step": "day", "stepmode": "backward"},
{"count": 7, "label": "7d", "step": "day", "stepmode": "backward"},
{"step": "all"},
],
}
def split_graph_output(output):
"""
Split out of a Plotly graph in to html and javascript.

View File

@ -242,6 +242,24 @@ class SleepTotalsChildReport(PermissionRequiredMixin, DetailView):
return context
class TemperatureChangeChildReport(PermissionRequiredMixin, DetailView):
"""
Graph of temperature change over time.
"""
model = models.Child
permission_required = ("core.view_child",)
template_name = "reports/temperature_change.html"
def get_context_data(self, **kwargs):
context = super(TemperatureChangeChildReport, self).get_context_data(**kwargs)
child = context["object"]
objects = models.Temperature.objects.filter(child=child)
if objects:
context["html"], context["js"] = graphs.temperature_change(objects)
return context
class TummyTimeDurationChildReport(PermissionRequiredMixin, DetailView):
"""
Graph of tummy time durations over time.