Exemplo n.º 1
0
    def test_new_dossier_is_added(self):
        from zam_repondeur.models import DBSession, Dossier
        from zam_repondeur.services.data import repository
        from zam_repondeur.services.fetch.an.dossiers.models import DossierRef
        from zam_repondeur.tasks.periodic import create_missing_dossiers_an

        assert DBSession.query(Dossier).filter_by(
            an_id="nouveau").first() is None

        repository.set_opendata_dossier_ref(
            DossierRef(
                uid="nouveau",
                titre="Titre nouveau",
                slug="titre-nouveau",
                an_url="",
                senat_url="",
                lectures=[],
            ))

        with patch.object(repository, "list_opendata_dossiers") as mock_list:
            mock_list.return_value = ["existant", "nouveau"]

            create_missing_dossiers_an()

        dossier = DBSession.query(Dossier).filter_by(an_id="nouveau").one()

        assert dossier.an_id == "nouveau"
        assert dossier.titre == "Titre nouveau"
        assert dossier.slug == "titre-nouveau"
Exemplo n.º 2
0
def test_post_amendement_edit_form_reset_editing_state(app, lecture_an_url,
                                                       amendements_an_batch,
                                                       user_david,
                                                       user_david_table_an):
    from zam_repondeur.models import Amendement, DBSession

    amendement_666, amendement_999 = amendements_an_batch
    with transaction.manager:
        DBSession.add(user_david_table_an)
        user_david_table_an.add_amendement(amendement_666)
        user_david_table_an.add_amendement(amendement_999)

    amendement_666.start_editing()
    assert amendement_666.is_being_edited
    amendement_999.start_editing()
    assert amendement_999.is_being_edited

    resp = app.get(f"{lecture_an_url}/amendements/999/", user=user_david)
    form = resp.forms["edit-amendement"]
    form["avis"] = "Favorable"
    form["objet"] = "Un objet très pertinent"
    form["reponse"] = "Une réponse <strong>très</strong> appropriée"
    form["comments"] = "Avec des <table><tr><td>commentaires</td></tr></table>"
    resp = form.submit("save")

    amendement_666 = DBSession.query(Amendement).filter(
        Amendement.num == 666).one()
    assert not amendement_666.is_being_edited
    amendement_999 = DBSession.query(Amendement).filter(
        Amendement.num == 999).one()
    assert not amendement_999.is_being_edited
Exemplo n.º 3
0
    def test_custom_article_titles_are_preserved(self, app, lecture_an,
                                                 amendements_an):
        from zam_repondeur.models import Amendement, DBSession
        from zam_repondeur.services.fetch.articles import get_articles

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

        DBSession.add(lecture_an)

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.article.user_content.title == ""
        assert amendement.article.content == {}

        # Let's set a custom article title
        amendement.article.user_content.title = "My custom title"

        changed = get_articles(lecture_an)

        assert changed

        # We can get the article contents from an amendement
        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.article.user_content.title == "My custom title"
        assert amendement.article.content["001"].startswith(
            "Au titre de l'exercice 2016")
Exemplo n.º 4
0
    def test_existing_articles_are_updated(self, app, lecture_an,
                                           amendements_an):
        from zam_repondeur.fetch.articles import get_articles
        from zam_repondeur.models import DBSession, Amendement

        responses.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,
        )

        DBSession.add(lecture_an)

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.article.user_content.title == ""
        assert amendement.article.content == {}

        changed = get_articles(lecture_an)

        assert changed

        # We can get the article contents from an amendement
        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert (amendement.article.user_content.title ==
                "Dispositions relatives l'exercice 2016")
        assert amendement.article.content["001"].startswith(
            "Au titre de l'exercice 2016")
def test_lecture_post_transfer_amendements_to_other_from_index(
        app, lecture_an, amendements_an, user_david, user_ronan):
    from zam_repondeur.models import DBSession, User

    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]],
            "from_index": 1
        },
        user=user_david,
    )
    form = resp.form
    form["target"] = user_ronan.email
    resp = form.submit()
    assert resp.status_code == 302
    assert resp.location == "https://zam.test/lectures/an.15.269.PO717460/amendements"
    user_david = DBSession.query(User).filter(
        User.email == user_david.email).first()
    table_david = user_david.table_for(lecture_an)
    assert len(table_david.amendements) == 0
    user_ronan = DBSession.query(User).filter(
        User.email == user_ronan.email).first()
    table_ronan = user_ronan.table_for(lecture_an)
    assert len(table_ronan.amendements) == 1
    assert table_ronan.amendements[0].events[0].render_summary() == (
        "<abbr title='*****@*****.**'>David</abbr> "
        "a transféré l’amendement à « Ronan ([email protected]) »")
