Skip to content

Commit 09f0514

Browse files
committed
Merge branch 'bugfix/API_refinement' into 'master'
REST API refinement See merge request caimira/caimira!508
2 parents eef7bd4 + bbd1ae0 commit 09f0514

11 files changed

Lines changed: 50 additions & 43 deletions

File tree

.gitlab-ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ test-cern-caimira-py39:
8787
- ./app-config/openshift/${CAIMIRA_INSTANCE}/expected
8888
only:
8989
- master
90+
- live/caimira-test
9091

9192
check_openshift_config_test:
9293
extends: .test_openshift_config

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# 4.17.2 (September 19, 2024)
2+
3+
## Features Added
4+
- Initial commit with changelog file.
5+
- New project layout architecture.
6+
- Added CAiMIRA REST API features.
7+
8+
## Bug Fixes
9+
- Virus and CO2 routes and controllers.

caimira/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "caimira"
7-
version = "4.17.0a2"
7+
version = "4.17.2"
88
description = "CAiMIRA - CERN Airborne Model for Indoor Risk Assessment"
99
license = { text = "Apache-2.0" }
1010
authors = [
Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,27 @@
1+
import typing
2+
13
from caimira.calculator.validators.co2.co2_validator import CO2FormData
24
from caimira.calculator.store.data_registry import DataRegistry
5+
from caimira.calculator.models.models import CO2DataModel
36

47

5-
def generate_form_obj(form_data, data_registry):
8+
def generate_form_obj(form_data: typing.Dict, data_registry: DataRegistry) -> CO2FormData:
69
return CO2FormData.from_dict(form_data=form_data, data_registry=data_registry)
710

811

9-
def generate_model(form_obj, data_registry):
10-
sample_size = data_registry.monte_carlo['sample_size']
11-
return form_obj.build_model(sample_size=sample_size)
12+
def generate_model(form_obj: CO2FormData) -> CO2DataModel:
13+
return form_obj.build_model()
1214

1315

14-
def generate_report(model):
16+
def generate_report(model: CO2DataModel) -> typing.Dict:
1517
return dict(model.CO2_fit_params())
1618

1719

18-
def submit_CO2_form(form_data):
19-
data_registry = DataRegistry()
20+
def submit_CO2_form(form_data: typing.Dict) -> typing.Dict:
21+
data_registry: DataRegistry = DataRegistry()
2022

21-
form_obj = generate_form_obj(
22-
form_data=form_data, data_registry=data_registry)
23-
model = generate_model(form_obj=form_obj, data_registry=data_registry)
24-
report_data = generate_report(model=model)
23+
form_obj: CO2FormData = generate_form_obj(form_data=form_data, data_registry=data_registry)
24+
model: CO2DataModel = generate_model(form_obj=form_obj)
25+
report_data: typing.Dict = generate_report(model=model)
2526

2627
return report_data
Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,37 @@
11
import concurrent.futures
22
import functools
3+
import typing
34

45
from caimira.calculator.validators.virus.virus_validator import VirusFormData
56
from caimira.calculator.store.data_registry import DataRegistry
7+
from caimira.calculator.models.models import ExposureModel
68
import caimira.calculator.report.virus_report_data as rg
79

810

9-
def generate_form_obj(form_data, data_registry):
11+
def generate_form_obj(form_data: typing.Dict, data_registry: DataRegistry) -> VirusFormData:
1012
return VirusFormData.from_dict(
1113
form_data=form_data,
1214
data_registry=data_registry,
1315
)
1416

1517

16-
def generate_model(form_obj, data_registry):
17-
sample_size = data_registry.monte_carlo['sample_size']
18-
return form_obj.build_model(sample_size=sample_size)
19-
20-
21-
def generate_report_results(form_obj):
18+
def generate_report(form_obj: VirusFormData, report_generation_parallelism: typing.Optional[int]) -> typing.Dict:
2219
return rg.calculate_report_data(
2320
form=form_obj,
2421
executor_factory=functools.partial(
25-
concurrent.futures.ThreadPoolExecutor, None, # TODO define report_parallelism
22+
concurrent.futures.ThreadPoolExecutor,
23+
report_generation_parallelism,
2624
),
2725
)
2826

2927

30-
def submit_virus_form(form_data):
31-
data_registry = DataRegistry
28+
def submit_virus_form(form_data: typing.Dict, report_generation_parallelism: typing.Optional[int]) -> typing.Dict:
29+
data_registry: DataRegistry = DataRegistry()
30+
31+
form_obj: VirusFormData = generate_form_obj(form_data=form_data, data_registry=data_registry)
32+
report_data: typing.Dict = generate_report(form_obj=form_obj, report_generation_parallelism=report_generation_parallelism)
3233

33-
form_obj = generate_form_obj(form_data=form_data, data_registry=data_registry)
34-
model = generate_model(form_obj=form_obj, data_registry=data_registry)
35-
report_data = generate_report_results(form_obj=form_obj, model=model)
34+
# Handle model representation
35+
if report_data['model']: report_data['model'] = repr(report_data['model'])
3636

3737
return report_data

caimira/src/caimira/api/routes/report_routes.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from caimira.api.controller.co2_report_controller import submit_CO2_form
88

99

10-
class BaseReportHandler(tornado.web.RedirectHandler):
10+
class BaseReportHandler(tornado.web.RequestHandler):
1111
def set_default_headers(self):
1212
self.set_header("Access-Control-Allow-Origin", "*")
1313
self.set_header("Access-Control-Allow-Headers", "x-requested-with")
@@ -22,7 +22,14 @@ class VirusReportHandler(BaseReportHandler):
2222
def post(self):
2323
try:
2424
form_data = json.loads(self.request.body)
25-
report_data = submit_virus_form(form_data)
25+
arguments = self.request.arguments
26+
# Report generation parallelism argument
27+
try:
28+
report_generation_parallelism = int(arguments['report_generation_parallelism'][0])
29+
except (ValueError, IndexError, KeyError):
30+
report_generation_parallelism = None
31+
32+
report_data = submit_virus_form(form_data, report_generation_parallelism)
2633

2734
response_data = {
2835
"status": "success",
@@ -36,12 +43,7 @@ def post(self):
3643
self.write_error(status_code=400, exc_info=sys.exc_info())
3744

3845

39-
class CO2ReportHandler(tornado.web.RequestHandler):
40-
def set_default_headers(self):
41-
self.set_header("Access-Control-Allow-Origin", "*")
42-
self.set_header("Access-Control-Allow-Headers", "x-requested-with")
43-
self.set_header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
44-
46+
class CO2ReportHandler(BaseReportHandler):
4547
def post(self):
4648
try:
4749
form_data = json.loads(self.request.body)

caimira/src/caimira/calculator/models/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -807,7 +807,7 @@ class SimplePopulation:
807807
number: typing.Union[int, IntPiecewiseConstant]
808808

809809
#: The times in which the people are in the room.
810-
presence: typing.Union[None, Interval]
810+
presence: typing.Optional[Interval]
811811

812812
#: The physical activity being carried out by the people.
813813
activity: Activity

caimira/src/caimira/calculator/validators/co2/co2_validator.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,7 @@ def ventilation_transition_times(self) -> typing.Tuple[float]:
193193
vent_states.append(last_time_from_input)
194194
return tuple(vent_states)
195195

196-
def build_model(self, size=None) -> models.CO2DataModel: # type: ignore
197-
size = size or self.data_registry.monte_carlo['sample_size']
196+
def build_model(self, sample_size = None) -> models.CO2DataModel:
198197
# Build a simple infected and exposed population for the case when presence
199198
# intervals and number of people are dynamic. Activity type is not needed.
200199
if self.occupancy_format == 'dynamic':

caimira/src/caimira/calculator/validators/form_validator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ def get_activity_mins(population):
206206
def validate(self):
207207
raise NotImplementedError("Subclass must implement")
208208

209-
def build_model(self, sample_size=None):
209+
def build_model(self, sample_size: typing.Optional[int] = None):
210210
raise NotImplementedError("Subclass must implement")
211211

212212
def _compute_breaks_in_interval(self, start, finish, n_breaks, duration) -> models.BoundarySequence_t:

cern_caimira/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "cern-caimira"
7-
version = "4.17.1a1"
7+
version = "4.17.2"
88
description = "CAiMIRA - CERN Airborne Model for Indoor Risk Assessment"
99
license = { text = "Apache-2.0" }
1010
authors = [

0 commit comments

Comments
 (0)