Example #1
0
def create_missing_dossiers_senat() -> None:
    """
    Create new dossiers based on dossier_refs scraped from Sénat web site
    """
    from zam_repondeur.services.data import repository

    known_senat_ids = _known_senat_ids()
    existing_senat_ids = _existing_senat_ids()
    existing_an_ids = _existing_an_ids()
    missing_senat_ids = known_senat_ids - existing_senat_ids

    for senat_id in missing_senat_ids:

        dossier_ref_senat = repository.get_senat_scraping_dossier_ref(senat_id)
        if dossier_ref_senat is None:
            continue

        # Check that we have not already created from the AN dossier_ref
        dossier_ref_an = find_matching_dossier_ref_an(dossier_ref_senat)
        if dossier_ref_an:
            if dossier_ref_an.uid in existing_an_ids:
                continue

        an_id = dossier_ref_an.uid if dossier_ref_an else None

        Dossier.create(
            an_id=an_id,
            senat_id=senat_id,
            titre=dossier_ref_senat.titre,
            slug=dossier_ref_senat.slug,
        )
Example #2
0
def create_missing_dossiers_an() -> None:
    """
    Create new dossiers based on dossier_refs in AN open data
    """
    from zam_repondeur.services.data import repository

    known_an_ids = _known_an_ids()
    existing_an_ids = _existing_an_ids()
    existing_senat_ids = _existing_senat_ids()
    missing_an_ids = known_an_ids - existing_an_ids

    for an_id in missing_an_ids:

        dossier_ref_an = repository.get_opendata_dossier_ref(an_id)
        if dossier_ref_an is None:
            continue

        # Check that we have not already created from the Sénat dossier_ref
        dossier_ref_senat = find_matching_dossier_ref_senat(dossier_ref_an)
        if dossier_ref_senat:
            if dossier_ref_senat.uid in existing_senat_ids:
                continue

        senat_id = dossier_ref_senat.uid if dossier_ref_senat else None

        Dossier.create(
            an_id=an_id,
            senat_id=senat_id,
            titre=dossier_ref_an.titre,
            slug=dossier_ref_an.slug,
        )
Example #3
0
def dossier_plf(db):
    from zam_repondeur.models import Dossier

    with transaction.manager:
        dossier = Dossier.create(uid="DLR5L15N36733",
                                 titre="Budget : loi de finances 2019")

    return dossier
Example #4
0
def dossier_plfss2018(db):
    from zam_repondeur.models import Dossier

    with transaction.manager:
        dossier = Dossier.create(
            uid="DLR5L15N36030",
            titre="Sécurité sociale : loi de financement 2018")

    return dossier
Example #5
0
def test_fetch_all_commission(db):
    from zam_repondeur.models import Chambre, Dossier, Lecture, Phase, Texte, TypeTexte
    from zam_repondeur.services.fetch.senat.amendements import _fetch_all

    with transaction.manager:
        dossier = Dossier.create(
            senat_id="pjl17-583",
            titre="Liberté de choisir son avenir professionnel",
            slug="liberte-choisir-avenir-professionnel",
        )
        texte = Texte.create(
            type_=TypeTexte.PROJET,
            chambre=Chambre.SENAT,
            session=2017,
            numero=583,
            date_depot=date(2018, 6, 20),
        )
        lecture = Lecture.create(
            phase=Phase.PREMIERE_LECTURE,
            texte=texte,
            titre="Première lecture – Commissions",
            organe=None,
            dossier=dossier,
        )

    sample_data = read_sample_data("jeu_complet_commission_2017-2018_583.csv")

    responses.add(
        responses.GET,
        "https://www.senat.fr/amendements/commissions/2017-2018/583/jeu_complet_commission_2017-2018_583.csv",  # noqa
        body=sample_data,
        status=200,
    )

    items = _fetch_all(lecture)

    assert len(items) == 434

    assert items[0] == {
        "Nature ": "Amt",
        "Numéro ": "COM-1",
        "Subdivision ": "Article 40",
        "Alinéa": "36",
        "Auteur ": "M. FORISSIER, rapporteur",
        "Au nom de ": "",
        "Date de dépôt ": "2018-06-21",
        "Dispositif ":
        "<body><p>Alin&#233;a 36</p><p>Apr&#232;s le mot :</p><p>services</p><p>Ins&#233;rer les mots :</p><p>ou &#224; des partenariats</p><p></p></body>                                                                                                                                                                                                                ",  # noqa
        "Objet ":
        "<body><p>Cet amendement vise &#224; inclure parmi les d&#233;penses pouvant &#234;tre d&#233;duites de la contribution financi&#232;re annuelle, en plus des contrats de sous-traitance et de prestations, les <b>d&#233;penses aff&#233;rentes &#224; des partenariats</b> avec les entreprises adapt&#233;es, les Esat et les travailleurs handicap&#233;s ind&#233;pendants.</p><p>En effet, le nouveau mode de d&#233;duction des montants de ces contrats de la contribution annuelle risque de moins inciter les employeurs &#224; leur conclusion. D'o&#249; l'int&#233;r&#234;t d'&#233;largir cette d&#233;duction aux autres actions qu'ils sont susceptibles de mener aupr&#232;s des EA et des Esat notamment.</p></body>                                                                                                                                                                                                                                                                                                                                                                                                                                                         ",  # noqa
        "Sort ": "Adopté",
        "Url amendement ":
        "//www.senat.fr/amendements/commissions/2017-2018/583/Amdt_COM-1.html",  # noqa
        "Fiche Sénateur": "//www.senat.fr/senfic/forissier_michel14087w.html",
    }
