Updated report display

This commit is contained in:
gaazzopa 2020-11-05 21:22:03 +01:00 committed by Phil Elson
parent 584a944452
commit f19d76589c
3 changed files with 67 additions and 106 deletions

View file

@ -2,84 +2,28 @@ from datetime import datetime
from pathlib import Path
import jinja2
import numpy as np
from cara import models
from .model_generator import FormData
def calculate_report_data(model: models.Model):
resolution = 600
times = list(np.linspace(0, 10, resolution))
concentrations = [model.concentration(time) for time in times]
highest_const = max(concentrations)
prob = model.infection_probability()
er = model.infected.emission_rate(0.1)
exposed_occupants = model.exposed_occupants
r0 = prob * exposed_occupants / 100
return {
"times": times,
"concentrations": concentrations,
"highest_const": highest_const,
"prob_inf": prob,
"emission_rate": er,
"exposed_occupants": exposed_occupants,
"R0": r0,
}
def build_report(model: models.Model, form: FormData):
now = datetime.now()
time = now.strftime("%d/%m/%Y %H:%M:%S")
request = {"the": "form", "request": "data"}
time = now.strftime('%d/%m/%Y %H:%M:%S')
request = {'the': 'form', 'request': 'data'}
context = {'model': model, 'request': request, 'creation_date': time, 'model_version': 'Beta v1.0.0',
'simulation_name': 'SAMPLE', 'room_number': '40/1-02A', 'room_volume': 30, 'ventilation_type': 'natural_ventilation',
'air_supply': 1, 'air_changes': 2, 'windows_number': 5, 'window_height': 2, 'window_width': 1,
'opening_distance': 0.05, 'windows_open': '20 minutes every 2 hours', 'hepa_option': 'No', 'total_people': 8,
'infected_people': 7, 'activity_type': 'Office work typical scenario with all persons seated, talking',
'activity_start': '00:00', 'activity_finish': '01:15', 'exposure_start': '00:00', 'exposure_finish': '01:15',
'event_type' : 'single_event', 'single_event_date': '5th November', 'recurrent_event_month': 'November',
'lunch_option': 'No', 'lunch_start': '00:00', 'lunch_finish': '01:15', 'coffee_breaks': 4,'coffee_duration': 15,
'coffee_times': [['00:00','00:00'], ['00:00','00:00'], ['00:00','00:00'], ['00:00','00:00']], 'mask_wearing': 'No',
'infection_probability': round(model.infection_probability(), 2), 'reproduction_rate': 2}
context = {
"model": model,
"form": form,
"creation_date": time,
"model_version": "Beta v1.0.0",
"simulation_name": "SAMPLE",
"room_number": "40/1-02A",
"room_volume": 30,
"mechanical_ventilation": "Yes",
"air_supply": 1,
"air_changes": 2,
"windows_number": 5,
"window_height": 2,
"window_width": 1,
"opening_distance": 0.05,
"windows_open": "20 minutes every 2 hours",
"hepa_filtration": "No",
"total_people": 8,
"infected_people": 7,
"activity_type": "Office work typical scenario with all persons seated, talking",
"activity_start": "00:00",
"activity_finish": "01:15",
"exposure_start": "00:00",
"exposure_finish": "01:15",
"single_event_date": "5th November",
"lunch_option": "Yes",
"lunch_start": "00:00",
"lunch_finish": "01:15",
"coffee_option": "Yes",
"coffee_number": 4,
"coffee_duration": 15,
"coffee_start1": "00:00",
"coffee_finish1": "00:00",
"coffee_start2": "00:00",
"coffee_finish2": "00:00",
"coffee_start3": "00:00",
"coffee_finish3": "00:00",
"coffee_start4": "00:00",
"coffee_finish4": "00:00",
"mask_wearing": "Yes",
"infection_probability": round(model.infection_probability(), 2),
"reproduction_rate": 2,
}
context.update(calculate_report_data(model))
p = Path(__file__).parent / "templates"
env = jinja2.Environment(loader=jinja2.FileSystemLoader(Path(p)))
template = env.get_template("report.html.j2")
return template.render(**context)
p = Path(__file__).parent / 'templates'
env = jinja2.Environment(
loader=jinja2.FileSystemLoader(Path(p)))
template = env.get_template('report.html.j2')
return template.render(**context)

View file

@ -6,13 +6,6 @@
padding: 20px;
}
.image {
display: flex;
align-items: center;
justify-content: center;
font-size: 13pt;
}
h1{
text-align: center;
}
@ -41,3 +34,15 @@ p.result_title {
font-weight: bold;
font-size: 15pt;
}
.image {
display: flex;
justify-content: center;
font-size: 13pt;
}
.discalimer {
display: flex;
justify-content: center;
font-size: 10pt;
}

View file

