Exemple #1
0
def test_search_amendement_too_many(app, settings, lecture_an, article1_an,
                                    lecture_an_url, amendements_an,
                                    user_david):
    from zam_repondeur.models import Amendement

    nb_amendements = int(settings["zam.limits.max_amendements_for_full_index"])

    with transaction.manager:
        for i in range(nb_amendements):
            Amendement.create(lecture=lecture_an,
                              article=article1_an,
                              num=i + 1)

    resp = app.get(
        f"{lecture_an_url}/search_amendement",
        params={"num": amendements_an[0].num},
        user=user_david,
    )

    assert resp.status_code == 200
    assert resp.content_type == "application/json"
    assert resp.json == {
        "index":
        ("https://zam.test"
         "/dossiers/plfss-2018/lectures/an.15.269.PO717460/amendements/"
         "?article=article.1..#amdt-666")
    }
Exemple #2
0
def test_number_of_amendements_is_displayed_too_many_amendements(
    wsgi_server,
    driver,
    settings,
    article1_an,
    lecture_an,
    lecture_an_url,
    amendements_an,
):
    from zam_repondeur.models import Amendement

    nb_amendements = int(settings["zam.limits.max_amendements_for_full_index"])

    with transaction.manager:
        for i in range(nb_amendements):
            Amendement.create(lecture=lecture_an,
                              article=article1_an,
                              num=i + 1)

    driver.get(f"{lecture_an_url}/amendements/")
    trs = driver.find_elements_by_css_selector("tbody tr")
    assert len(trs) == 7
    counter = driver.find_element_by_css_selector(
        'span[data-target="amendements-filters.count"]')
    assert counter.text == "7 amendements pour cet article • 7 amendements au total"
def test_amendements_search_too_many(
    wsgi_server,
    settings,
    driver,
    lecture_an,
    article1_an,
    lecture_an_url,
    amendements_an,
):
    from zam_repondeur.models import Amendement

    nb_amendements = int(settings["zam.limits.max_amendements_for_full_index"])

    with transaction.manager:
        for i in range(nb_amendements):
            Amendement.create(lecture=lecture_an,
                              article=article1_an,
                              num=i + 1)

    url = f"{lecture_an_url}/amendements/"
    driver.get(url)
    input_field = driver.find_element_by_css_selector(
        "thead tr.filters th:nth-child(3) input")
    input_field.send_keys("111")  # Unknown numero.
    wait = WebDriverWait(driver, 1)
    wait.until(lambda driver: driver.current_url != url)
    filter_url = driver.current_url
    assert driver.find_element_by_css_selector(
        '[data-target="amendement-search.form"]').is_displayed()
    driver.find_element_by_css_selector("#q-amendement").send_keys(
        f"{amendements_an[0].num}{Keys.ENTER}")
    wait = WebDriverWait(driver, 1)
    wait.until(lambda driver: driver.current_url != filter_url)
    assert driver.current_url == f"{url}?article=article.1..#amdt-666"
Exemple #4
0
    def apply(self, lecture: Lecture) -> FetchResult:
        article = self._get_article(lecture)
        parent = self._get_parent(lecture, article)

        Amendement.create(
            lecture=lecture,
            article=article,
            parent=parent,
            position=self.position,
            num=self.num,
            rectif=self.rectif,
            tri_amendement=self.tri_amendement,
            id_discussion_commune=self.id_discussion_commune,
            id_identique=self.id_identique,
            matricule=self.matricule,
            groupe=self.groupe,
            auteur=self.auteur,
            mission_titre=self.mission_titre,
            mission_titre_court=self.mission_titre_court,
            corps=self.corps,
            expose=self.expose,
            sort=self.sort,
            date_depot=self.date_depot,
        )

        return FetchResult.create(fetched={self.num}, created={self.num})
