procedure.py 6.78 KB
Newer Older
1 2
# -*- coding: utf-8 -*-

Nicolas Joyard's avatar
Nicolas Joyard committed
3
from datetime import datetime, time
4
from time import sleep
Nicolas Joyard's avatar
Nicolas Joyard committed
5

Nicolas Joyard's avatar
Nicolas Joyard committed
6 7
from sqlalchemy.orm import joinedload

8
from ..models import Action, Parlementaire, User, db
9 10 11
from ..models.constants import (DEBUT_ACTION, ETAPE_A_CONFIRMER,
                                ETAPE_COURRIEL, ETAPES_BY_ORDRE,
                                ETAPE_DEMANDE_CADA, ETAPE_DOC_PUBLIE,
Nicolas Joyard's avatar
Nicolas Joyard committed
12 13 14 15
                                ETAPE_REPONSE_NEGATIVE, ETAPE_REQUETE_TA,
                                ETAPE_DOC_MASQUE, ETAPE_ENVOYE, ETAPE_AR_RECU,
                                ETAPE_REPONSE_POSITIVE, ETAPE_NA,
                                ETAPE_INCOMPETENCE_CADA)
16 17

from .mails import envoyer_alerte
Nicolas Joyard's avatar
Nicolas Joyard committed
18
from .text import slugify
19 20 21 22 23


def fix_procedure(app):

    # Ajout étape "email" aux parlementaires qui ne l'ont pas
Nicolas Joyard's avatar
Nicolas Joyard committed
24 25
    acts = Action.query.filter(Parlementaire.id == Action.parlementaire_id) \
                       .filter(Action.etape == ETAPE_COURRIEL) \
26 27 28 29 30 31 32
                       .exists()

    parls = Parlementaire.query.filter(Parlementaire.mails_envoyes == 1) \
                               .filter(~acts) \
                               .order_by(Parlementaire.nom) \
                               .all()

33 34
    admin = User.query.filter(User.nick == '!rc').one()

35 36 37 38 39
    for parl in parls:
        print('%s: etape courriel' % parl.nom_complet)

        act = Action(
            parlementaire=parl,
Nicolas Joyard's avatar
Nicolas Joyard committed
40
            etape=ETAPE_COURRIEL,
Nicolas Joyard's avatar
Nicolas Joyard committed
41
            date=datetime.combine(DEBUT_ACTION, time(23, 30)),
42
            user=admin
43 44 45 46
        )
        db.session.add(act)

    db.session.commit()
47 48 49 50 51 52


def avance_procedure(app, ordre_etape):
    etape = ETAPES_BY_ORDRE.get(ordre_etape, None)
    admin = User.query.filter(User.nick == '!rc').one()

Nicolas Joyard's avatar
Nicolas Joyard committed
53 54
    if ordre_etape in (ETAPE_DEMANDE_CADA, ETAPE_INCOMPETENCE_CADA,
                       ETAPE_REQUETE_TA):
55
        # Recherche des parlementaire n'ayant pas de réponse positive
Nicolas Joyard's avatar
Nicolas Joyard committed
56
        # et avant l'étape demandée
57 58
        query = Parlementaire.query \
            .filter(Parlementaire.etape != ETAPE_REPONSE_POSITIVE) \
Nicolas Joyard's avatar
Nicolas Joyard committed
59
            .filter(Parlementaire.etape < ordre_etape)
60 61 62 63 64 65 66 67 68 69 70
    elif etape:
        print('Etape non supportée : %s' % etape['label'])
        return
    else:
        print('Etape inconnue : %s' % ordre_etape)
        return

    # Filtrage (générique) des parlementaires concernés par l'opération et qui
    # ne sont pas déjà à cette étape
    parls = query.filter(Parlementaire.etape != ordre_etape) \
        .filter(Parlementaire.etape > ETAPE_NA) \
Nicolas Joyard's avatar
Nicolas Joyard committed
71
        .order_by(Parlementaire.nom) \
72 73 74 75
        .all()

    for parl in parls:
        print(parl.nom_complet)
Nicolas Joyard's avatar
Nicolas Joyard committed
76
        act = None
77

78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
        # Cas particulier demande CADA
        if ordre_etape == ETAPE_DEMANDE_CADA:
            if parl.etape == ETAPE_A_CONFIRMER:
                # Suppression de l'étape prise en charge si c'est l'étape
                # actuelle du député
                pec = Action.query \
                            .filter(Action.parlementaire == parl) \
                            .filter(Action.etape == ETAPE_A_CONFIRMER) \
                            .first()
                if pec:
                    db.session.delete(pec)

            # Transformation de l'action 'Document' en action "Demande CADA"
            act = Action.query \
                        .filter(Action.parlementaire == parl) \
                        .filter(Action.etape == ETAPE_DOC_PUBLIE) \
                        .filter(Action.attachment.like('document-cada-%')) \
                        .first()
            if act:
                act.etape = ETAPE_DEMANDE_CADA

