Commit 10a60764 authored by Nicolas Joyard's avatar Nicolas Joyard

Ajout upload et download preuve envoi

parent 3b80e080
......@@ -3,4 +3,5 @@
*.pyc
*~
data/secret.txt
data/preuve-envoi-*
......@@ -34,7 +34,7 @@ class DefaultConfig(object):
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = False
DATA_DIR = os.path.join(BASE_DIR, 'data')
API_PAGE_SIZE = 10
MAX_CONTENT_LENGTH = 4 * 1024 * 1024
PIWIK_HOST = None
PIWIK_ID = None
......
# -*- coding: utf-8 -*-
from datetime import datetime
import os
from flask import redirect, render_template, request, session, url_for
from flask import (flash, make_response, redirect, render_template, request,
session, url_for)
from sqlalchemy.orm import joinedload, contains_eager
from .util import not_found, redirect_back, require_user
from .util import not_found, redirect_back, require_user, slugify
from ..models import db, Action, Etape, Parlementaire
from ..models.constants import ETAPE_A_ENVOYER, ETAPE_A_CONFIRMER, ETAPE_ENVOYE
EXTENSIONS = {
'pdf': 'application/pdf',
'jpg': 'image/jpeg',
'jpeg': 'image/jpeg',
'png': 'image/png',
}
def pris_en_charge(parl):
"""
Verifie si l'user courant a pris en charge le parlementaire et qu'il est
bien à l'étape "à confirmer".
Renvoie l'action correspondante ou None
"""
if session.get('user') and parl.etape.ordre == ETAPE_A_CONFIRMER:
action = [a for a in parl.actions
if a.etape.ordre == ETAPE_A_CONFIRMER
and a.nick == session.get('user')['nick']
and a.email == session.get('user')['email']]
if len(action):
return action[0]
return None
def setup_routes(app):
@app.route('/parlementaires', endpoint='parlementaires')
......@@ -36,19 +63,10 @@ def setup_routes(app):
if not parl:
return not_found()
pris_en_charge = False
if session.get('user') and parl.etape.ordre == ETAPE_A_CONFIRMER:
action = [a for a in parl.actions
if a.etape.ordre == ETAPE_A_CONFIRMER
and a.nick == session.get('user')['nick']
and a.email == session.get('user')['email']]
if len(action):
pris_en_charge = True
return render_template(
'parlementaire.html.j2',
parlementaire=parl,
pris_en_charge=pris_en_charge
pris_en_charge=bool(pris_en_charge(parl))
)
@app.route('/parlementaires/<id>/envoi', endpoint='envoi')
......@@ -101,17 +119,8 @@ def setup_routes(app):
if not parl:
return not_found()
pris_en_charge = False
if parl.etape.ordre == ETAPE_A_CONFIRMER:
action = [a for a in parl.actions
if a.etape.ordre == ETAPE_A_CONFIRMER
and a.nick == session.get('user')['nick']
and a.email == session.get('user')['email']]
if len(action):
pris_en_charge = True
action = action[0]
if not pris_en_charge:
action = pris_en_charge(parl)
if not action:
msg = 'Oups, vous n\'avez pas pris en charge l\'envoi pour ce ' \
'parlementaire !'
return redirect_back(error=msg,
......@@ -136,6 +145,34 @@ def setup_routes(app):
if not parl:
return not_found()
action = pris_en_charge(parl)
if not action:
msg = 'Oups, vous n\'avez pas pris en charge l\'envoi pour ce ' \
'parlementaire !'
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'
return redirect_back(error=msg,
fallback=url_for('parlementaire', id=id))
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'
filename = 'preuve-envoi-%s.%s' % (slugify(parl.nom_complet), ext)
file.save(os.path.join(app.config['DATA_DIR'], filename))
parl.etape = Etape.query.filter_by(ordre=ETAPE_ENVOYE).first()
action = Action(
......@@ -144,10 +181,30 @@ def setup_routes(app):
email=session['user']['email'],
ip=request.remote_addr,
parlementaire=parl,
etape=parl.etape
etape=parl.etape,
attachment=filename
)
db.session.add(action)
db.session.commit()
flash('Confirmation reçue, merci beaucoup !', category='success')
return redirect(url_for('parlementaire', id=id))
@app.route('/parlementaire/<id>/preuve-envoi', endpoint='preuve_envoi')
def preuve_envoi(id):
act = Action.query.join(Action.etape) \
.filter(Etape.ordre == ETAPE_ENVOYE,
Action.parlementaire_id == id) \
.first()
if not act or not act.attachment:
return not_found()
path = os.path.join(app.config['DATA_DIR'], act.attachment)
ext = path.rsplit('.', 1)[1].lower()
with open(path, 'rb') as preuve:
response = make_response(preuve.read())
response.headers['Content-Type'] = EXTENSIONS[ext]
return response
......@@ -12,7 +12,7 @@ from ..models import Parlementaire
def setup_routes(app):
@app.route('/demande/<id>/<mode>', endpoint='demande_pdf')
@app.route('/parlementaire/<id>/demande/<mode>', endpoint='demande_pdf')
def demande_pdf(id, mode='download'):
parl = Parlementaire.query.filter_by(id=id).first()
......
......@@ -59,8 +59,12 @@
</header>
<section class="container-fluid">
{% for message in get_flashed_messages() %}
<div class="alert alert-danger" role="alert">{{ message }}</div>
{% for cat, message in get_flashed_messages(with_categories=True) %}
{% if cat == 'success' %}
<div class="alert alert-success" role="alert">{{ message }}</div>
{% else %}
<div class="alert alert-danger" role="alert">{{ message }}</div>
{% endif %}
{% endfor %}
<div class="alert alert-warning" role="alert">
......
......@@ -45,13 +45,13 @@
</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 à l'aide du formulaire ci-dessous.
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.
<form method="POST" action="{{ url_for('confirmer', id=parlementaire.id) }}">
<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-8">
<input class="name="file" type="file" title="Choisissez un fichier...">
<input name="file" type="file" title="Choisissez un fichier...">
</div>
</div>
<div class="form-group">
......@@ -116,6 +116,8 @@
<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>
{% elif act.etape.ordre == ordres.ETAPE_ENVOYE and act.attachment %}
<a class="btn btn-default btn-sm" target="_blank" href="{{ url_for('preuve_envoi', id=parlementaire.id) }}">Voir la preuve d'envoi</a>
{% endif %}
</td>
</tr>
......
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