def test_download_xlsx_lots_of_amendements(app, lecture_an, article1_an,
                                           user_david):
    from zam_repondeur.models import Amendement

    nb_amendements = 11
    with transaction.manager:
        for i in range(nb_amendements):
            Amendement.create(lecture=lecture_an,
                              article=article1_an,
                              num=i + 1)

    params = "&".join(f"n={i+1}" for i in range(nb_amendements))
    resp = app.get(
        (f"/dossiers/plfss-2018/lectures/an.15.269.PO717460/export_xlsx"
         f"?article={article1_an.url_key}&{params}"),
        user=user_david,
    )
    assert resp.status_code == 200
    assert (
        resp.content_type ==
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    assert (
        resp.headers["Content-Disposition"] ==
        "attachment; filename=an-269-PO717460-article1-11amendements-1etc.xlsx"
    )
Exemple #6
0
def test_get_amendements_columns_too_many_amendements(app, settings,
                                                      article1_an, lecture_an,
                                                      lecture_an_url,
                                                      amendements_an,
                                                      user_david):
    from zam_repondeur.models import Amendement

    nb_amendements = int(settings["zam.limits.max_amendements_for_full_index"])

    with transaction.manager:
        for i in range(nb_amendements):
            Amendement.create(lecture=lecture_an,
                              article=article1_an,
                              num=i + 1)

    resp = app.get(f"{lecture_an_url}/amendements/", user=user_david)

    assert resp.status_code == 200
    assert [
        node.text().strip().split()
        for node in resp.parser.css("thead tr.filters th")
        if node.text().strip().split()
    ] == [
        ["Art.", "1"],
        ["Nº", "Gouv."],
        ["Table/boîte", "Vide"],
        ["Avis", "Vide"],
        ["Réponse"],
    ]
    options = resp.parser.css("thead tr.filters th select option")
    assert "selected" in options[0].attributes
Exemple #7
0
def test_post_form(app, lecture_an, lecture_an_url, article1_an, user_david):
    from zam_repondeur.models import Amendement, DBSession, Lecture

    # Initially, we only have one amendement (#135), with a response
    with transaction.manager:
        DBSession.add(lecture_an)
        lecture_an.texte.date_depot = datetime.utcnow().date() - timedelta(
            days=5)
        Amendement.create(lecture=lecture_an,
                          article=article1_an,
                          num=135,
                          position=1)
        assert lecture_an.events == []

    # No progress status by default.
    assert lecture_an.get_fetch_progress() == {}

    with setup_mock_responses(
            lecture=lecture_an,
            liste=read_sample_data("an/269/liste.xml"),
            amendements=(
                ("177", read_sample_data("an/269/177.xml")),
                ("270", read_sample_data("an/269/270.xml")),
                ("723", read_sample_data("an/269/723.xml")),
                ("135", read_sample_data("an/269/135.xml")),
                ("192", read_sample_data("an/269/192.xml")),
            ),
    ):

        # Then we ask for a refresh
        form = app.get(
            "/dossiers/plfss-2018/lectures/an.15.269.PO717460/journal/",
            user=user_david).forms["manual-refresh"]
        resp = form.submit()

    assert resp.status_code == 302
    assert resp.location == f"https://zam.test{lecture_an_url}/amendements/"

    resp = resp.follow()

    assert resp.status_code == 200

    lecture_an = Lecture.get_by_pk(lecture_an.pk)  # refresh object

    events = lecture_an.events
    assert len(events) == 1
    assert events[0].render_summary() == "4 nouveaux amendements récupérés."
    assert "Rafraîchissement des amendements en cours." in resp.text

    # Default progress status for dummy progress bar is set.
    assert lecture_an.get_fetch_progress() == {"current": 1, "total": 10}

    # If we fetch again the journal, the refresh button is not present anymore.
    resp = app.get("/dossiers/plfss-2018/lectures/an.15.269.PO717460/journal/",
                   user=user_david)
    assert resp.status_code == 200
    assert "manual-refresh" not in resp.forms
def test_post_form(app, lecture_an, article1_an, user_david):
    from zam_repondeur.models import Amendement, Lecture

    # Initially, we only have one amendement (#135), with a response
    with transaction.manager:
        Amendement.create(lecture=lecture_an, article=article1_an, num=135, position=1)
        assert lecture_an.events == []

    with setup_mock_responses(
        lecture=lecture_an,
        liste=read_sample_data("an/269/liste.xml"),
        amendements=(
            ("177", read_sample_data("an/269/177.xml")),
            ("270", read_sample_data("an/269/270.xml")),
            ("723", read_sample_data("an/269/723.xml")),
            ("135", read_sample_data("an/269/135.xml")),
            ("192", read_sample_data("an/269/192.xml")),
        ),
    ) as mock_resp:

        mock_resp.add(
            responses.GET,
            "http://www.assemblee-nationale.fr/15/projets/pl0269.asp",
            body=(Path(__file__).parent / "sample_data" / "pl0269.html").read_text(
                "utf-8", "ignore"
            ),
            status=200,
        )

        # Then we ask for a refresh
        form = app.get("/lectures/an.15.269.PO717460/journal/", user=user_david).forms[
            "manual-refresh"
        ]
        resp = form.submit()

    assert resp.status_code == 302
    assert resp.location == "https://zam.test/lectures/an.15.269.PO717460/amendements"

    resp = resp.follow()

    assert resp.status_code == 200

    lecture_an = Lecture.get(
        chambre=lecture_an.chambre,
        session_or_legislature=lecture_an.session,
        num_texte=lecture_an.texte.numero,
        partie=None,
        organe=lecture_an.organe,
    )
    events = lecture_an.events
    assert len(events) == 2
    assert events[0].render_summary() == "Le contenu des articles a été récupéré."
    assert events[1].render_summary() == "4 nouveaux amendements récupérés."
    assert "Rafraichissement des amendements et des articles en cours." in resp.text
Exemple #9
0
def test_amendement_unicity(amendements_an, article1av_an):
    from zam_repondeur.models import Amendement, DBSession

    existing = amendements_an[0]
    with transaction.manager, pytest.raises(IntegrityError) as error_info:
        Amendement.create(
            lecture=existing.lecture,
            num=existing.num,
            rectif=existing.rectif + 1,
            article=article1av_an,
            parent=None,
            objet="don't worry, this is an expected error",
        )
        DBSession.flush()
    assert "constraint" in error_info.value._message()
Exemple #10
0
def test_lecture_post_transfer_amendements_to_index(app, lecture_an,
                                                    amendements_an,
                                                    user_david):
    from zam_repondeur.models import Amendement, DBSession

    with transaction.manager:
        DBSession.add(amendements_an[0])
        table_david = user_david.table_for(lecture_an)
        table_david.add_amendement(amendements_an[0])

    resp = app.get(
        "/dossiers/plfss-2018/lectures/an.15.269.PO717460/transfer_amendements",
        {"n": [amendements_an[0]]},
        user=user_david,
    )
    resp = resp.forms["transfer-amendements"].submit("submit-index")

    # We're redirected to our table
    assert resp.status_code == 302
    assert resp.location == (("https://zam.test/"
                              "dossiers/plfss-2018/"
                              "lectures/an.15.269.PO717460/"
                              "tables/[email protected]/"))

    # Reload amendement as it was updated in another transaction
    amendement = Amendement.get(lecture_an, amendements_an[0].num)

    # The amendement is now on the index
    assert amendement.location.user_table is None
    assert amendement.location.shared_table is None
    assert amendement.events[0].render_summary() == (
        "<abbr title='*****@*****.**'>David</abbr> "
        "a remis l’amendement dans l’index.")
    assert amendement.table_name == ""
Exemple #11
0
def test_tables_grab_amendements(app, lecture_an, amendements_an, user_david,
                                 david_has_no_amendement):
    from zam_repondeur.models import Amendement

    email = user_david.email

    resp = app.post(
        f"/lectures/an.15.269.PO717460/tables/{email}",
        {
            "nums": [amdt.num for amdt in amendements_an],
            "submit-table": True
        },
        user=user_david,
    )

    # We're redirected to our table
    assert resp.status_code == 302
    assert (resp.location ==
            f"https://zam.test/lectures/an.15.269.PO717460/tables/{email}")

    # Reload amendements as they were updated in another transaction
    amendements = [
        Amendement.get(lecture_an, amdt.num) for amdt in amendements_an
    ]

    assert_amendements_are_on_table_for(amendements, user_david)
    assert_amendements_have_event_with_summary(
        amendements,
        "<abbr title='*****@*****.**'>David</abbr> a mis l’amendement sur sa table",
    )
Exemple #12
0
def test_tables_release_amendement(app, lecture_an, amendements_an, user_david,
                                   david_has_one_amendement):
    from zam_repondeur.models import Amendement

    email = user_david.email

    assert_amendement_is_on_table_for(amendements_an[0], user_david)

    resp = app.post(
        f"/lectures/an.15.269.PO717460/tables/{email}",
        {
            "nums": [amendements_an[0].num],
            "submit-index": True
        },
        user=user_david,
    )

    # We're redirected to our table
    assert resp.status_code == 302
    assert (resp.location ==
            f"https://zam.test/lectures/an.15.269.PO717460/tables/{email}")

    # Reload amendement as it was updated in another transaction
    amendement = Amendement.get(lecture_an, amendements_an[0].num)

    assert_amendement_is_on_the_index(amendement)
    assert_amendement_has_event_with_summary(
        amendement,
        "<abbr title='*****@*****.**'>David</abbr> "
        "a remis l’amendement dans l’index",
    )
Exemple #13
0
def test_write_with_affectation(lecture_senat, article1_senat, tmpdir,
                                user_david_table_senat):
    from zam_repondeur.export.json import write_json
    from zam_repondeur.models import Amendement, DBSession

    filename = str(tmpdir.join("test.json"))

    with transaction.manager:
        DBSession.add(user_david_table_senat)
        amendement = Amendement.create(
            lecture=lecture_senat,
            article=article1_senat,
            alinea="",
            num=42,
            rectif=1,
            auteur="M. DUPONT",
            groupe="RDSE",
            matricule="000000",
            corps="<p>L'article 1 est supprimé.</p>",
            expose="<p>Cet article va à l'encontre du principe d'égalité.</p>",
        )
        user_david_table_senat.amendements.append(amendement)

        counter = write_json(lecture_senat, filename, request={})

    with open(filename, "r", encoding="utf-8-sig") as f_:
        backup = json.loads(f_.read())
        amendements = backup["amendements"]
        articles = backup["articles"]

    assert counter["amendements"] == len(amendements) == 1
    assert counter["articles"] == len(articles) == 1
    assert amendements[0]["affectation_email"] == "*****@*****.**"
    assert amendements[0]["affectation_name"] == "David"
Exemple #14
0
def test_tables_steal_amendements(app, lecture_an, amendements_an, user_david,
                                  david_has_two_amendements, user_ronan):
    from zam_repondeur.models import Amendement

    assert len(user_ronan.table_for(lecture_an).amendements) == 0

    email = user_ronan.email

    # Transfer amendements to ronan's table (stealing them from david)
    resp = app.post(
        f"/lectures/an.15.269.PO717460/tables/{email}",
        {
            "nums": [amendements_an[0].num, amendements_an[1].num],
            "submit-table": True
        },
        user=user_ronan,
    )

    # We're redirected to our table
    assert resp.status_code == 302
    assert (resp.location ==
            f"https://zam.test/lectures/an.15.269.PO717460/tables/{email}")

    # Reload amendements as they were updated in another transaction
    amendements = [
        Amendement.get(lecture_an, amdt.num) for amdt in amendements_an
    ]

    assert_amendements_are_on_table_for(amendements, user_ronan)
    assert_amendements_have_event_with_summary(
        amendements,
        "<abbr title='*****@*****.**'>Ronan</abbr> "
        "a transféré l’amendement de « David ([email protected]) » à lui/elle-même",
    )
Exemple #15
0
    def test_transfer_one_amendement_to_myself_is_a_no_op(
        self, app, lecture_an, amendements_an, user_david, david_has_one_amendement
    ):
        from zam_repondeur.models import Amendement

        email = user_david.email
        resp = app.post(
            f"/dossiers/plfss-2018/lectures/an.15.269.PO717460/tables/{email}",
            {"n": [amendements_an[0].num], "submit-table": True},
            user=user_david,
        )

        # We're redirected to our table
        assert resp.status_code == 302
        assert resp.location == (
            "https://zam.test/"
            "dossiers/plfss-2018/"
            "lectures/an.15.269.PO717460/"
            "tables/[email protected]/"
        )

        # Reload amendement before checking for changes in the web transaction
        amendement = Amendement.get(lecture_an, amendements_an[0].num)

        assert_amendement_is_on_table_for(amendement, user_david)
        assert len(amendement.events) == 0
Exemple #16
0
    def test_transfer_one_amendement_to_index_manually_is_forbidden(
        self, app, lecture_an, amendements_an, user_david, david_has_one_amendement
    ):
        from zam_repondeur.models import Amendement

        email = user_david.email
        resp = app.post(
            f"/dossiers/plfss-2018/lectures/an.15.269.PO717460/tables/{email}",
            {"n": [amendements_an[0].num], "target": ""},
            user=user_david,
        )

        # We're redirected back to the form
        assert resp.status_code == 302
        assert resp.location == (
            (
                "https://zam.test"
                "/dossiers/plfss-2018"
                "/lectures/an.15.269.PO717460"
                "/transfer_amendements?n=666"
            )
        )

        # Reload amendement before checking for changes in the web transaction
        amendement = Amendement.get(lecture_an, amendements_an[0].num)

        assert_amendement_is_on_table_for(amendement, user_david)
        assert len(amendement.events) == 0
Exemple #17
0
def test_tables_release_amendements(
    app, lecture_an, amendements_an, user_david, david_has_two_amendements
):
    from zam_repondeur.models import Amendement

    email = user_david.email

    resp = app.post(
        f"/dossiers/plfss-2018/lectures/an.15.269.PO717460/tables/{email}",
        {"n": [amendements_an[0].num, amendements_an[1].num], "submit-index": True},
        user=user_david,
    )

    # We're redirected to our table
    assert resp.status_code == 302
    assert resp.location == (
        "https://zam.test/"
        "dossiers/plfss-2018/"
        "lectures/an.15.269.PO717460/"
        "tables/[email protected]/"
    )

    # Reload amendements as they were updated in another transaction
    amendements = [Amendement.get(lecture_an, amdt.num) for amdt in amendements_an]

    assert_amendements_are_on_the_index(amendements)
    assert_amendements_have_event_with_summary(
        amendements,
        "<abbr title='*****@*****.**'>David</abbr> "
        "a remis l’amendement dans l’index.",
    )
def test_fetch_amendements_with_errored(app, dummy_lecture, dummy_amendements):
    from zam_repondeur.models import Amendement

    with patch("zam_repondeur.views.lectures.get_amendements"
               ) as mock_get_amendements:
        mock_get_amendements.return_value = (
            [
                Amendement(
                    chambre="an",
                    session="15",
                    num_texte=269,
                    organe="PO717460",
                    subdiv_type="article",
                    subdiv_num="1",
                    num=666,
                    position=1,
                )
            ],
            ["111", "222"],
        )

        resp = app.post("/lectures/an.15.269.PO717460/fetch_amendements")

    assert resp.status_code == 302
    assert resp.location == "http://localhost/lectures/an.15.269.PO717460/"

    resp = resp.follow()
    assert resp.status_code == 200
    assert "Les amendements 111, 222 n’ont pu être récupérés." in resp.text
    assert "1 amendement inchangé." in resp.text
Exemple #19
0
def test_lecture_post_transfer_amendements_from_void_to_shared_table(
        app, lecture_an, amendements_an, user_david, shared_table_lecture_an):
    from zam_repondeur.models import Amendement

    resp = app.get(
        "/dossiers/plfss-2018/lectures/an.15.269.PO717460/transfer_amendements",
        {"n": [amendements_an[0]]},
        user=user_david,
    )
    form = resp.forms["transfer-amendements"]
    form["target"] = shared_table_lecture_an.slug
    resp = form.submit("submit-to")

    # We're redirected to our table
    assert resp.status_code == 302
    assert resp.location == (("https://zam.test/"
                              "dossiers/plfss-2018/"
                              "lectures/an.15.269.PO717460/"
                              "tables/[email protected]/"))

    # Reload amendement as it was updated in another transaction
    amendement = Amendement.get(lecture_an, amendements_an[0].num)

    # The amendement is now on the shared table.
    assert amendement.location.user_table is None
    assert amendement.location.shared_table.pk == shared_table_lecture_an.pk
    assert amendement.events[0].render_summary() == (
        "<abbr title='*****@*****.**'>David</abbr> "
        "a transféré l’amendement à « Test table ».")
    assert amendement.table_name == "Test table"
def test_download_pdf_multiple_amendements_multiple_articles(
        app, lecture_an, article7bis_an, amendements_an, user_david):
    from zam_repondeur.models import Amendement

    with transaction.manager:
        Amendement.create(lecture=lecture_an, article=article7bis_an, num=777)

    resp = app.get(
        ("/dossiers/plfss-2018/lectures/an.15.269.PO717460/export_pdf"
         "?article=all&n=666&n=777"),
        user=user_david,
    )
    assert resp.status_code == 200
    assert resp.content_type == "application/pdf"
    assert (resp.headers["Content-Disposition"] ==
            "attachment; filename=an-269-PO717460-amendements-666_777.pdf")
def test_export_csv_with_parent(lecture_an, article1_an, tmpdir):
    from zam_repondeur.models import Amendement, DBSession
    from zam_repondeur.services.import_export.csv import export_csv

    filename = str(tmpdir.join("test.csv"))

    amendements = [
        Amendement.create(
            lecture=lecture_an,
            article=article1_an,
            num=num,
            position=position,
            avis="Favorable",
            objet="Un objet très pertinent",
            reponse="Une réponse très appropriée",
            comments="Avec des commentaires",
        )
        for position, num in enumerate((333, 777), 1)
    ]
    amendements[1].parent = amendements[0]
    DBSession.add_all(amendements)
    DBSession.add(lecture_an)

    counter = export_csv(lecture_an, filename, request={})

    assert counter["amendements"] == 2

    with Path(filename).open(encoding="utf-8-sig") as csv_file:
        reader = csv.DictReader(csv_file, delimiter=";")
        amendement1 = next(reader)
        assert amendement1["Parent (sous-amdt)"] == ""
        amendement2 = next(reader)
        assert amendement2["Parent (sous-amdt)"] == "333"
Exemple #22
0
def test_lecture_post_transfer_amendements_from_shared_table_to_other(
        app, lecture_an, amendements_an, user_david, user_ronan,
        shared_table_lecture_an):
    from zam_repondeur.models import Amendement, DBSession

    with transaction.manager:
        DBSession.add(amendements_an[0])
        amendements_an[0].location.shared_table = shared_table_lecture_an

    resp = app.get(
        "/dossiers/plfss-2018/lectures/an.15.269.PO717460/transfer_amendements",
        {"n": [amendements_an[0]]},
        user=user_david,
    )
    form = resp.forms["transfer-amendements"]
    form["target"] = user_ronan.email
    resp = form.submit("submit-to")

    # We're redirected to our table
    assert resp.status_code == 302
    assert resp.location == (("https://zam.test/"
                              "dossiers/plfss-2018/"
                              "lectures/an.15.269.PO717460/"
                              "tables/[email protected]/"))

    # Reload amendement as it was updated in another transaction
    amendement = Amendement.get(lecture_an, amendements_an[0].num)

    # The amendement is now on their table.
    assert amendement.location.user_table.user.email == user_ronan.email
    assert amendement.location.shared_table is None
    assert amendement.events[0].render_summary() == (
        "<abbr title='*****@*****.**'>David</abbr> "
        "a transféré l’amendement de « Test table » "
        "à « Ronan ([email protected]) ».")
Exemple #23
0
def test_tables_grab_amendement(
    app, lecture_an, amendements_an, user_david, david_has_no_amendement
):
    from zam_repondeur.models import Amendement

    email = user_david.email

    # We're redirected to our table
    resp = app.post(
        f"/dossiers/plfss-2018/lectures/an.15.269.PO717460/tables/{email}",
        {"n": [amendements_an[0].num], "submit-table": True},
        user=user_david,
    )

    # We're redirected to our table
    assert resp.status_code == 302
    assert resp.location == (
        "https://zam.test/"
        "dossiers/plfss-2018/"
        "lectures/an.15.269.PO717460/"
        "tables/[email protected]/"
    )

    # Reload amendement as it was updated in another transaction
    amendement = Amendement.get(lecture_an, amendements_an[0].num)

    assert_amendement_is_on_table_for(amendement, user_david)
    assert_amendement_has_event_with_summary(
        amendement,
        (
            "<abbr title='*****@*****.**'>David</abbr> "
            "a mis l’amendement sur sa table."
        ),
    )
Exemple #24
0
def test_generate_pdf_amendement_with_responses(app, lecture_senat,
                                                article1_senat):
    from zam_repondeur.models import Amendement, AmendementList
    from zam_repondeur.services.import_export.pdf import generate_html_for_pdf

    amendement = Amendement.create(
        lecture=lecture_senat,
        article=article1_senat,
        alinea="",
        num=42,
        rectif=1,
        auteur="M. DUPONT",
        groupe="RDSE",
        matricule="000000",
        corps="<p>L'article 1 est supprimé.</p>",
        expose="<p>Cet article va à l'encontre du principe d'égalité.</p>",
        resume="Suppression de l'article",
        position=1,
        avis="Favorable",
    )

    amdt_list = AmendementList([amendement])

    parser = HTMLParser(
        generate_html_for_pdf(
            DummyRequest(),
            "print/multiple.html",
            {
                "amendements": amdt_list,
                "article_amendements": amdt_list
            },
        ))

    assert _html_page_titles(parser) == ["Réponse", "Amendement nº 42 rect."]
Exemple #25
0
def test_tables_steal_amendement_resets_editing_status(
    app,
    lecture_an,
    amendements_an,
    user_david,
    david_has_one_amendement,
    user_ronan,
    team_zam,
):
    from zam_repondeur.models import Amendement, DBSession

    with transaction.manager:
        team_zam.users.append(user_ronan)
        DBSession.add(team_zam)

    amendements_an[0].start_editing()
    assert amendements_an[0].is_being_edited

    # Transfer amendement to ronan's table (stealing it from david)
    email = user_ronan.email
    app.post(
        f"/dossiers/plfss-2018/lectures/an.15.269.PO717460/tables/{email}",
        {"n": [amendements_an[0].num], "submit-table": True},
        user=user_ronan,
    )

    amendement = Amendement.get(lecture_an, amendements_an[0].num)
    assert not amendement.is_being_edited
Exemple #26
0
def test_export_csv_with_identique(lecture_an, article1_an, tmpdir):
    from zam_repondeur.export.spreadsheet import write_csv
    from zam_repondeur.models import DBSession, Amendement

    filename = str(tmpdir.join("test.csv"))

    amendements = [
        Amendement.create(
            lecture=lecture_an,
            article=article1_an,
            num=num,
            position=position,
            avis="Favorable",
            objet="Un objet très pertinent",
            reponse="Une réponse très appropriée",
            comments="Avec des commentaires",
        ) for position, num in enumerate((333, 444, 777), 1)
    ]
    amendements[0].id_identique = 42
    amendements[1].id_identique = 42
    DBSession.add_all(amendements)
    DBSession.add(lecture_an)

    counter = write_csv(lecture_an, filename, request={})

    assert counter["amendements"] == 3

    with Path(filename).open(encoding="utf-8-sig") as csv_file:
        reader = csv.DictReader(csv_file, delimiter=";")
        amendement1 = next(reader)
        assert amendement1["Identique"] == "333"
        amendement2 = next(reader)
        assert amendement2["Identique"] == "333"
        amendement3 = next(reader)
        assert amendement3["Identique"] == ""
def test_lecture_post_transfer_amendements_to_index(app, lecture_an,
                                                    amendements_an,
                                                    user_david):
    from zam_repondeur.models import DBSession, Amendement

    with transaction.manager:
        DBSession.add(amendements_an[0])
        table_david = user_david.table_for(lecture_an)
        table_david.amendements.append(amendements_an[0])

    resp = app.get(
        "/lectures/an.15.269.PO717460/transfer_amendements",
        {"nums": [amendements_an[0]]},
        user=user_david,
    )
    resp = resp.form.submit("submit-index")

    # We're redirected to our table
    assert resp.status_code == 302
    assert (
        resp.location ==
        f"https://zam.test/lectures/an.15.269.PO717460/tables/{user_david.email}"
    )

    # Reload amendement as it was updated in another transaction
    amendement = Amendement.get(lecture_an, amendements_an[0].num)

    # The amendement is now on the index
    assert amendement.user_table is None
    assert amendement.events[0].render_summary() == (
        "<abbr title='*****@*****.**'>David</abbr> "
        "a remis l’amendement dans l’index")
Exemple #28
0
def test_batch_amendements_is_hidden_when_selected_amendements_have_different_articles(
    wsgi_server,
    driver,
    lecture_an,
    article7bis_an,
    amendements_an,
    lecture_an_url,
    user_david,
    user_david_table_an,
):
    from zam_repondeur.models import Amendement, DBSession

    with transaction.manager:
        amendement = Amendement.create(lecture=lecture_an,
                                       article=article7bis_an,
                                       num=777)
        DBSession.add(user_david_table_an)
        user_david_table_an.add_amendement(amendements_an[0])
        user_david_table_an.add_amendement(amendements_an[1])
        user_david_table_an.add_amendement(amendement)

    driver.get(f"{lecture_an_url}/tables/{user_david.email}")
    checkboxes = driver.find_elements_by_css_selector(
        '[name="amendement-selected"]')
    checkboxes[0].click()
    checkboxes[1].click()
    checkboxes[2].click()
    group_actions = driver.find_element_by_css_selector(".groupActions")
    assert group_actions.is_displayed()
    batch_amendements = driver.find_element_by_css_selector(
        "#batch-amendements")
    assert not batch_amendements.is_displayed()
Exemple #29
0
def test_column_filtering_by_value_for_missions(
    wsgi_server,
    driver,
    lecture_plf2018_an_premiere_lecture_seance_publique_2,
    article1_plf2018_an_premiere_lecture_seance_publique_2,
    amendements_plf2018_an_premiere_lecture_seance_publique_2,
    column_index,
    input_text,
    kind,
    initial,
    filtered,
):
    from zam_repondeur.models import Amendement, DBSession

    LECTURE_URL = (
        f"{wsgi_server.application_url}"
        f"dossiers/"
        f"{lecture_plf2018_an_premiere_lecture_seance_publique_2.dossier.url_key}/"
        f"lectures/{lecture_plf2018_an_premiere_lecture_seance_publique_2.url_key}"
    )
    with transaction.manager:
        amendement = Amendement.create(
            lecture=lecture_plf2018_an_premiere_lecture_seance_publique_2,
            article=article1_plf2018_an_premiere_lecture_seance_publique_2,
            num=222,
            position=3,
            mission_titre="Mission Action extérieure de l'État",
            mission_titre_court="Action ext.",
        )
        DBSession.add(amendement)

    driver.get(f"{LECTURE_URL}/amendements/")
    trs = driver.find_elements_by_css_selector(f"tbody tr:not(.hidden-{kind})")
    assert extract_column_text(column_index, trs) == initial
    input_field = driver.find_element_by_css_selector(
        f"thead tr.filters th:nth-child({column_index}) input")
    input_field.send_keys(input_text)
    trs = driver.find_elements_by_css_selector(f"tbody tr:not(.hidden-{kind})")
    assert extract_column_text(column_index, trs) == filtered
    assert (
        driver.current_url ==
        f"{LECTURE_URL}/amendements/?{kind}={input_text.replace(' ', '+')}")

    # Restore initial state.
    input_field.send_keys(Keys.BACKSPACE * len(input_text))
    trs = driver.find_elements_by_css_selector(f"tbody tr:not(.hidden-{kind})")
    assert extract_column_text(column_index, trs) == initial
    assert driver.current_url == f"{LECTURE_URL}/amendements/"

    # Check filters are active on URL (re)load.
    driver.get(f"{LECTURE_URL}/amendements/?{kind}={input_text}")
    trs = driver.find_elements_by_css_selector(f"tbody tr:not(.hidden-{kind})")
    assert extract_column_text(column_index, trs) == filtered
    input_field = driver.find_element_by_css_selector(
        f"thead tr.filters th:nth-child({column_index}) input")
    input_field.send_keys(Keys.BACKSPACE * len(input_text))
    trs = driver.find_elements_by_css_selector(f"tbody tr:not(.hidden-{kind})")
    assert extract_column_text(column_index, trs) == initial
    assert driver.current_url == f"{LECTURE_URL}/amendements/"
Exemple #30
0
def test_column_filtering_by_value(
    wsgi_server,
    driver,
    lecture_an,
    lecture_an_url,
    article1_an,
    amendements_an,
    user_david_table_an,
    user_ronan_table_an,
    user_daniel_table_an,
    column_index,
    input_text,
    kind,
    initial,
    filtered,
):
    from zam_repondeur.models import Amendement, DBSession

    with transaction.manager:
        DBSession.add(user_ronan_table_an)
        DBSession.add(user_david_table_an)
        DBSession.add(user_daniel_table_an)

        user_ronan_table_an.add_amendement(amendements_an[0])
        user_david_table_an.add_amendement(amendements_an[1])
        amendement = Amendement.create(lecture=lecture_an,
                                       article=article1_an,
                                       num=777,
                                       position=3)
        user_daniel_table_an.add_amendement(amendement)

    driver.get(f"{lecture_an_url}/amendements/")
    trs = driver.find_elements_by_css_selector(f"tbody tr:not(.hidden-{kind})")
    assert extract_column_text(column_index, trs) == initial
    input_field = driver.find_element_by_css_selector(
        f"thead tr.filters th:nth-child({column_index}) input")
    input_field.send_keys(input_text)
    trs = driver.find_elements_by_css_selector(f"tbody tr:not(.hidden-{kind})")
    assert extract_column_text(column_index, trs) == filtered
    assert (
        driver.current_url ==
        f"{lecture_an_url}/amendements/?{kind}={input_text.replace(' ', '+')}")

    # Restore initial state.
    input_field.send_keys(Keys.BACKSPACE * len(input_text))
    trs = driver.find_elements_by_css_selector(f"tbody tr:not(.hidden-{kind})")
    assert extract_column_text(column_index, trs) == initial
    assert driver.current_url == f"{lecture_an_url}/amendements/"

    # Check filters are active on URL (re)load.
    driver.get(f"{lecture_an_url}/amendements/?{kind}={input_text}")
    trs = driver.find_elements_by_css_selector(f"tbody tr:not(.hidden-{kind})")
    assert extract_column_text(column_index, trs) == filtered
    input_field = driver.find_element_by_css_selector(
        f"thead tr.filters th:nth-child({column_index}) input")
    input_field.send_keys(Keys.BACKSPACE * len(input_text))
    trs = driver.find_elements_by_css_selector(f"tbody tr:not(.hidden-{kind})")
    assert extract_column_text(column_index, trs) == initial
    assert driver.current_url == f"{lecture_an_url}/amendements/"