From 01e3bf8ca587b20d412e10ebd307b71fb1e5588e Mon Sep 17 00:00:00 2001 From: Luis Aleixo Date: Tue, 20 Sep 2022 14:48:46 +0200 Subject: [PATCH 1/3] Added UI validation for the total number of infected people --- caimira/apps/calculator/static/js/form.js | 35 +++++++++++++------ .../templates/base/calculator.form.html.j2 | 4 +-- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/caimira/apps/calculator/static/js/form.js b/caimira/apps/calculator/static/js/form.js index 5361a043..6c0525fa 100644 --- a/caimira/apps/calculator/static/js/form.js +++ b/caimira/apps/calculator/static/js/form.js @@ -195,16 +195,26 @@ function set_disabled_status(id, option) { $(id).removeClass("disabled"); } -function setMaxInfectedPeople() { - $("#training_limit_error").hide(); - var max = $("#total_people").val() +function validateMaxInfectedPeople() { + let infected_people = document.getElementById("infected_people"); + removeErrorFor(infected_people); + $(infected_people).removeClass("red_border"); + + let infected = infected_people.valueAsNumber; + let max = document.getElementById("total_people").valueAsNumber; - if ($("#activity_type").val() === "training") { - max = 1; - $("#training_limit_error").show(); + if ($("#activity_type").val() === "training" && infected > 1) { + insertErrorFor(infected_people, "Conference/Training activities limited to 1 infected person."); + $(infected_people).addClass("red_border"); + return false; + } + else if (infected >= max) { + insertErrorFor(infected_people, "Value is equal or higher than the total number of occupants."); + $(infected_people).addClass("red_border"); + return false; } - $("#infected_people").attr("max", max); + return true; } function removeInvalid(id) { @@ -497,6 +507,9 @@ function validate_form(form) { } } + //Validate number of infected people + if (!validateMaxInfectedPeople()) submit = false; + //Validate all non zero values $("input[required].non_zero").each(function() { if (!validateValue(this)) { @@ -876,9 +889,11 @@ $(document).ready(function () { // Setup the maximum number of people at page load (to handle back/forward), // and update it when total people is changed. - setMaxInfectedPeople(); - $("#total_people").change(setMaxInfectedPeople); - $("#activity_type").change(setMaxInfectedPeople); + validateMaxInfectedPeople(); + $("#total_people").change(validateMaxInfectedPeople); + $("#activity_type").change(validateMaxInfectedPeople); + $("#total_people").change(validateMaxInfectedPeople); + $("#infected_people").change(validateMaxInfectedPeople); //Validate all non zero values $("input[required].non_zero").each(function() {validateValue(this)}); diff --git a/caimira/apps/templates/base/calculator.form.html.j2 b/caimira/apps/templates/base/calculator.form.html.j2 index 770df231..563e6d0c 100644 --- a/caimira/apps/templates/base/calculator.form.html.j2 +++ b/caimira/apps/templates/base/calculator.form.html.j2 @@ -313,8 +313,8 @@
-
-
+
+
From c98261503e2709e76f5a903466472739aa18ea9c Mon Sep 17 00:00:00 2001 From: Luis Aleixo Date: Wed, 21 Sep 2022 11:39:49 +0200 Subject: [PATCH 2/3] added server side validation --- caimira/apps/calculator/model_generator.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/caimira/apps/calculator/model_generator.py b/caimira/apps/calculator/model_generator.py index 6b9a6796..290d22d3 100644 --- a/caimira/apps/calculator/model_generator.py +++ b/caimira/apps/calculator/model_generator.py @@ -189,9 +189,12 @@ class FormData: return form_dict def validate(self): + # Validate number of infected people == 1 when activity is Conference/Training. + if self.activity_type == 'training' and self.infected_people > 1: + raise ValueError('Conference/Training activities are limited to 1 infected.') # Validate number of infected <= number of total people - if self.infected_people > self.total_people: - raise ValueError('Number of infected people cannot be more than number of total people.') + elif self.infected_people >= self.total_people: + raise ValueError('Number of infected people cannot be more or equal than number of total people.') # Validate time intervals selected by user time_intervals = [ From 6a5524a8b8095cc64def75303f990e7e5a82d765 Mon Sep 17 00:00:00 2001 From: Luis Aleixo Date: Wed, 21 Sep 2022 11:53:19 +0200 Subject: [PATCH 3/3] added validation tests and removed span error message --- .../templates/base/calculator.form.html.j2 | 1 - .../apps/calculator/test_model_generator.py | 18 ++++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/caimira/apps/templates/base/calculator.form.html.j2 b/caimira/apps/templates/base/calculator.form.html.j2 index 563e6d0c..37d8d932 100644 --- a/caimira/apps/templates/base/calculator.form.html.j2 +++ b/caimira/apps/templates/base/calculator.form.html.j2 @@ -317,7 +317,6 @@
-
diff --git a/caimira/tests/apps/calculator/test_model_generator.py b/caimira/tests/apps/calculator/test_model_generator.py index 43c1a657..1dbb4961 100644 --- a/caimira/tests/apps/calculator/test_model_generator.py +++ b/caimira/tests/apps/calculator/test_model_generator.py @@ -167,10 +167,20 @@ def test_ventilation_window_hepa(baseline_form: model_generator.FormData): assert ventilation == baseline_vent -def test_infected_less_than_total_people(baseline_form: model_generator.FormData): - baseline_form.total_people = 10 - baseline_form.infected_people = 11 - with pytest.raises(ValueError, match='Number of infected people cannot be more than number of total people.'): +@pytest.mark.parametrize( + ["activity", "total_people", "infected_people", "error"], + [ + ['office', 10, 11, "Number of infected people cannot be more or equal than number of total people."], + ['office', 10, 10, "Number of infected people cannot be more or equal than number of total people."], + ['training', 10, 2, "Conference/Training activities are limited to 1 infected."], + ] +) +def test_infected_less_than_total_people(activity, total_people, infected_people, error, + baseline_form: model_generator.FormData): + baseline_form.activity_type = activity + baseline_form.total_people = total_people + baseline_form.infected_people = infected_people + with pytest.raises(ValueError, match=error): baseline_form.validate()