Exemplo n.º 6
0
    def test_upload_backup_with_affectation_to_unknown_user_without_team(
            self, app, user_ronan):
        from zam_repondeur.models import DBSession, Amendement
        from zam_repondeur.models.events.amendement import AmendementTransfere

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.user_table is None

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 999).first()
        assert amendement.user_table is None

        self._upload_backup(app, "backup_with_affectation.json", user_ronan)

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.user_table.user.email == "*****@*****.**"
        assert amendement.user_table.user.name == "David2"
        assert amendement.user_table.user.teams == []
        events = {type(event): event for event in amendement.events}
        assert AmendementTransfere in events

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 999).first()
        assert amendement.user_table is None
        events = {type(event): event for event in amendement.events}
        assert AmendementTransfere not in events
Exemplo n.º 7
0
def test_new_user_without_name_get_an_error(app):
    from zam_repondeur.models import DBSession, User

    user = DBSession.query(User).filter_by(
        email="*****@*****.**").first()
    assert user is None

    resp = app.post("/identification", {"email": "*****@*****.**"})
    assert resp.status_code == 302
    assert (
        resp.location ==
        "https://zam.test/bienvenue?source=https%3A%2F%2Fzam.test%2Flectures%2F"
    )

    user = DBSession.query(User).filter_by(
        email="*****@*****.**").first()
    assert user.name is None

    resp = resp.follow()
    assert resp.form["name"].value == "Jane Doe"  # prefilled based on email

    resp.form["name"] = ""
    resp = resp.form.submit()

    assert resp.status_code == 302
    assert resp.location == "https://zam.test/bienvenue"
    resp = resp.follow()
    assert "La saisie d’un nom est requise." in resp.text

    user = DBSession.query(User).filter_by(
        email="*****@*****.**").first()
    assert user.name is None
Exemplo n.º 8
0
    def test_new_texte_is_added(self):
        from zam_repondeur.models import Chambre, DBSession, Texte, TypeTexte
        from zam_repondeur.services.data import repository
        from zam_repondeur.services.fetch.an.dossiers.models import TexteRef
        from zam_repondeur.tasks.periodic import create_missing_textes

        assert (
            DBSession.query(Texte)
            .filter_by(chambre=Chambre.AN, numero=124, legislature=15)
            .first()
            is None
        )

        repository.set_opendata_texte_ref(
            TexteRef(
                uid="bar",
                type_=TypeTexte.PROJET,
                chambre=Chambre.AN,
                legislature=15,
                numero=124,
                titre_long="Titre long",
                titre_court="Titre court",
                date_depot=date(2019, 9, 6),
            )
        )

        create_missing_textes({"bar"})

        texte = (
            DBSession.query(Texte)
            .filter_by(chambre=Chambre.AN, numero=124, legislature=15)
            .one()
        )
        assert texte.type_ == TypeTexte.PROJET
        assert texte.date_depot == date(2019, 9, 6)
Exemplo n.º 9
0
def test_user_unset_team(team_zam, user_david):
    from zam_repondeur.models import DBSession, User

    user_david.teams.append(team_zam)
    user_david = DBSession.query(User).first()
    user_david.teams.remove(team_zam)
    assert DBSession.query(User).first().teams == []
Exemplo n.º 10
0
    def test_upload_affectation_box_existing_not_updated(
            self, app, lecture_an, user_david):
        from zam_repondeur.models import Amendement, DBSession, SharedTable
        from zam_repondeur.models.events.amendement import AmendementTransfere

        with transaction.manager:
            DBSession.add_all([user_david])
            amendement = (DBSession.query(Amendement).filter(
                Amendement.num == 666).first())
            shared_table = SharedTable.create(lecture=lecture_an,
                                              titre="PréRIM")
            shared_table.add_amendement(amendement)

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.location.shared_table.titre == "PréRIM"

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 999).first()
        assert amendement.location.shared_table is None

        self._upload_backup(app, "backup_with_affectation_box.json",
                            user_david)

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.location.shared_table.titre == "PréRIM"

        # No transfer event has been created
        assert not any(event for event in amendement.events
                       if isinstance(event, AmendementTransfere))

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 999).first()
        assert amendement.location.shared_table is None
