diff --git a/envergo/moulinette/regulations/loisurleau.py b/envergo/moulinette/regulations/loisurleau.py index 682e288df..68f1bba20 100644 --- a/envergo/moulinette/regulations/loisurleau.py +++ b/envergo/moulinette/regulations/loisurleau.py @@ -229,23 +229,48 @@ class EcoulementSansBV(CriterionEvaluator): choice_label = "Loi sur l'eau > Écoulement EP sans BV" slug = "ecoulement_sans_bv" - CODES = ["soumis", "action_requise", "non_soumis"] + CODES = [ + "soumis", + "action_requise", + "non_soumis", + "action_requise_pv_sol", + "non_soumis_pv_sol", + ] + + RESULT_MATRIX = { + "soumis": RESULTS.soumis, + "action_requise_pv_sol": RESULTS.action_requise, + "action_requise": RESULTS.action_requise, + "non_soumis_pv_sol": RESULTS.non_soumis, + "non_soumis": RESULTS.non_soumis, + } CODE_MATRIX = { - "big": "soumis", - "medium": "action_requise", - "small": "non_soumis", + ("gte_1ha", "non_pv_sol"): "soumis", + ("gte_9000", "non_pv_sol"): "soumis", + ("gte_8000", "non_pv_sol"): "action_requise", + ("lt_8000", "non_pv_sol"): "non_soumis", + ("gte_1ha", "pv_sol"): "action_requise_pv_sol", + ("gte_9000", "pv_sol"): "action_requise_pv_sol", + ("gte_8000", "pv_sol"): "non_soumis_pv_sol", + ("lt_8000", "pv_sol"): "non_soumis_pv_sol", } def get_result_data(self): if self.catalog["final_surface"] >= 10000: - project_size = "big" + final_surface = "gte_1ha" + elif self.catalog["final_surface"] >= 9000: + final_surface = "gte_9000" elif self.catalog["final_surface"] >= 8000: - project_size = "medium" + final_surface = "gte_8000" else: - project_size = "small" + final_surface = "lt_8000" - return project_size + is_pv_sol = "non_pv_sol" + if self.moulinette.raw_data.get("evalenv_rubrique_30-localisation") == "sol": + is_pv_sol = "pv_sol" + + return final_surface, is_pv_sol # This was the old evaluator name @@ -258,27 +283,54 @@ class EcoulementAvecBV(CriterionEvaluator): choice_label = "Loi sur l'eau > Écoulement EP avec BV" slug = "ecoulement_avec_bv" - CODES = ["soumis", "action_requise_probable_1ha", "action_requise", "non_soumis"] + CODES = [ + "soumis", + "action_requise_probable_1ha", + "action_requise", + "non_soumis", + "action_requise_pv_sol", + "non_soumis_pv_sol", + ] CODE_MATRIX = { - ("gt_11000", "gt_1ha"): "soumis", - ("gt_11000", "gt_7000"): "action_requise_probable_1ha", - ("gt_11000", "gt_500"): "action_requise", - ("gt_11000", "lt_500"): "non_soumis", - ("gt_9000", "gt_1ha"): "soumis", - ("gt_9000", "gt_7000"): "action_requise", - ("gt_9000", "gt_500"): "action_requise", - ("gt_9000", "lt_500"): "non_soumis", - ("lt_9000", "gt_1ha"): "soumis", - ("lt_9000", "gt_7000"): "non_soumis", - ("lt_9000", "gt_500"): "non_soumis", - ("lt_9000", "lt_500"): "non_soumis", + ("gt_11000", "gt_1ha", "pv_sol"): "action_requise_pv_sol", + ("gt_11000", "gt_9000", "pv_sol"): "action_requise_pv_sol", + ("gt_11000", "gt_7000", "pv_sol"): "non_soumis_pv_sol", + ("gt_11000", "gt_500", "pv_sol"): "non_soumis_pv_sol", + ("gt_11000", "lt_500", "pv_sol"): "non_soumis_pv_sol", + ("gt_9000", "gt_1ha", "pv_sol"): "action_requise_pv_sol", + ("gt_9000", "gt_9000", "pv_sol"): "action_requise_pv_sol", + ("gt_9000", "gt_7000", "pv_sol"): "non_soumis_pv_sol", + ("gt_9000", "gt_500", "pv_sol"): "non_soumis_pv_sol", + ("gt_9000", "lt_500", "pv_sol"): "non_soumis_pv_sol", + ("lt_9000", "gt_1ha", "pv_sol"): "action_requise_pv_sol", + ("lt_9000", "gt_9000", "pv_sol"): "action_requise_pv_sol", + ("lt_9000", "gt_7000", "pv_sol"): "non_soumis_pv_sol", + ("lt_9000", "gt_500", "pv_sol"): "non_soumis_pv_sol", + ("lt_9000", "lt_500", "pv_sol"): "non_soumis_pv_sol", + ("gt_11000", "gt_1ha", "non_pv_sol"): "soumis", + ("gt_11000", "gt_9000", "non_pv_sol"): "action_requise_probable_1ha", + ("gt_11000", "gt_7000", "non_pv_sol"): "action_requise_probable_1ha", + ("gt_11000", "gt_500", "non_pv_sol"): "action_requise", + ("gt_11000", "lt_500", "non_pv_sol"): "non_soumis", + ("gt_9000", "gt_1ha", "non_pv_sol"): "soumis", + ("gt_9000", "gt_9000", "non_pv_sol"): "action_requise", + ("gt_9000", "gt_7000", "non_pv_sol"): "action_requise", + ("gt_9000", "gt_500", "non_pv_sol"): "action_requise", + ("gt_9000", "lt_500", "non_pv_sol"): "non_soumis", + ("lt_9000", "gt_1ha", "non_pv_sol"): "soumis", + ("lt_9000", "gt_9000", "non_pv_sol"): "non_soumis", + ("lt_9000", "gt_7000", "non_pv_sol"): "non_soumis", + ("lt_9000", "gt_500", "non_pv_sol"): "non_soumis", + ("lt_9000", "lt_500", "non_pv_sol"): "non_soumis", } RESULT_MATRIX = { "soumis": RESULTS.soumis, "action_requise_probable_1ha": RESULTS.action_requise, + "action_requise_pv_sol": RESULTS.action_requise, "action_requise": RESULTS.action_requise, + "non_soumis_pv_sol": RESULTS.non_soumis, "non_soumis": RESULTS.non_soumis, } @@ -303,6 +355,8 @@ def get_catalog_data(self): def get_result_data(self): if self.catalog["final_surface"] >= 10000: final_surface = "gt_1ha" + elif self.catalog["final_surface"] >= 9000: + final_surface = "gt_9000" elif self.catalog["final_surface"] >= 7000: final_surface = "gt_7000" elif self.catalog["final_surface"] >= 500: @@ -317,7 +371,11 @@ def get_result_data(self): else: catchment_surface = "lt_9000" - return catchment_surface, final_surface + is_pv_sol = "non_pv_sol" + if self.moulinette.raw_data.get("evalenv_rubrique_30-localisation") == "sol": + is_pv_sol = "pv_sol" + + return catchment_surface, final_surface, is_pv_sol class OtherCriteria(CriterionEvaluator): diff --git a/envergo/moulinette/tests/test_loisurleau.py b/envergo/moulinette/tests/test_loisurleau.py index 6f65d70b1..52ce2a38a 100644 --- a/envergo/moulinette/tests/test_loisurleau.py +++ b/envergo/moulinette/tests/test_loisurleau.py @@ -38,6 +38,20 @@ def loisurleau_criteria(france_map): # noqa evaluator="envergo.moulinette.regulations.loisurleau.Ruissellement", activation_map=france_map, ), + CriterionFactory( + title="Écoulement EP sans BV", + regulation=regulation, + evaluator="envergo.moulinette.regulations.loisurleau.EcoulementSansBV", + activation_map=france_map, + is_optional=True, + ), + CriterionFactory( + title="Écoulement EP avec BV", + regulation=regulation, + evaluator="envergo.moulinette.regulations.loisurleau.EcoulementAvecBV", + activation_map=france_map, + is_optional=True, + ), ] return criteria @@ -260,3 +274,83 @@ def test_3220_medium_footprint_within_potential_flood_zones(moulinette_data): moulinette.catalog["potential_flood_zones_within_0m"] = True moulinette.evaluate() assert moulinette.loi_sur_leau.zone_inondable.result == "non_soumis" + + +@pytest.mark.parametrize("footprint", [9000]) +def test_2150_big(moulinette_data): + moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data) + moulinette.evaluate() + assert moulinette.loi_sur_leau.ecoulement_sans_bv.result_code == "soumis" + + +@pytest.mark.parametrize("footprint", [8000]) +def test_2150_medium(moulinette_data): + moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data) + moulinette.evaluate() + assert moulinette.loi_sur_leau.ecoulement_sans_bv.result_code == "action_requise" + + +@pytest.mark.parametrize("footprint", [7000]) +def test_2150_small(moulinette_data): + moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data) + moulinette.evaluate() + assert moulinette.loi_sur_leau.ecoulement_sans_bv.result_code == "non_soumis" + + +@pytest.mark.parametrize("footprint", [10000]) +def test_2150_with_pv_sol_big(moulinette_data): + moulinette_data["evalenv_rubrique_30-localisation"] = "sol" + moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data) + moulinette.evaluate() + assert ( + moulinette.loi_sur_leau.ecoulement_sans_bv.result_code + == "action_requise_pv_sol" + ) + + +@pytest.mark.parametrize("footprint", [8000]) +def test_2150_with_pv_sol_small(moulinette_data): + moulinette_data["evalenv_rubrique_30-localisation"] = "sol" + moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data) + moulinette.evaluate() + assert moulinette.loi_sur_leau.ecoulement_sans_bv.result_code == "non_soumis_pv_sol" + + +@pytest.mark.parametrize("footprint", [10000]) +def test_2150_avec_bv_big(moulinette_data): + moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data) + moulinette.evaluate() + assert moulinette.loi_sur_leau.ecoulement_avec_bv.result_code == "soumis" + + +@pytest.mark.parametrize("footprint", [9000]) +def test_2150_avec_bv_medium(moulinette_data): + moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data) + moulinette.evaluate() + assert moulinette.loi_sur_leau.ecoulement_avec_bv.result_code == "action_requise" + + +@pytest.mark.parametrize("footprint", [7000]) +def test_2150_avec_bv_small(moulinette_data): + moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data) + moulinette.evaluate() + assert moulinette.loi_sur_leau.ecoulement_avec_bv.result_code == "non_soumis" + + +@pytest.mark.parametrize("footprint", [10000]) +def test_2150_avec_bv_with_pv_sol_big(moulinette_data): + moulinette_data["evalenv_rubrique_30-localisation"] = "sol" + moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data) + moulinette.evaluate() + assert ( + moulinette.loi_sur_leau.ecoulement_avec_bv.result_code + == "action_requise_pv_sol" + ) + + +@pytest.mark.parametrize("footprint", [8000]) +def test_2150_avec_bv_with_pv_sol_small(moulinette_data): + moulinette_data["evalenv_rubrique_30-localisation"] = "sol" + moulinette = MoulinetteAmenagement(moulinette_data, moulinette_data) + moulinette.evaluate() + assert moulinette.loi_sur_leau.ecoulement_avec_bv.result_code == "non_soumis_pv_sol" diff --git a/envergo/templates/moulinette/loi_sur_leau/ecoulement_avec_bv_action_requise_pv_sol.html b/envergo/templates/moulinette/loi_sur_leau/ecoulement_avec_bv_action_requise_pv_sol.html new file mode 100644 index 000000000..10cfc2ccf --- /dev/null +++ b/envergo/templates/moulinette/loi_sur_leau/ecoulement_avec_bv_action_requise_pv_sol.html @@ -0,0 +1,51 @@ +

