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
示例#2
0
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,
    )
示例#5
0
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}
示例#6
0
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,
    )
示例#7
0
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,
)
示例#12
0
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,
    )
示例#13
0
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"))
)