Exemplo n.º 11
0
def test_post_article_edit_form_title_redirect_next(app, lecture_an,
                                                    amendements_an,
                                                    user_david):
    from zam_repondeur.models import Amendement, Article, DBSession

    with transaction.manager:
        article_2 = Article.create(lecture=lecture_an, type="article", num="2")
        DBSession.add(article_2)
        DBSession.add(lecture_an)

    amendement = DBSession.query(Amendement).filter(
        Amendement.num == 999).one()
    assert amendement.article.user_content.title == ""

    resp = app.get(
        "/dossiers/plfss-2018/lectures/an.15.269.PO717460/articles/article.1../",
        user=user_david,
    )
    form = resp.forms["edit-article"]
    form["title"] = "Titre article"
    resp = form.submit()

    assert resp.status_code == 302
    assert resp.location == (
        "https://zam.test"
        "/dossiers/plfss-2018/lectures/an.15.269.PO717460/articles/article.2../"
    )

    amendement = DBSession.query(Amendement).filter(
        Amendement.num == 999).one()
    assert amendement.article.user_content.title == "Titre article"
Exemplo n.º 12
0
    def test_upload_affectation_box_new(self, app, lecture_an, user_david):
        from zam_repondeur.models import Amendement, DBSession
        from zam_repondeur.models.events.amendement import AmendementTransfere

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.location.shared_table is None

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 999).first()
        assert amendement.location.shared_table is None

        self._upload_backup(app, "backup_with_affectation_box.json",
                            user_david)

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.location.shared_table.titre == "PréRIM"

        # A transfer event has been created
        assert any(
            isinstance(event, AmendementTransfere)
            for event in amendement.events)
        transfer_event = next(event for event in amendement.events
                              if isinstance(event, AmendementTransfere))
        assert str(transfer_event.user) == "David ([email protected])"
        assert transfer_event.data["old_value"] == ""
        assert transfer_event.data["new_value"] == "PréRIM"
        assert transfer_event.render_summary() == (
            "<abbr title='*****@*****.**'>David</abbr> "
            "a transféré l’amendement à « PréRIM ».")

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 999).first()
        assert amendement.location.shared_table is None
Exemplo n.º 13
0
    def test_upload_backup_with_affectation_to_unknown_user_without_team(
            self, app, user_david, team_zam):
        from zam_repondeur.models import Amendement, DBSession
        from zam_repondeur.models.events.amendement import AmendementTransfere

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.location.user_table is None

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 999).first()
        assert amendement.location.user_table is None

        self._upload_backup(app, "backup_with_affectation_new.json",
                            user_david)

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.location.user_table.user.email == "*****@*****.**"
        assert amendement.location.user_table.user.name == "Mélodie"
        assert amendement.location.user_table.user.teams[0].pk == team_zam.pk
        events = {type(event): event for event in amendement.events}
        assert AmendementTransfere in events

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 999).first()
        assert amendement.location.user_table is None
        events = {type(event): event for event in amendement.events}
        assert AmendementTransfere not in events
Exemplo n.º 14
0
def test_post_article_edit_form_title(app, lecture_an, amendements_an, user_david):
    from zam_repondeur.models.events.article import TitreArticleModifie
    from zam_repondeur.models import Amendement, DBSession

    amendement = DBSession.query(Amendement).filter(Amendement.num == 999).one()

    resp = app.get(
        "/lectures/an.15.269.PO717460/articles/article.1../", user=user_david
    )
    form = resp.forms["edit-article"]
    form["title"] = "Titre article"
    resp = form.submit()

    amendement = DBSession.query(Amendement).filter(Amendement.num == 999).one()

    assert len(amendement.article.events) == 1
    event = amendement.article.events[0]
    assert isinstance(event, TitreArticleModifie)
    assert event.created_at is not None
    assert event.user.email == "*****@*****.**"
    assert event.data["old_value"] == ""
    assert event.data["new_value"] == "Titre article"
    assert (
        event.render_summary()
        == "<abbr title='*****@*****.**'>[email protected]</abbr> a ajouté le titre"
    )
    assert event.render_details() == "<ins>Titre article</ins> <del></del>"