Example #6
0
def dossier_essoc2018(db):
    from zam_repondeur.models import Dossier

    with transaction.manager:
        dossier = Dossier.create(
            uid="DLR5L15N36159",
            titre=
            "Fonction publique : un Etat au service d'une société de confiance",
        )

    return dossier
Example #7
0
def dossier_plfss2019(db):
    from zam_repondeur.models import Dossier

    with transaction.manager:
        dossier = Dossier.create(
            an_id="DLR5L15N36892",
            titre="Sécurité sociale : loi de financement 2019",
            slug="plfss-2019",
        )

    return dossier
Example #8
0
def dossier_plf_2020(db):
    from zam_repondeur.models import Dossier

    with transaction.manager:
        dossier = Dossier.create(
            an_id="DLR5L15N37615",
            titre="Budget : loi de finances 2020",
            slug="loi-finances-2020",
        )

    return dossier
Example #9
0
def dossier_plfss2018(db, team_zam):
    from zam_repondeur.models import Dossier

    with transaction.manager:
        dossier = Dossier.create(
            an_id="DLR5L15N36030",
            titre="Sécurité sociale : loi de financement 2018",
            slug="plfss-2018",
        )
        dossier.team = team_zam

    return dossier
Example #10
0
def dossier_plf2018(db, team_zam):
    from zam_repondeur.models import Dossier

    with transaction.manager:
        dossier = Dossier.create(
            an_id="DLR5L15N35854",
            titre="Budget : loi de finances 2018",
            slug="loi-finances-2018",
        )
        dossier.team = team_zam

    return dossier
Example #11
0
def dossier_essoc2018(db, team_zam):
    from zam_repondeur.models import Dossier

    with transaction.manager:
        dossier = Dossier.create(
            an_id="DLR5L15N36159",
            titre=
            "Fonction publique : un Etat au service d'une société de confiance",
            slug="etat-service-societe-confiance",
        )
        dossier.team = team_zam

    return dossier
Example #12
0
    def post(self) -> Response:
        dossier_slug = self._get_dossier_slug()

        if not dossier_slug:
            self.request.session.flash(
                Message(cls="error", text="Ce dossier n’existe pas."))
            return HTTPFound(location=self.request.resource_url(self.context))

        dossier = Dossier.get(slug=dossier_slug)

        if dossier is None:
            self.request.session.flash(
                Message(cls="error", text="Ce dossier n’existe pas."))
            return HTTPFound(location=self.request.resource_url(self.context))

        if dossier.team:
            self.request.session.flash(
                Message(cls="warning",
                        text="Ce dossier appartient à une autre équipe…"))
            return HTTPFound(location=self.request.resource_url(self.context))

        team = Team.create(name=dossier.slug)
        dossier.team = team
        for admin in DBSession.query(User).filter(
                User.admin_at.isnot(None)  # type: ignore
        ):
            admin.teams.append(team)

        # Enqueue task to asynchronously add the lectures
        create_missing_lectures(dossier_pk=dossier.pk,
                                user_pk=self.request.user.pk)

        DossierActive.create(dossier=dossier, request=self.request)

        self.request.session.flash(
            Message(
                cls="success",
                text=(
                    "Dossier créé avec succès, lectures en cours de création."
                ),
            ))
        return HTTPFound(
            location=self.request.resource_url(self.context[dossier.url_key]))
Example #13
0
 def model(self, *options: Any) -> Dossier:
     dossier = Dossier.get(self.slug, *options)
     if dossier is None:
         raise ResourceNotFound(self)
     return dossier
Example #14
0
    def existing_dossier(self, db):
        from zam_repondeur.models import Dossier

        return Dossier.create(an_id="existant",
                              titre="Titre initial",
                              slug="titre-initial")