diff --git a/cara/apps/calculator/model_generator.py b/cara/apps/calculator/model_generator.py index e50cc67f..64b28fa0 100644 --- a/cara/apps/calculator/model_generator.py +++ b/cara/apps/calculator/model_generator.py @@ -44,13 +44,15 @@ class FormData: ventilation_type: str volume_type: str window_height: float + window_type: str + window_width: float windows_number: int windows_open: str @classmethod def from_dict(cls, form_data: typing.Dict) -> "FormData": - valid_na_values = ['windows_open', 'mechanical_ventilation_type'] + valid_na_values = ['windows_open', 'window_type', 'mechanical_ventilation_type'] for name in valid_na_values: if not form_data.get(name, ''): form_data[name] = 'not-applicable' @@ -66,7 +68,8 @@ class FormData: ('mask_wearing', MASK_WEARING), ('ventilation_type', VENTILATION_TYPES), ('volume_type', VOLUME_TYPES), - ('windows_open', WINDOWS_OPEN)] + ('windows_open', WINDOWS_OPEN), + ('window_type', WINDOWS_TYPES)] for key, valid_set in validation_tuples: if key not in form_data: raise ValueError(f"Missing key {key}") @@ -114,6 +117,8 @@ class FormData: ventilation_type=form_data['ventilation_type'], volume_type=form_data['volume_type'], window_height=float(form_data['window_height']), + window_type=form_data['window_type'], + window_width=float(form_data['window_width']), windows_number=int(form_data['windows_number']), windows_open=form_data['windows_open'], infected_start=time_string_to_minutes(form_data['infected_start']), @@ -414,6 +419,8 @@ def baseline_raw_form_data(): 'ventilation_type': 'natural', 'volume_type': 'room_volume', 'window_height': '2', + 'window_type': 'hinged', + 'window_width': '2', 'windows_number': '1', 'windows_open': 'interval' } @@ -427,6 +434,7 @@ MASK_WEARING = {'continuous', 'removed'} VENTILATION_TYPES = {'natural', 'mechanical', 'no-ventilation'} VOLUME_TYPES = {'room_volume', 'room_dimensions'} WINDOWS_OPEN = {'always', 'interval', 'breaks', 'not-applicable'} +WINDOWS_TYPES = {'sliding', 'hinged', 'not-applicable'} def time_string_to_minutes(time: str) -> int: diff --git a/cara/apps/calculator/static/js/form.js b/cara/apps/calculator/static/js/form.js index db3874a7..9764d71b 100644 --- a/cara/apps/calculator/static/js/form.js +++ b/cara/apps/calculator/static/js/form.js @@ -30,6 +30,12 @@ function require_fields(obj) { require_mechanical_ventilation(false); require_natural_ventilation(true); break; + case "window_sliding": + require_window_width(false); + break; + case "window_hinged": + require_window_width(true); + break; case "air_type_changes": require_air_changes(true); require_air_supply(false); @@ -107,10 +113,17 @@ function require_natural_ventilation(option) { require_input_field("#windows_number", option); require_input_field("#window_height", option); require_input_field("#opening_distance", option); + $("#window_sliding").prop('required', option); + $("#window_hinged").prop('required', option); $("#always").prop('required', option); $("#interval").prop('required', option); } +function require_window_width(option) { + require_input_field("#window_width", option); + disable_input_field("#window_width", option); +} + function require_air_changes(option) { require_input_field("#air_changes", option); disable_input_field("#air_changes", option); @@ -324,7 +337,7 @@ function validateValue(obj) { $(obj).removeClass("red_border"); $(obj).next('span').remove(); - if (!isNonZeroOrEmpty($(obj).val())) { + if (!isLessThanZeroOrEmpty($(obj).val())) { $(obj).addClass("red_border"); insertSpanAfter(obj, "Value must be > 0"); return false; @@ -332,9 +345,9 @@ function validateValue(obj) { return true; } -function isNonZeroOrEmpty(value) { +function isLessThanZeroOrEmpty(value) { if (value === "") return true; - if (value == 0) + if (value <= 0) return false; return true; } @@ -402,6 +415,7 @@ $(document).ready(function () { require_fields($("input[name='lunch_option']:checked")); require_fields($("input[name='volume_type']:checked")); require_fields($("input[name='mechanical_ventilation_type']:checked")); + require_fields($("input[name='window_type']:checked")); require_fields($("input[name='hepa_option']:checked")); // Setup the maximum number of people at page load (to handle back/forward), diff --git a/cara/apps/calculator/templates/calculator.form.html.j2 b/cara/apps/calculator/templates/calculator.form.html.j2 index 87e301fa..932fa712 100644 --- a/cara/apps/calculator/templates/calculator.form.html.j2 +++ b/cara/apps/calculator/templates/calculator.form.html.j2 @@ -79,6 +79,12 @@