Exemplo n.º 15
0
def test_lecture_delete(app, dummy_lecture, dummy_amendements):
    from zam_repondeur.models import Amendement, DBSession, Lecture

    assert Lecture.exists(
        chambre=dummy_lecture.chambre,
        session=dummy_lecture.session,
        num_texte=dummy_lecture.num_texte,
        organe=dummy_lecture.organe,
    )
    assert DBSession.query(Amendement).count() == 2

    form = app.get("http://localhost/lectures/an.15.269.PO717460/"
                   ).forms["delete-lecture"]

    resp = form.submit()

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

    resp = resp.follow()

    assert resp.status_code == 200
    assert "Lecture supprimée avec succès." in resp.text

    assert not Lecture.exists(
        chambre=dummy_lecture.chambre,
        session=dummy_lecture.session,
        num_texte=dummy_lecture.num_texte,
        organe=dummy_lecture.organe,
    )
    assert DBSession.query(Amendement).count() == 0
Exemplo n.º 16
0
def test_post_reponse_edit_form(app, dummy_lecture, dummy_amendements):

    from zam_repondeur.models import Amendement, DBSession

    amendement = DBSession.query(Amendement).filter(
        Amendement.num == 999).one()
    assert amendement.avis is None
    assert amendement.observations is None
    assert amendement.reponse is None

    resp = app.get(
        "http://localhost/lectures/an.15.269.PO717460/amendements/999/reponse")
    form = resp.forms["edit-reponse"]
    form["avis"] = "Favorable"
    form["observations"] = "Des observations très pertinentes"
    form["reponse"] = "Une réponse très appropriée"
    form["comments"] = "Avec des commentaires"
    resp = form.submit()

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

    amendement = DBSession.query(Amendement).filter(
        Amendement.num == 999).one()
    assert amendement.avis == "Favorable"
    assert amendement.observations == "Des observations très pertinentes"
    assert amendement.reponse == "Une réponse très appropriée"
    assert amendement.comments == "Avec des commentaires"
Exemplo n.º 17
0
def test_amendement_stop_editing(
    app, lecture_an_url, amendements_an_batch, user_david, user_david_table_an
):
    from zam_repondeur.models import Amendement, DBSession

    amendement_666 = amendements_an_batch[0]
    amendement_999 = amendements_an_batch[1]
    with transaction.manager:
        DBSession.add(user_david_table_an)
        user_david_table_an.add_amendement(amendement_666)
        user_david_table_an.add_amendement(amendement_999)

    assert not amendement_666.is_being_edited
    assert not amendement_999.is_being_edited

    resp = app.post_json(
        f"{lecture_an_url}/amendements/{amendement_666.num}/start_editing",
        user=user_david,
    )
    resp = app.post_json(
        f"{lecture_an_url}/amendements/{amendement_666.num}/stop_editing",
        user=user_david,
    )

    assert resp.status_code == 200
    assert resp.content_type == "application/json"

    amendement_666 = DBSession.query(Amendement).get(amendement_666.pk)
    amendement_999 = DBSession.query(Amendement).get(amendement_999.pk)
    assert not amendement_666.is_being_edited
    assert not amendement_999.is_being_edited
Exemplo n.º 18
0
    def test_upload_with_affectation_to_unknown_user_without_team(
            self, app, user_david):
        from zam_repondeur.models import DBSession, Amendement
        from zam_repondeur.models.events.amendement import AmendementTransfere

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.user_table is None

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 999).first()
        assert amendement.user_table is None

        self._upload_csv(app, "reponses_with_affectation.csv", user=user_david)

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.user_table.user.email == "*****@*****.**"
        assert amendement.user_table.user.name == "Mélodie Dahi"
        events = {type(event): event for event in amendement.events}
        assert AmendementTransfere in events

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 999).first()
        assert amendement.user_table is None
        events = {type(event): event for event in amendement.events}
        assert AmendementTransfere not in events