+ 🔍 Le seuil de 1 ha est entendu comme la surface totale du projet, y compris l'existant, augmentée de l'aire du bassin versant dont il intercepte les écoulements. Ce n'est pas la surface de la parcelle qui est prise en compte, mais bien celle du projet. +

+ +

+ Action requise : +

+ +

Démontrer que le projet {{ criterion.required_action }}.

+ +

+ Pourquoi cette action est-elle requise ? +

+ +{% if final_surface >= 10000 %} +

+ La surface du projet est supérieure à 1 ha. Or, si les écoulements d’eau de pluie sont modifiés sur une surface de plus de 1 ha, le projet sera soumis à la Loi sur l’eau. +

+ +{% else %} +

+ La surface du projet est proche de 1 ha. Or, si les écoulements d’eau de pluie sont modifiés sur une surface de plus + de 1 ha, en comptant la surface du bassin versant intercepté, le projet sera soumis à la Loi sur l’eau. +

+ +{% endif %} + +

+ Les panneaux photovoltaïques sont en général espacés, et permettent l’infiltration de l’eau dans le sol, cependant : +

+ + + +

Une étude hydraulique doit donc être menée.

+ +{% if moulinette.eval_env.result == "systematique" %} +

+ Le projet étant soumis à évaluation environnementale (voir la section « Évaluation environnementale » dans cette + page), une étude d’impact doit être réalisée. C’est dans le cadre de celle-ci que se fera l’étude hydraulique, et + qu’il sera déterminé si la surface impactée dépasse 1 ha. +

+{% endif %} diff --git a/envergo/templates/moulinette/loi_sur_leau/ecoulement_avec_bv_non_soumis_pv_sol.html b/envergo/templates/moulinette/loi_sur_leau/ecoulement_avec_bv_non_soumis_pv_sol.html new file mode 100644 index 000000000..16d419568 --- /dev/null +++ b/envergo/templates/moulinette/loi_sur_leau/ecoulement_avec_bv_non_soumis_pv_sol.html @@ -0,0 +1,29 @@ +

+ 🔍 Le seuil de 1 ha est entendu comme la surface totale du projet, y compris l'existant, augmentée de l'aire du bassin versant dont il intercepte les écoulements. Ce n'est pas la surface de la parcelle qui est prise en compte, mais bien celle du projet. +

+ +

+ Pourquoi le projet n'est-il pas concerné ? +

+ +

+ Au vu des informations saisies, la surface du projet est inférieure à 1 ha. Le projet n’est donc pas concerné par cette rubrique de la Loi sur l’eau. +

+ +

+ Quel impact environnemental ? +

+

+ Les panneaux photovoltaïques sont en général espacés, et permettent l’infiltration de l’eau dans le sol, cependant : +

+ + diff --git a/envergo/templates/moulinette/loi_sur_leau/ecoulement_sans_bv_action_requise_pv_sol.html b/envergo/templates/moulinette/loi_sur_leau/ecoulement_sans_bv_action_requise_pv_sol.html new file mode 100644 index 000000000..10cfc2ccf --- /dev/null +++ b/envergo/templates/moulinette/loi_sur_leau/ecoulement_sans_bv_action_requise_pv_sol.html @@ -0,0 +1,51 @@ +