@ -9,9 +9,6 @@
<body id="body">
<p class=image> <img src="/calculator/static/images/disclaimer.jpg" width="40" height="40">
VERY IMPORTANT DISCLAIMER</p>
<h1>Output from CARA - COVID Airborne Risk Assessment tool</h1>
<p class=subtitle> Created {{ creation_date }} using model version {{ model_version }}</p><br>
@ -26,15 +23,19 @@
<p class="data_title">Ventilation data:</p>
<ul>
<li><p class="data_text">Mechanical ventilation: {{ mechanical_ventilation }}</p></li>
<!--If mechanical ventialtion is yes {-->
<li><p class="data_text">Mechanical ventilation:
{% if ventilation_type == "mechanical_ventilation"%}
Yes </p></li>
<ul>
<li><p class="data_subtext">Air supply flow rate: {{ air_supply }}</p></li>
<li><p class="data_subtext">Air changes per hour: {{ air_changes }}</p></li>
</ul>
<!--}-->
<li><p class="data_text">Natural ventilation: No</li>
<!--If natural ventialtion is yes {
{% else %}
No </li>
{% endif %}
<li><p class="data_text">Natural ventilation:
{% if ventilation_type == "natural_ventilation"%}
Yes </p></li>
<ul>
<li><p class="data_subtext">Number of windows: {{ windows_number }}</p></li>
<li><p class="data_subtext">Height of window: {{ window_height }}</p></li>
@ -42,11 +43,11 @@
<li><p class="data_subtext">Opening distance: {{ opening_distance }}</p></li>
<li><p class="data_subtext">Windows open: {{ windows_open }}</p></li>
</ul>
}-->
<li><p class="data_text">HEPA Filtration: {{ hepa_filtration }}</li>
<!--If HEPA filtration is yes {
X type of filter with y flow rate (default model assumption) ?
}-->
{% else %}
No </p></li>
{% endif %}
<li><p class="data_text">HEPA Filtration: {{ hepa_option }}</li>
<!--TODO: X type of filter with y flow rate (default model assumption) ? This was in the output doc..? -->
</ul>
<p class="data_title">Event data:</p>
@ -54,29 +55,41 @@
<li><p class="data_text">Number of attendees and infected people: {{ total_people }} in attendance, of whom {{ infected_people }} are infected.</p></li>
<li><p class="data_text">Activity type: {{ activity_type }}</p></li>
<ul>
<li><p class="data_subtext">Start time: {{ activity_start }} End time: {{ activity_finish }}</p></li>
<li><p class="data_subtext">Start time: {{ activity_start }} &nbsp&nbsp End time: {{ activity_finish }}</p></li>
</ul>
<li><p class="data_text">Exposure time (presence of infected person):</p></li>
<ul>
<li><p class="data_subtext">Start time: {{ exposure_start }} End time: {{ exposure_finish }}</p></li>
<li><p class="data_subtext">Start time: {{ exposure_start }} &nbsp&nbsp End time: {{ exposure_finish }}</p></li>
</ul>
{% if event_type == "single_event"%}
<li><p class="data_text">Single event on {{ single_event_date }}</p></li>
{% endif %}
{% if event_type == "recurrent_event"%}
<li><p class="data_text">Recurrent event for the month of {{ recurrent_event_month }}</p></li>
{% endif %}
</ul>
<p class="data_title">Break data:</p>
<ul>
<li><p class="data_text">Lunchbreak: {{ lunch_option }} Start: {{ lunch_start }} End: {{ lunch_end }}</p></li>
<li><p class="data_text">Coffee breaks: {{ coffee_option }} Number: {{ coffee_number }} Duration: {{ coffee_duration }}</p></li>
<li><p class="data_text">Lunch break: {{ lunch_option }}</li>
{% if lunch_option == "Yes" %}
<ul>
<li><p class="data_subtext">Coffee break 1: Start: {{ coffee_start1 }} End: {{ coffee_finish1 }}</p></li>
<li><p class="data_subtext">Coffee break 2: Start: {{ coffee_start2 }} End: {{ coffee_finish2 }}</p></li>
<li><p class="data_subtext">Coffee break 3: Start: {{ coffee_start3 }} End: {{ coffee_finish3 }}</p></li>
<li><p class="data_subtext">Coffee break 4: Start: {{ coffee_start4 }} End: {{ coffee_finish4 }}</p></li>
<li> Start: {{ lunch_start }} &nbsp&nbsp End: {{ lunch_finish }}</p></li>
</ul>
{% endif %}
<li><p class="data_text">Coffee breaks: {{ coffee_breaks }}
{% if coffee_breaks > 0 %}
each of {{ coffee_duration }} minutes duration
</p></li>
<ul>
{%- for coffee in coffee_times %}
<li><p class="data_subtext">Coffee break {{ loop.index }}: Start: {{ coffee[0] }} &nbsp&nbsp End: {{ coffee[1] }}</p></li>
{%- endfor %}
</ul>
{% endif %}
</ul>
<!--or Recurrent for months of X, Y and Z…-->
<p class="data_title">Mask wearing:</p>
<ul>
<li><p class="data_text">Masks worn at workstations? {{ mask_wearing }}</p></li>
@ -84,8 +97,7 @@
</ul>
<p class="result_title">Results:</p>
<p class="data_text"> In this scenario, the estimated probability of one exposed occupant getting infected (Pi) is {{ infection_probability }} % and the estimated basic reproduction rate (R0) rate is {{ reproduction_rate }}. If you have selected a recurrent event, this is the probability per day, and is cumulative over the number of days.<p>
<p class="data_title">Exposure graph:
<p class="data_text"> In this scenario, the estimated probability of one exposed occupant getting infected P(i) is {{ infection_probability }} % and the estimated basic reproduction rate (R0) rate is {{ reproduction_rate }}. This probability estimate is per simulated time period, i.e. if you have simulated a working day, which will be repeated n times per week, the cumulative probability of infection per person is n x P(i).<p>
<p class="data_title">Exposure graph:</p>
</body>
</html>