Exemplo n.º 19
0
    def test_upload_updates_affectation(self, app, lecture_an, user_david,
                                        user_ronan):
        from zam_repondeur.models import DBSession, Amendement

        with transaction.manager:
            DBSession.add_all([user_david, user_ronan])
            amendement = (DBSession.query(Amendement).filter(
                Amendement.num == 666).first())
            amendement.user_table = user_ronan.table_for(lecture_an)

        assert amendement.user_table.user.email == "*****@*****.**"
        assert amendement.user_table.user.name == "Ronan"

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 999).first()
        assert amendement.user_table is None

        self._upload_backup(app, "backup_with_affectation.json", user_ronan)

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 666).first()
        assert amendement.user_table.user.email == "*****@*****.**"
        assert (amendement.user_table.user.name == "David"
                )  # Should not override the name of an existing user.

        amendement = DBSession.query(Amendement).filter(
            Amendement.num == 999).first()
        assert amendement.user_table is None
Exemplo n.º 20
0
def test_post_article_edit_form_presentation(app, lecture_an, amendements_an,
                                             user_david):
    from zam_repondeur.models import Amendement, DBSession
    from zam_repondeur.models.events.article import PresentationArticleModifiee

    with transaction.manager:
        DBSession.add(user_david)

    amendement = DBSession.query(Amendement).filter(
        Amendement.num == 999).one()

    resp = app.get(
        "/dossiers/plfss-2018/lectures/an.15.269.PO717460/articles/article.1../",
        user=user_david,
    )
    form = resp.forms["edit-article"]
    form["presentation"] = "<p>Content</p>"
    resp = form.submit()

    amendement = DBSession.query(Amendement).filter(
        Amendement.num == 999).one()

    assert len(amendement.article.events) == 1
    event = amendement.article.events[0]
    assert isinstance(event, PresentationArticleModifiee)
    assert event.created_at is not None
    assert event.user.email == "*****@*****.**"
    assert event.data["old_value"] == ""
    assert event.data["new_value"] == "<p>Content</p>"
    assert event.render_summary() == (
        "<abbr title='*****@*****.**'>David</abbr> a ajouté la présentation."
    )
    assert event.render_details() == "<p><ins>Content</ins></p> <del></del>"
Exemplo n.º 21
0
def test_new_user_must_enter_their_name_on_the_welcome_page(app):
    from zam_repondeur.models import DBSession, User

    user = DBSession.query(User).filter_by(
        email="*****@*****.**").first()
    assert user is None

    resp = app.post("/identification", {"email": "*****@*****.**"})
    assert resp.status_code == 302
    assert (
        resp.location ==
        "https://zam.test/bienvenue?source=https%3A%2F%2Fzam.test%2Flectures%2F"
    )

    user = DBSession.query(User).filter_by(
        email="*****@*****.**").first()
    assert user.name is None

    resp = resp.follow()
    assert resp.form["name"].value == "Jane Doe"  # prefilled based on email

    resp.form["name"] = " Something Else  "
    resp.form.submit()

    user = DBSession.query(User).filter_by(
        email="*****@*****.**").first()
    assert user.name == "Something Else"
Exemplo n.º 22
0
def test_lecture_post_transfer_amendements_to_index_from_index(
        app, lecture_an, lecture_an_url, amendements_an, user_david):
    from zam_repondeur.models import Amendement, DBSession, User

    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]],
            "from_index": 1
        },
        user=user_david,
    )
    resp = resp.forms["transfer-amendements"].submit("submit-index")
    assert resp.status_code == 302
    assert resp.location == f"https://zam.test{lecture_an_url}/amendements/"
    user_david = DBSession.query(User).filter(
        User.email == user_david.email).first()
    table = user_david.table_for(lecture_an)
    assert len(table.amendements) == 0
    amendement = (DBSession.query(Amendement).filter(
        Amendement.num == amendements_an[0].num).first())
    assert amendement.events[0].render_summary() == (
        "<abbr title='*****@*****.**'>David</abbr> "
        "a remis l’amendement dans l’index.")