Nicolas Joyard's avatar
Nicolas Joyard committed
99 100 101 102 103 104 105 106 107 108 109 110
        # Cas particulier incompétence CADA
        if ordre_etape == ETAPE_INCOMPETENCE_CADA:
            # Transformation de l'action 'Document' avec l'avis CADA en action
            # "incompétence cada"
            act = Action.query \
                        .filter(Action.parlementaire == parl) \
                        .filter(Action.etape == ETAPE_DOC_MASQUE) \
                        .filter(Action.attachment.like('avis-cada-%')) \
                        .first()
            if act:
                act.etape = ETAPE_INCOMPETENCE_CADA

111 112 113 114 115 116
        # Création de l'action si inexistante
        if not act:
            act = Action(
                parlementaire=parl,
                etape=ordre_etape,
                date=datetime.now(),
Nicolas Joyard's avatar
Nicolas Joyard committed
117
                user=admin
118
            )
Nicolas Joyard's avatar
Nicolas Joyard committed
119 120 121 122 123 124

            if ordre_etape == ETAPE_REQUETE_TA:
                act.suivi = etape['description'].strip()
                act.attachment = 'requete-ta-%s.pdf' % \
                    slugify(parl.nom_complet)

125 126
            db.session.add(act)

127 128 129 130 131
        parl.etape = ordre_etape

        # Commit immédiat pour pouvoir arrêter en plein milieu et reprendre
        db.session.commit()

Nicolas Joyard's avatar
Nicolas Joyard committed
132
        if etape['alerte'] and not app.config['MAIL_SUPPRESS_SEND']:
133
            cnt = envoyer_alerte(app, etape, parl)
134 135
            if cnt:
                print('%s e-mails d\'alerte envoyés' % cnt)
136
                sleep(1)
Nicolas Joyard's avatar
Nicolas Joyard committed
137 138 139 140 141 142 143 144 145


def export_pour_ta(app):
    parls = Parlementaire.query.filter(Parlementaire.etape >=
                                       ETAPE_DEMANDE_CADA) \
                               .options(joinedload(Parlementaire.actions)) \
                               .order_by(Parlementaire.nom) \
                               .all()

Nicolas Joyard's avatar
Nicolas Joyard committed
146 147 148
    output_order = ['num', 'nom', 'slug', 'sexe', 'adresse', 'refus',
                    'demande', 'bordereau', 'cada_no', 'avis_cada',
                    'date_cada', 'lar_envoi', 'lar_reception']
Nicolas Joyard's avatar
Nicolas Joyard committed
149 150 151 152 153 154 155 156 157 158

    print(';'.join(output_order))

    parl_num = 0
    for parl in parls:
        parl_num = parl_num + 1

        data = {
            'num': '%03d' % parl_num,
            'nom': parl.nom_complet,
Nicolas Joyard's avatar
Nicolas Joyard committed
159
            'slug': slugify(parl.nom_complet),
Nicolas Joyard's avatar
Nicolas Joyard committed
160
            'sexe': parl.sexe,
Nicolas Joyard's avatar
Nicolas Joyard committed
161 162 163 164
            'refus': ' ',
            'demande': 'demande-irfm-%s.pdf' % slugify(parl.nom_complet),
            'adresse': parl.adresse.replace('\n', ', ').replace(',,', ',')
                                                       .replace("\xa0", " ")
Nicolas Joyard's avatar
Nicolas Joyard committed
165 166 167
        }

        for act in parl.actions:
Nicolas Joyard's avatar
Nicolas Joyard committed
168
            if act.etape == ETAPE_ENVOYE:
Nicolas Joyard's avatar
Nicolas Joyard committed
169 170 171 172 173
                data['bordereau'] = act.attachment or 'NONE'
                data['lar_envoi'] = act.date.strftime('%d %B %Y')

            if act.etape == ETAPE_AR_RECU:
                data['lar_reception'] = act.date.strftime('%d %B %Y')
Nicolas Joyard's avatar
Nicolas Joyard committed
174 175 176 177 178 179

            if act.etape == ETAPE_REPONSE_NEGATIVE:
                data['refus'] = 'REFUS'

            if act.etape == ETAPE_DOC_MASQUE and \
                    act.attachment.startswith('avis-cada'):
Nicolas Joyard's avatar
Nicolas Joyard committed
180 181 182 183
                data['avis_cada'] = act.attachment or 'NONE'
                data['date_cada'] = act.date.strftime('%d %B %Y')
                data['cada_no'] = data['avis_cada'].replace('avis-cada-', '') \
                                                   .replace('.pdf', '')
Nicolas Joyard's avatar
Nicolas Joyard committed
184 185

        print(';'.join([data.get(k, '') for k in output_order]))