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
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"
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))
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
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
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"))