def test_lecture_post_transfer_amendements_to_index_from_index(
        app, lecture_an, amendements_an, user_david):
    from zam_repondeur.models import DBSession, User, 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]],
            "from_index": 1
        },
        user=user_david,
    )
    resp = resp.form.submit("submit-index")
    assert resp.status_code == 302
    assert resp.location == "https://zam.test/lectures/an.15.269.PO717460/amendements"
    user_david = DBSession.query(User).filter(
        User.email == user_david.email).first()
    table = user_david.table_for(lecture_an)
    assert len(table.amendements) == 0
    amendement = (DBSession.query(Amendement).filter(
        Amendement.num == amendements_an[0].num).first())
    assert amendement.events[0].render_summary() == (
        "<abbr title='*****@*****.**'>David</abbr> "
        "a remis l’amendement dans l’index")
Exemplo n.º 24
0
def test_lecture_post_transfer_amendements_to_other(app, lecture_an,
                                                    amendements_an, user_david,
                                                    user_ronan):
    from zam_repondeur.models import DBSession, User

    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,
    )
    form = resp.forms["transfer-amendements"]
    form["target"] = user_ronan.email
    resp = form.submit()
    assert resp.status_code == 302
    assert resp.location == (("https://zam.test/"
                              "dossiers/plfss-2018/"
                              "lectures/an.15.269.PO717460/"
                              "tables/[email protected]/"))
    user_david = DBSession.query(User).filter(
        User.email == user_david.email).first()
    table_david = user_david.table_for(lecture_an)
    assert len(table_david.amendements) == 0
    user_ronan = DBSession.query(User).filter(
        User.email == user_ronan.email).first()
    table_ronan = user_ronan.table_for(lecture_an)
    assert len(table_ronan.amendements) == 1
    assert table_ronan.amendements[0].events[0].render_summary() == (
        "<abbr title='*****@*****.**'>David</abbr> "
        "a transféré l’amendement à « Ronan ([email protected]) ».")
Exemplo n.º 25
0
    def test_delete(self, app, user_sgg, user_david):
        from zam_repondeur.models import DBSession, User

        with transaction.manager:
            user_david.admin_at = datetime.utcnow()
            DBSession.add(user_david)

        assert DBSession.query(User).filter(User.admin_at.isnot(None)).count() == 2

        resp = app.get("/admins/", user=user_sgg)

        form = resp.forms[1]
        form["user_pk"] = user_david.pk

        resp = form.submit()

        assert resp.status_code == 302
        assert resp.location == "https://zam.test/admins/"

        resp = resp.follow()

        assert resp.status_code == 200
        assert resp.content_type == "text/html"

        assert len(resp.parser.css(".box ul li")) == 1
        assert DBSession.query(User).filter(User.admin_at.isnot(None)).count() == 1

        with transaction.manager:
            DBSession.add(user_sgg)
            assert len(user_sgg.events) == 1
            assert user_sgg.events[0].render_summary() == (
                "<abbr title='*****@*****.**'>SGG user</abbr> a retiré "
                "<abbr title='*****@*****.**'>David ([email protected])"
                "</abbr> de la liste des administrateur·ice·s."
            )
Exemplo n.º 26
0
def test_post_form_with_comments(app, dummy_lecture, dummy_amendements):
    from zam_repondeur.models import DBSession, Amendement

    form = app.get(
        "/lectures/an.15.269.PO717460/amendements/").forms["import-form"]
    path = Path(__file__).parent / "sample_data" / "reponses_with_comments.csv"
    form["reponses"] = Upload("file.csv", path.read_bytes())

    resp = form.submit()

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

    resp = resp.follow()

    assert resp.status_code == 200
    assert "2 réponses chargées" in resp.text

    amendement = DBSession.query(Amendement).filter(
        Amendement.num == 666).first()
    assert amendement.position == 1
    assert amendement.comments == "A comment"

    amendement = DBSession.query(Amendement).filter(
        Amendement.num == 999).first()
    assert amendement.position == 2
    assert amendement.comments == ""
Exemplo n.º 27
0
    def test_new_user_must_enter_their_name_on_the_welcome_page(self, app):
        from zam_repondeur.auth import generate_auth_token
        from zam_repondeur.models import DBSession, User
        from zam_repondeur.services.users import repository

        user = DBSession.query(User).filter_by(
            email="*****@*****.**").first()
        assert user is None

        token = generate_auth_token()

        repository.set_auth_token("*****@*****.**", token)

        resp = app.get("/authentification", params={"token": token})
        assert resp.status_code == 302
        assert (
            resp.location ==
            "https://zam.test/bienvenue?source=https%3A%2F%2Fzam.test%2Fdossiers%2F"
        )

        user = DBSession.query(User).filter_by(
            email="*****@*****.**").first()
        assert user.name is None

        resp = resp.follow()
        assert resp.form["name"].value == "Jane Doe"  # prefilled based on email

        resp.form["name"] = " Something Else  "
        resp.form.submit()

        user = DBSession.query(User).filter_by(
            email="*****@*****.**").first()
        assert user.name == "Something Else"
