Commit ac6ee1d7 authored by Nicolas Joyard's avatar Nicolas Joyard

Ajout no de suivi LRAR + fichier optionnel

parent 35e90cb0
......@@ -47,6 +47,7 @@ class DefaultConfig(object):
MAIL_USE_SSL = False
MAIL_USERNAME = None
MAIL_PASSWORD = None
MAIL_SUPPRESS_SEND = False
class DebugConfig(DefaultConfig):
......@@ -98,3 +99,6 @@ class EnvironmentConfig(DefaultConfig):
DefaultConfig.MAIL_USERNAME)
MAIL_PASSWORD = os.environ.get('IRFM_MAIL_PASSWORD',
DefaultConfig.MAIL_PASSWORD)
MAIL_SUPPRESS_SEND = os.environ.get('IRFM_MAIL_SUPPRESS_SEND', 'False') \
== 'True'
\ No newline at end of file
......@@ -25,6 +25,8 @@ class Action(db.Model):
nick = db.Column(db.Unicode)
email = db.Column(db.Unicode)
ip = db.Column(db.Unicode)
suivi = db.Column(db.Unicode)
attachment = db.Column(db.Unicode)
etape_id = db.Column(db.Integer, db.ForeignKey('etapes.id'))
......
......@@ -8,7 +8,8 @@ from flask import (flash, make_response, redirect, render_template, request,
from flask_mail import Mail, Message
from sqlalchemy.orm import joinedload, contains_eager
from .util import not_found, redirect_back, remote_addr, require_user, slugify
from .util import (check_suivi, not_found, redirect_back, remote_addr,
require_user, slugify)
from ..models import db, Action, Etape, Parlementaire
from ..models.constants import (ETAPE_A_ENVOYER, ETAPE_A_CONFIRMER,
ETAPE_ENVOYE, EXTENSIONS)
......@@ -111,7 +112,7 @@ def setup_routes(app):
finally:
db.session.rollback()
@app.route('/parlementaire/<id>/annuler', endpoint='annuler')
@app.route('/parlementaires/<id>/annuler', endpoint='annuler')
@require_user
def annuler(id):
parl = Parlementaire.query.filter_by(id=id) \
......@@ -136,7 +137,7 @@ def setup_routes(app):
return redirect(url_for('parlementaire', id=id))
@app.route('/parlementaire/<id>/confirmer', endpoint='confirmer',
@app.route('/parlementaires/<id>/confirmer', endpoint='confirmer',
methods=['POST'])
@require_user
def confirmer(id):
......@@ -156,29 +157,29 @@ def setup_routes(app):
return redirect_back(error=msg,
fallback=url_for('parlementaire', id=id))
if 'file' not in request.files or not request.files['file'] \
or request.files['file'].filename == '':
msg = 'Veuillez indiquer un fichier à envoyer'
if not check_suivi(request.form['suivi']):
msg = 'Veuillez indiquer un numéro de suivi valide'
return redirect_back(error=msg,
fallback=url_for('parlementaire', id=id))
file = request.files['file']
ext = file.filename.rsplit('.', 1)[1].lower()
filename = None
if request.files.get('file') and request.files['file'].filename != '':
file = request.files['file']
ext = file.filename.rsplit('.', 1)[1].lower()
if ext not in EXTENSIONS.keys():
msg = 'Type de fichier non pris en charge, merci d\'envoyer ' \
'uniquement un fichier PDF, JPG ou PNG'
return redirect_back(error=msg,
fallback=url_for('parlementaire', id=id))
if ext == 'jpeg':
ext = 'jpg'
if ext not in EXTENSIONS.keys():
msg = 'Type de fichier non pris en charge, merci d\'envoyer ' \
'uniquement un fichier PDF, JPG ou PNG'
return redirect_back(error=msg,
fallback=url_for('parlementaire', id=id))
filename = 'preuve-envoi-%s.%s' % (slugify(parl.nom_complet), ext)
if ext == 'jpeg':
ext = 'jpg'
filename = 'preuve-envoi-%s.%s' % (slugify(parl.nom_complet), ext)
uploads_root = os.path.join(app.config['DATA_DIR'], 'uploads')
file.save(os.path.join(uploads_root, filename))
uploads_root = os.path.join(app.config['DATA_DIR'], 'uploads')
file.save(os.path.join(uploads_root, filename))
parl.etape = Etape.query.filter_by(ordre=ETAPE_ENVOYE).first()
......@@ -189,7 +190,8 @@ def setup_routes(app):
ip=remote_addr(),
parlementaire=parl,
etape=parl.etape,
attachment=filename
attachment=filename,
suivi=request.form['suivi'].upper()
)
db.session.add(action)
......
......@@ -52,6 +52,10 @@ def check_email(text, allow_empty=True):
return not text or re.search(r'^[^@]+@[^@]+\.[^@]+$', text)
def check_suivi(text):
return text and re.search(r'^\d[A-Z]\d{11}$', text.upper())
def require_user(f):
def decorator(*args, **kwargs):
if not session.get('user'):
......
......@@ -13,6 +13,7 @@
<th>Etape</th>
<th>Date</th>
<th>Utilisateur</th>
<th>Suivi</th>
<th>Fichier joint</th>
<th></th>
</tr>
......@@ -33,6 +34,11 @@
{{ action.nick }} ({{ action.email }}) depuis {{ action.ip }}
{% endif %}
</td>
<td>
{% if action.suivi %}
<a href="http://www.part.csuivi.courrier.laposte.fr/suivi/index?id={{ action.suivi }}" target="_blank">{{ action.suivi }}</a>
{% endif %}
</td>
<td>
{% if action.attachment %}
<a class="btn btn-default btn-sm" href="{{ url_for('admin_fichier', id_action=action.id) }}" target="_blank">Voir</a>
......
......@@ -44,12 +44,23 @@
<b>Confirmation d'envoi</b>
</header>
<article class="panel-body">
Vous avez pris en charge l'envoi du courrier à ce parlementaire. Pour confirmer l'envoi,
merci de nous envoyer une photo ou un scan de la preuve de dépôt (format PDF, PNG ou JPG, 4 Mo maximum) à l'aide du formulaire ci-dessous.
Vous avez pris en charge l'envoi du courrier à ce parlementaire.<br><br>
Pour confirmer l'envoi, merci de nous transmettre le numéro de suivi du recommandé à l'aide du formulaire ci-dessous. Vous pouvez aussi nous envoyer une photo ou un scan de la preuve de dépôt (format PDF, PNG ou JPG, 4 Mo maximum) si vous le souhaitez.
<form method="POST" action="{{ url_for('confirmer', id=parlementaire.id) }}" enctype="multipart/form-data">
<div class="form-group">
<label class="col-md-4" for="file">Preuve d'envoi</label>
<div class="col-md-4">
<label for="suivi">Numéro de suivi</label>
</div>
<div class="col-md-8">
<input name="suivi" type="text" placeholder="Ex: 1X12345678901" maxlength="13"> <b>*</b>
</div>
</div>
<div class="form-group">
<div class="col-md-4">
<label for="file">Preuve d'envoi</label>
</div>
<div class="col-md-8">
<input name="file" type="file" title="Choisissez un fichier...">
</div>
......@@ -106,6 +117,7 @@
<th>Utilisateur</th>
<th>Date</th>
<th></th>
<th></th>
</tr>
{% for act in parlementaire.actions %}
......@@ -119,6 +131,11 @@
{% endif %}
</td>
<td>{{ act.date.strftime("%c") }}</td>
<td>
{% if act.suivi %}
Suivi&nbsp;: <a href="http://www.part.csuivi.courrier.laposte.fr/suivi/index?id={{ act.suivi }}" target="_blank">{{ act.suivi }}</a>
{% endif %}
</td>
<td class="col-right">
{% if act.etape.ordre == ordres.ETAPE_A_CONFIRMER %}
<a class="btn btn-default btn-sm" target="_blank" href="{{ url_for('demande_pdf', id=parlementaire.id, mode='show') }}">Voir le courrier</a>
......
"""Ajout suivi
Revision ID: 0bb141c3f068
Revises: 0550bb4083f7
Create Date: 2017-05-09 20:24:07.173655
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '0bb141c3f068'
down_revision = '0550bb4083f7'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('actions', sa.Column('suivi', sa.Unicode(), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('actions', 'suivi')
# ### end Alembic commands ###
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment