def test_referentiel_when_a_(): action_1_2_1 = make_action_referentiel(id="ref__1_2_1", id_nomenclature="1.2.1", actions=[], points=50) action_1_2_2 = make_action_referentiel(id="ref__1_2_2", id_nomenclature="1.2.2", actions=[], points=50) action_1_2 = make_action_referentiel(id="ref__1_2", id_nomenclature="1.2", actions=[action_1_2_1, action_1_2_2]) action_1_1 = make_action_referentiel(id="ref__1_1", id_nomenclature="1.1", points=30) action_1 = make_action_referentiel(id="ref__1", id_nomenclature="1", actions=[action_1_1, action_1_2], points=500) root_action = make_action_referentiel(id="ref", id_nomenclature="", actions=[action_1]) referentiel = Referentiel(root_action, mesure_depth=1) assert referentiel.points[("1", "1")] == 150.0 assert referentiel.points[("1", "2")] == 350.0 assert referentiel.points[("1", "2", "1")] == 175.0 assert referentiel.percentages[("1", "2", "1")] == 0.5
def referentiel_sanity(referentiel: Referentiel): """Assert that every referentiel action points are equal to the total points of its children.""" for index in referentiel.backward: children = referentiel.children(index) if children: total_points = sum([referentiel.points[child] for child in children]) assert math.isclose( total_points, referentiel.points[index] ), f"{index} points {referentiel.points[index]} != children points {total_points}"
def referentiel() -> Referentiel: action_1_1 = make_action_referentiel(id_nomenclature="1.1", actions=[], points=30) action_1_2 = make_action_referentiel(id_nomenclature="1.2", actions=[], points=70) action_1 = make_action_referentiel(id_nomenclature="1", actions=[action_1_1, action_1_2]) root_action = make_action_referentiel(actions=[action_1]) referentiel = Referentiel(root_action) return referentiel
def test_notation_only_root_default_status(): referentiel = Referentiel(root_action=make_action_referentiel()) notation = Notation(referentiel) scores = notation.compute_and_get_scores() assert_score_with_nomenclature_id_equals( scores, "", points=0.0, percentage=0.0, potentiel=defaut_referentiel_root_points_value, referentiel_points=defaut_referentiel_root_points_value, referentiel_percentage=1, )
def test_referentiel_when_root_action_has_one_level(): action_1_1 = make_action_referentiel(id="ref__1", id_nomenclature="1", actions=[]) root_action = make_action_referentiel(id="ref", id_nomenclature="", actions=[action_1_1], points=42) referentiel = Referentiel(root_action) assert referentiel.indices == [(), ("1", )] assert referentiel.backward == [("1", ), ()] assert referentiel.forward == [(), ("1", )] assert referentiel.actions == {(): root_action, ("1", ): action_1_1} assert referentiel.points == {(): 500, ("1", ): 100} assert referentiel.percentages == {(): 1, ("1", ): 0.2}
def test_notation_only_root_default_status(): # todo, do we want to keep this ? referentiel = Referentiel(root_action=make_action_referentiel(points=42), mesure_depth=0) notation = Notation(referentiel) scores = notation.compute_and_get_scores() assert_score_with_nomenclature_id_equals( scores, "", points=0.0, percentage=0.0, potentiel=42, referentiel_points=42, referentiel_percentage=1, )
def referentiel() -> Referentiel: action_1_1 = make_action_referentiel(id_nomenclature="1.1", actions=[], points=30) action_1_2 = make_action_referentiel(id_nomenclature="1.2", actions=[], points=70) action_1 = make_action_referentiel(id_nomenclature="1", actions=[action_1_1, action_1_2], points=100) action_2_0 = make_action_referentiel(id_nomenclature="2.0", actions=[], points=0) action_2_1 = make_action_referentiel(id_nomenclature="2.1", actions=[], points=100) action_2 = make_action_referentiel(id_nomenclature="2", actions=[action_2_0, action_2_1], points=100) action_3 = make_action_referentiel(id_nomenclature="3", points=300) root_action = make_action_referentiel( actions=[action_1, action_2, action_3]) referentiel = Referentiel(root_action, mesure_depth=1) return referentiel
def test_referentiel_fails_when_wrong_root_action(): with pytest.raises(ReferentielValueError): referentiel = Referentiel( root_action=make_action_referentiel(id_nomenclature="not_empty"), mesure_depth=3, )
def test_referentiel_when_root_action_has_one_mesure(): action_1_1_1_0 = make_action_referentiel( id="ref__1_1_1_0", id_nomenclature="1.1.1.0", actions=[], points=0, # Réglementaire ) action_1_1_1_1 = make_action_referentiel( id="ref__1_1_1_1", id_nomenclature="1.1.1.1", actions=[], points=20 # % ) action_1_1_1_2 = make_action_referentiel( id="ref__1_1_1_2", id_nomenclature="1.1.1.2", actions=[], # No points specified ! ) action_1_1_1 = make_action_referentiel( id="ref__1_1_1", id_nomenclature="1.1.1", actions=[action_1_1_1_0, action_1_1_1_1, action_1_1_1_2], points=30, # % ) action_1_1_2 = make_action_referentiel( id="ref__1_1_2", id_nomenclature="1.1.2", actions=[], points=70 # % ) action_1_2_1 = make_action_referentiel(id="ref__1_2_1", id_nomenclature="1.2.1", actions=[]) action_1_2 = make_action_referentiel(id="ref__1_2", id_nomenclature="1.2", actions=[action_1_2_1], points=200) action_1_1 = make_action_referentiel( id="ref__1_1", id_nomenclature="1.1", actions=[action_1_1_1, action_1_1_2], points=300, ) action_1 = make_action_referentiel(id="ref__1", id_nomenclature="1", actions=[action_1_1, action_1_2]) root_action = make_action_referentiel(id="ref", id_nomenclature="", actions=[action_1]) referentiel = Referentiel(root_action, mesure_depth=2) assert referentiel.forward == [ (), ("1", ), ("1", "1"), ("1", "2"), ("1", "1", "1"), ("1", "1", "2"), ("1", "2", "1"), ("1", "1", "1", "0"), ("1", "1", "1", "1"), ("1", "1", "1", "2"), ] expected_points = { (): 500.0, ("1", ): 500.0, ("1", "1"): 300.0, ("1", "2"): 200.0, ("1", "1", "1"): 90.0, # 30% of 300.0 ("1", "1", "2"): 210.0, # 70% of 300.0 ("1", "2", "1"): 200.0, # 100% of 200.0 ("1", "1", "1", "0"): 0, # 0% of 90.0 ("1", "1", "1", "1"): 18.0, # 20% of 90.0 ("1", "1", "1", "2"): 72.0, # 80% of 90.0 } expected_percentages = { (): 1, ("1", ): 1, ("1", "1"): 3 / 5, ("1", "2"): 2 / 5, ("1", "1", "1"): 0.3, ("1", "1", "2"): 0.7, ("1", "2", "1"): 1.0, ("1", "1", "1", "0"): 0.0, ("1", "1", "1", "1"): 0.2, ("1", "1", "1", "2"): 0.8, } expected_childless_descendant = { (): 5, ("1", ): 5, ("1", "1"): 4, ("1", "2"): 1, ("1", "1", "1"): 3, ("1", "1", "2"): 0, ("1", "2", "1"): 0, ("1", "1", "1", "0"): 0, ("1", "1", "1", "1"): 0, ("1", "1", "1", "2"): 0, } for action_index in referentiel.forward: assert ( referentiel.points[action_index] == expected_points[action_index] ), f"Error in points at index {action_index}" assert (referentiel.percentages[action_index] == expected_percentages[action_index] ), f"Error in percentage at index {action_index}" assert (referentiel.childless_descendant[action_index] == expected_childless_descendant[action_index] ), f"Error in childless descendant at index {action_index}"
def test_referentiel_when_some_root_action_has_no_actions(): root_action = make_action_referentiel(actions=[]) referentiel = Referentiel(root_action, mesure_depth=3) assert referentiel.backward == [()] assert referentiel.forward == [()]
from api.data.generated.referentiels import actions from api.notation.referentiel import Referentiel from api.utils.get_referentiel import get_referentiel_from_action referentiel_eci = Referentiel( next(action for action in actions if get_referentiel_from_action(action) == "eci"), mesure_depth=2, ) referentiel_cae = Referentiel( next(action for action in actions if get_referentiel_from_action(action) == "cae"), mesure_depth=3, )
def test_notation_non_concernee_changes_parents_potentiels(): """ A l'intérieur d'une mesure/orientation : - Si une action a un statut "Non concernée", alors cette action n'est pas prise en compte pour calculer le score. *Exemple : Orientation 1.2. = 30 points Si niveau 1.2.1 dont le poids est 20% est "Non concerné" alors l'orientation 1.2 reste évaluée sur 30 points et le poids est reventilé sur les autres niveaux en augmentant de façon proportionnelle - 1.2.2 = 20% + 1/3 x 20% - 1.2.3 = 20% + 1/3 x 20% - 1.2.4 = 40% + 1/3 x 40% - Si toutes les actions sœurs ont un statut "Non concernée" (en dehors des mesures/orientations), alors le niveau parent est "Non concerné" et l'action n'est pas prise en compte pour calculer le score. *Exemple : Niveau 1.2.1. Si 1.2.1.1/2/3/4/5 sont "Non concernée" alors 1.2.1 = Non concernée* - Cas particulier : Si tous les enfants d'une mesure/orientation sont "Non concernée" alors la mesure/orientation a bien un statut "Non concernée" MAIS son nombre de points passe à "0" sans être reventilé sur les autres mesures/orientations. *Exemple : Orientation 1.2 = 30 points Si 1.2.1/2/3/4 = "Non concernée" alors 1.2 = "Non concernée" et "0/0 points" et la collectivité n'est plus évaluée sur 500 points mais sur 470 points.* """ action_1_2_1 = make_action_referentiel(id_nomenclature="1.2.1", actions=[], points=25) action_1_2_2 = make_action_referentiel(id_nomenclature="1.2.2", actions=[], points=25) action_1_2_3 = make_action_referentiel(id_nomenclature="1.2.3", actions=[], points=25) action_1_2_4 = make_action_referentiel(id_nomenclature="1.2.4", actions=[], points=25) action_1_2 = make_action_referentiel( id_nomenclature="1.2", actions=[action_1_2_1, action_1_2_2, action_1_2_3, action_1_2_4], points=30, ) action_1 = make_action_referentiel(id_nomenclature="1", actions=[action_1_2]) action_2_2 = make_action_referentiel( id_nomenclature="2.2", actions=[], points=470, ) action_2 = make_action_referentiel(id_nomenclature="2", actions=[action_2_2]) root_action = make_action_referentiel(actions=[action_1, action_2]) referentiel = Referentiel(root_action, mesure_depth=2) notation = Notation(referentiel) notation.set_status(index=("1", "2", "1"), status=Status.non_concernee) notation.set_status(index=("1", "2", "2"), status=Status.non_concernee) notation.set_status(index=("1", "2", "3"), status=Status.non_concernee) notation.set_status(index=("1", "2", "4"), status=Status.non_concernee) scores = notation.compute_and_get_scores() assert_score_with_nomenclature_id_equals( scores, "", points=0.0, percentage=0.0, potentiel=470, referentiel_points=500, referentiel_percentage=1, ) assert_score_with_nomenclature_id_equals( scores, "1", points=0, percentage=0.0, potentiel=0, referentiel_points=30, referentiel_percentage=30 / 500, ) assert_score_with_nomenclature_id_equals( scores, "1.2", points=0, percentage=0.0, potentiel=0, referentiel_points=30, referentiel_percentage=1, ) assert_score_with_nomenclature_id_equals( scores, "1.2.1", points=0, percentage=0.0, potentiel=0, referentiel_points=30 / 4, referentiel_percentage=1 / 4, ) assert_score_with_nomenclature_id_equals( scores, "2", points=0, percentage=0.0, potentiel=470, referentiel_points=470, referentiel_percentage=0.94, )
from api.data.generated.referentiels import actions from api.notation.referentiel import Referentiel referentiel_eci = Referentiel( next(action for action in actions if action.id.startswith("economie_circulaire")) )