Exemplo n.º 28
0
def test_post_form_semicolumns(app, dummy_lecture, dummy_amendements):
    from zam_repondeur.models import DBSession, Amendement

    form = app.get(
        "/lectures/an.15.269.PO717460/amendements/").forms["import-form"]
    path = Path(__file__).parent / "sample_data" / "reponses_semicolumns.csv"
    form["reponses"] = Upload("file.csv", path.read_bytes())

    resp = form.submit()

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

    resp = resp.follow()

    assert resp.status_code == 200
    assert "2 réponses chargées" in resp.text

    amendement = DBSession.query(Amendement).filter(
        Amendement.num == 666).first()
    assert amendement.avis == "Défavorable"
    assert amendement.position == 1
    assert "<strong>ipsum</strong>" in amendement.observations
    assert "<blink>amet</blink>" not in amendement.observations

    assert "<i>tempor</i>" in amendement.reponse
    assert "<u>aliqua</u>" not in amendement.reponse

    amendement = DBSession.query(Amendement).filter(
        Amendement.num == 999).first()
    assert amendement.observations.startswith("Lorem")
    assert amendement.position == 2
Exemplo n.º 29
0
    def test_same_avis_and_same_reponse(self, amendements_an):
        from zam_repondeur.models import Amendement, DBSession

        amendements_an = DBSession.query(Amendement).all()

        amendement_666, amendement_999 = amendements_an

        assert list(amendement_666._displayable_identiques()) == []
        assert list(amendement_999._displayable_identiques()) == []

        with transaction.manager:
            DBSession.add_all(amendements_an)
            amendement_666.id_identique = 41
            amendement_999.id_identique = 41
            amendement_666.id_discussion_commune = 42
            amendement_999.id_discussion_commune = 42
            amendement_666.user_content.avis = "Favorable"
            amendement_999.user_content.avis = "Favorable"
            amendement_666.user_content.reponse = "Une réponse"
            amendement_999.user_content.reponse = "Une réponse"

        amendements_an = DBSession.query(Amendement).all()  # reload

        amendement_666, amendement_999 = amendements_an

        assert list(
            amendement_666._displayable_identiques()) == [amendement_999]
        assert list(
            amendement_999._displayable_identiques()) == [amendement_666]
        assert amendement_666.all_displayable_identiques_have_same_response()
        assert amendement_999.all_displayable_identiques_have_same_response()
Exemplo n.º 30
0
def test_post_shared_tables_delete_form(app, lecture_an, amendements_an,
                                        user_david, shared_table_lecture_an):
    from zam_repondeur.models import DBSession, Lecture, SharedTable

    with transaction.manager:
        DBSession.add(user_david)

    assert (DBSession.query(SharedTable).filter(
        SharedTable.titre == "Test table").count() == 1)
    resp = app.get(
        "/dossiers/plfss-2018/lectures/an.15.269.PO717460/boites/test-table/delete",
        user=user_david,
    )
    resp = resp.forms["box-delete"].submit()

    assert resp.status_code == 302
    assert resp.location == ("https://zam.test"
                             "/dossiers/plfss-2018"
                             "/lectures/an.15.269.PO717460"
                             "/options#shared-tables")

    resp = resp.follow()
    assert resp.status_code == 200
    assert "Test table" in resp.text  # From notification.
    assert (DBSession.query(SharedTable).filter(
        SharedTable.titre == "Test table").count() == 0)

    # A dedicated event should be created.
    lecture_an = Lecture.get_by_pk(lecture_an.pk)  # refresh object
    assert len(lecture_an.events) == 1
    assert lecture_an.events[0].render_summary() == (
        "<abbr title='*****@*****.**'>David</abbr> "
        "a supprimé la boîte « Test table »")