Commit 639d91c7 authored by Nicolas Joyard's avatar Nicolas Joyard

Refacto gestion statiques

parent 9ae574fe
......@@ -39,6 +39,8 @@ $ irfm clear_cache
`irfm.irfm:app` est une application WSGI qui peut être servie avec n'importe quel serveur compatible (comme gunicorn).
#### Configuration
L'application peut être configurée avec des variables d'environnement:
* `IRFM_CONFIG`: `irfm.config.EnvironmentConfig` (sauf si vous voulez utiliser votre propre module de configuration)
......@@ -55,6 +57,16 @@ L'application peut être configurée avec des variables d'environnement:
Pour générer le mot de passe administrateur, exécuter `irfm password` dans le virtualenv de l'application puis saisir le mot de passe souhaité. Attention, `IRFM_DATA_DIR` doit avoir la même valeur que lors de l'exécution de l'application WSGI, car la clé secrète qui y est stockée est utilisée pour hasher le mot de passe.
#### Fichiers statiques
Les répertoires suivants peuvent être servis directement par le serveur web frontal le cas échéant:
* `irfm/static` (depuis la racine du dépôt) sur `/static`
* `$IRFM_DATA_DIR/files` sur `/files`
* `$IRFM_DATA_DIR/uploads` sur `/uploads`
**ATTENTION:** ne pas servir directement le répertoire `$IRFM_DATA_DIR`. Il contient la clé secrète permettant de chiffrer les cookies.
## Développement
### Exécution locale
......
......@@ -3,7 +3,7 @@
from io import BytesIO
import os
from flask import make_response, render_template, send_file
from flask import redirect, send_from_directory, url_for
from ..models import Action, Etape, Parlementaire
from ..models.constants import ETAPE_ENVOYE
......@@ -30,18 +30,7 @@ def setup_routes(app):
return not_found()
filename = generer_demande(parl, files_root)
attach = None
if mode == 'download':
attach = os.path.basename(filename)
return send_file(
path,
mimetype='application/pdf',
conditional=True,
as_attachment=bool(attach),
attachment_filename=attach
)
return redirect(url_for('get_file', filename=filename))
@app.route('/parlementaire/<id>/preuve-envoi', endpoint='preuve_envoi')
def preuve_envoi(id):
......@@ -53,27 +42,21 @@ def setup_routes(app):
if not act or not act.attachment:
return not_found()
path = os.path.join(uploads_root, act.attachment)
ext = path.rsplit('.', 1)[1].lower()
return redirect(url_for('get_upload', filename=act.attachment))
return send_file(
path,
mimetype=EXTENSIONS[ext],
conditional=True,
)
@app.route('/parlementaire/document/<id>', endpoint='document')
def document(id):
@app.route('/parlementaire/attachment/<id>', endpoint='attachment')
def attachment(id):
act = Action.query.filter_by(id=id).first()
if not act or not act.attachment:
return not_found()
path = os.path.join(uploads_root, act.attachment)
ext = path.rsplit('.', 1)[1].lower()
return redirect(url_for('get_upload', filename=act.attachment))
@app.route('/files/<filename>', endpoint='get_file')
def get_file(filename):
return send_from_directory(files_root, filename)
return send_file(
path,
mimetype=EXTENSIONS[ext],
conditional=True,
)
@app.route('/uploads/<filename>', endpoint='get_upload')
def get_upload(filename):
return send_from_directory(uploads_root, filename)
......@@ -41,7 +41,7 @@
</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>
<a class="btn btn-default btn-sm" href="{{ url_for('attachment', id=action.id) }}" target="_blank">Voir</a>
{{ action.attachment }}
{% endif %}
</td>
......
......@@ -181,7 +181,7 @@
{% 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>
{% elif act.attachment %}
<a class="btn btn-default btn-sm" target="_blank" href="{{ url_for('document', id=act.id) }}">Voir le document joint</a>
<a class="btn btn-default btn-sm" target="_blank" href="{{ url_for('attachment', id=act.id) }}">Voir le document joint</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