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
Beispiel #2
0
def test_post_form(app):
    from zam_repondeur.models import Lecture

    assert not Lecture.exists(
        chambre="an", session="15", num_texte=269, organe="PO717460"
    )

    # We cannot use form.submit() given the form is dynamic and does not
    # contain choices for lectures (dynamically loaded via JS).
    resp = app.post(
        "/lectures/add",
        {"dossier": "DLR5L15N36030", "lecture": "PRJLANR5L15B0269-PO717460"},
    )

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

    resp = resp.follow()

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

    lecture = Lecture.get(chambre="an", session="15", num_texte=269, organe="PO717460")
    assert lecture.chambre == "an"
    assert lecture.titre == "1ère lecture"
    assert lecture.dossier_legislatif == "Sécurité sociale : loi de financement 2018"
Beispiel #3
0
    def post(self) -> Response:
        dossier = self._get_dossier()
        lecture = self._get_lecture(dossier)

        chambre = lecture.chambre.value
        num_texte = lecture.texte.numero
        titre = lecture.titre
        organe = lecture.organe

        # FIXME: use date_depot to find the right session?
        if lecture.chambre == Chambre.AN:
            session = "15"
        else:
            session = "2017-2018"

        if LectureModel.exists(chambre, session, num_texte, organe):
            self.request.session.flash(
                ("warning", "Cette lecture existe déjà..."))
        else:
            LectureModel.create(chambre, session, num_texte, titre, organe,
                                dossier.titre)
            self.request.session.flash(
                ("success", "Lecture créée avec succès."))

        resource = self.context[f"{chambre}.{session}.{num_texte}.{organe}"]
        return HTTPFound(location=self.request.resource_url(resource))
Beispiel #4
0
def test_post_form_already_exists(
    app, texte_plfss2018_an_premiere_lecture, lecture_an, user_david
):
    from zam_repondeur.models import DBSession, Lecture

    assert Lecture.exists(
        chambre="an",
        session="15",
        texte=texte_plfss2018_an_premiere_lecture,
        partie=None,
        organe="PO717460",
    )

    # We cannot use form.submit() given the form is dynamic and does not
    # contain choices for lectures (dynamically loaded via JS).
    resp = app.post(
        "/lectures/add",
        {"dossier": "DLR5L15N36030", "lecture": "PRJLANR5L15B0269-PO717460-"},
        user=user_david,
    )

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

    resp = resp.follow()

    assert resp.status_code == 200
    assert "Cette lecture existe déjà…" in resp.text

    DBSession.add(lecture_an)
    assert len(lecture_an.events) == 0
Beispiel #5
0
def test_post_form_already_exists(app, dummy_lecture):
    from zam_repondeur.models import Lecture

    assert Lecture.exists(chambre="an",
                          session="15",
                          num_texte=269,
                          organe="PO717460")

    # We cannot use form.submit() given the form is dynamic and does not
    # contain choices for lectures (dynamically loaded via JS).
    resp = app.post(
        "/lectures/add",
        {
            "dossier": "DLR5L15N36030",
            "lecture": "PRJLANR5L15B0269-PO717460"
        },
    )

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

    resp = resp.follow()

    assert resp.status_code == 200
    assert "Cette lecture existe déjà..." in resp.text
def test_lecture_delete(app, lecture_an, amendements_an, zam_user):
    from zam_repondeur.models import Amendement, DBSession, Lecture

    assert zam_user.email.endswith("@zam.beta.gouv.fr")

    assert Lecture.exists(
        chambre=lecture_an.chambre,
        session=lecture_an.session,
        texte=lecture_an.texte,
        partie=None,
        organe=lecture_an.organe,
    )
    assert DBSession.query(Amendement).count() == 2

    resp = app.get("/lectures/an.15.269.PO717460/options", user=zam_user)
    form = resp.forms["delete-lecture"]

    resp = form.submit()

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

    resp = resp.follow()

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

    resp = resp.follow()

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

    assert not Lecture.exists(
        chambre=lecture_an.chambre,
        session=lecture_an.session,
        texte=lecture_an.texte,
        partie=None,
        organe=lecture_an.organe,
    )
    assert DBSession.query(Amendement).count() == 0
def test_lecture_delete_non_zam_user(app, lecture_an, amendements_an,
                                     user_david, user_david_table_an):
    from zam_repondeur.models import Amendement, DBSession, Lecture

    assert not user_david.email.endswith("@zam.beta.gouv.fr")

    assert Lecture.exists(
        chambre=lecture_an.chambre,
        session=lecture_an.session,
        texte=lecture_an.texte,
        partie=None,
        organe=lecture_an.organe,
    )
    assert DBSession.query(Amendement).count() == 2

    resp = app.get("/lectures/an.15.269.PO717460/options", user=user_david)
    assert "delete-lecture" not in resp.forms

    # The user bypasses the protection or we messed up.
    resp = app.post("/lectures/an.15.269.PO717460/", user=user_david)

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

    resp = resp.follow()

    assert resp.status_code == 200
    assert "Vous n’avez pas les droits pour supprimer une lecture." in resp.text

    assert Lecture.exists(
        chambre=lecture_an.chambre,
        session=lecture_an.session,
        texte=lecture_an.texte,
        partie=None,
        organe=lecture_an.organe,
    )
    assert DBSession.query(Amendement).count() == 2
Beispiel #8
0
    def post(self) -> Response:
        dossier_ref = self._get_dossier_ref()
        lecture_ref = self._get_lecture_ref(dossier_ref)

        chambre = lecture_ref.chambre.value
        titre = lecture_ref.titre
        organe = lecture_ref.organe
        partie = lecture_ref.partie

        session = lecture_ref.get_session()
        texte = lecture_ref.texte

        assert texte.date_depot is not None

        texte_model = get_one_or_create(
            TexteModel,
            uid=texte.uid,
            type_=texte.type_,
            chambre=Chambre.AN
            if lecture_ref.chambre.value == "an" else Chambre.SENAT,
            legislature=int(session) if chambre == "an" else None,
            session=int(session.split("-")[0]) if chambre == "senat" else None,
            numero=texte.numero,
            titre_long=texte.titre_long,
            titre_court=texte.titre_court,
            date_depot=texte.date_depot,
        )[0]

        dossier_model = get_one_or_create(DossierModel,
                                          uid=dossier_ref.uid,
                                          titre=dossier_ref.titre)[0]

        if LectureModel.exists(chambre, session, texte_model, partie, organe):
            self.request.session.flash(
                Message(cls="warning", text="Cette lecture existe déjà…"))
            return HTTPFound(location=self.request.resource_url(self.context))

        lecture_model: LectureModel = LectureModel.create(
            owned_by_team=self.request.team,
            chambre=chambre,
            session=session,
            texte=texte_model,
            partie=partie,
            titre=titre,
            organe=organe,
            dossier=dossier_model,
        )
        get_articles(lecture_model)
        LectureCreee.create(self.request, lecture=lecture_model)
        ArticlesRecuperes.create(request=None, lecture=lecture_model)
        # Call to fetch_* tasks below being asynchronous, we need to make
        # sure the lecture_model already exists once and for all in the database
        # for future access. Otherwise, it may create many instances and
        # thus many objects within the database.
        transaction.commit()
        fetch_amendements(lecture_model.pk)
        self.request.session.flash(
            Message(
                cls="success",
                text=
                ("Lecture créée avec succès, amendements en cours de récupération."
                 ),
            ))
        return HTTPFound(location=self.request.resource_url(
            self.context[lecture_model.url_key], "amendements"))