+ 🔍 Le seuil de 1 ha est entendu comme la surface totale du projet, y compris l'existant, augmentée de l'aire du bassin versant dont il intercepte les écoulements. Ce n'est pas la surface de la parcelle qui est prise en compte, mais bien celle du projet. +

+ +

+ Action requise : +

+ +

Démontrer que le projet {{ criterion.required_action }}.

+ +

+ Pourquoi cette action est-elle requise ? +

+ +{% if final_surface >= 10000 %} +

+ La surface du projet est supérieure à 1 ha. Or, si les écoulements d’eau de pluie sont modifiés sur une surface de plus de 1 ha, le projet sera soumis à la Loi sur l’eau. +

+ +{% else %} +

+ La surface du projet est proche de 1 ha. Or, si les écoulements d’eau de pluie sont modifiés sur une surface de plus + de 1 ha, en comptant la surface du bassin versant intercepté, le projet sera soumis à la Loi sur l’eau. +

+ +{% endif %} + +

+ Les panneaux photovoltaïques sont en général espacés, et permettent l’infiltration de l’eau dans le sol, cependant : +

+ + + +

Une étude hydraulique doit donc être menée.

+ +{% if moulinette.eval_env.result == "systematique" %} +

+ Le projet étant soumis à évaluation environnementale (voir la section « Évaluation environnementale » dans cette + page), une étude d’impact doit être réalisée. C’est dans le cadre de celle-ci que se fera l’étude hydraulique, et + qu’il sera déterminé si la surface impactée dépasse 1 ha. +

+{% endif %} diff --git a/envergo/templates/moulinette/loi_sur_leau/ecoulement_sans_bv_non_soumis_pv_sol.html b/envergo/templates/moulinette/loi_sur_leau/ecoulement_sans_bv_non_soumis_pv_sol.html new file mode 100644 index 000000000..16d419568 --- /dev/null +++ b/envergo/templates/moulinette/loi_sur_leau/ecoulement_sans_bv_non_soumis_pv_sol.html @@ -0,0 +1,29 @@ +

+ 🔍 Le seuil de 1 ha est entendu comme la surface totale du projet, y compris l'existant, augmentée de l'aire du bassin versant dont il intercepte les écoulements. Ce n'est pas la surface de la parcelle qui est prise en compte, mais bien celle du projet. +

+ +

+ Pourquoi le projet n'est-il pas concerné ? +

+ +

+ Au vu des informations saisies, la surface du projet est inférieure à 1 ha. Le projet n’est donc pas concerné par cette rubrique de la Loi sur l’eau. +

+ +

+ Quel impact environnemental ? +

+

+ Les panneaux photovoltaïques sont en général espacés, et permettent l’infiltration de l’eau dans le sol, cependant : +

+ + diff --git a/envergo/templates/moulinette/loi_sur_leau/result_action_requise.html b/envergo/templates/moulinette/loi_sur_leau/result_action_requise.html index 209b6cd4a..47c9d40b8 100644 --- a/envergo/templates/moulinette/loi_sur_leau/result_action_requise.html +++ b/envergo/templates/moulinette/loi_sur_leau/result_action_requise.html @@ -10,6 +10,16 @@

Marche à suivre

{% endif %} +{% if moulinette.eval_env.result == "systematique" %} + +

+ Le projet étant soumis à évaluation environnementale (voir section « Évaluation + environnementale » dans cette page), une étude d’impact doit être menée. C’est dans le cadre de celle-ci que les + impacts listés ci-dessus seront évalués. +

+ +{% endif %} +

Si le projet s'avère soumis à la Loi sur l'eau :