84 lines
3.1 KiB
Python
84 lines
3.1 KiB
Python
|
|
"""
|
||
|
|
Exports PDF - GMAO Collège
|
||
|
|
Generation de rapports d'interventions en PDF simple (HTML -> print).
|
||
|
|
"""
|
||
|
|
from flask import Blueprint, render_template, make_response, request
|
||
|
|
from flask_login import login_required
|
||
|
|
from datetime import datetime, date, timedelta
|
||
|
|
from app_new.extensions import db
|
||
|
|
|
||
|
|
exports_bp = Blueprint('exports', __name__, template_folder='templates')
|
||
|
|
|
||
|
|
|
||
|
|
@exports_bp.route('/exports/interventions')
|
||
|
|
@login_required
|
||
|
|
def export_interventions():
|
||
|
|
"""Export des interventions en HTML imprimable (ctrl+P -> PDF)."""
|
||
|
|
from app_new.core.models.maintenance import Intervention
|
||
|
|
from app_new.constants import INTERVENTION_STATUSES
|
||
|
|
|
||
|
|
# Filtres
|
||
|
|
status = request.args.get('status', '')
|
||
|
|
date_from = request.args.get('from', '')
|
||
|
|
date_to = request.args.get('to', '')
|
||
|
|
|
||
|
|
query = Intervention.query
|
||
|
|
if status:
|
||
|
|
query = query.filter_by(status=status)
|
||
|
|
if date_from:
|
||
|
|
try:
|
||
|
|
query = query.filter(Intervention.created_at >= datetime.fromisoformat(date_from))
|
||
|
|
except ValueError:
|
||
|
|
pass
|
||
|
|
if date_to:
|
||
|
|
try:
|
||
|
|
query = query.filter(Intervention.created_at <= datetime.fromisoformat(date_to))
|
||
|
|
except ValueError:
|
||
|
|
pass
|
||
|
|
|
||
|
|
interventions = query.order_by(Intervention.created_at.desc()).all()
|
||
|
|
|
||
|
|
html = render_template('exports/interventions.html',
|
||
|
|
interventions=interventions,
|
||
|
|
statuses=INTERVENTION_STATUSES,
|
||
|
|
filters={'status': status, 'from': date_from, 'to': date_to},
|
||
|
|
generated_at=datetime.now())
|
||
|
|
|
||
|
|
response = make_response(html)
|
||
|
|
response.headers['Content-Type'] = 'text/html; charset=utf-8'
|
||
|
|
return response
|
||
|
|
|
||
|
|
|
||
|
|
@exports_bp.route('/exports/interventions/csv')
|
||
|
|
@login_required
|
||
|
|
def export_interventions_csv():
|
||
|
|
"""Export des interventions en CSV."""
|
||
|
|
from app_new.core.models.maintenance import Intervention
|
||
|
|
|
||
|
|
query = Intervention.query
|
||
|
|
status = request.args.get('status', '')
|
||
|
|
if status:
|
||
|
|
query = query.filter_by(status=status)
|
||
|
|
|
||
|
|
interventions = query.order_by(Intervention.created_at.desc()).all()
|
||
|
|
|
||
|
|
import csv
|
||
|
|
import io
|
||
|
|
output = io.StringIO()
|
||
|
|
writer = csv.writer(output, delimiter=';')
|
||
|
|
writer.writerow(['ID', 'Titre', 'Type', 'Statut', 'Priorite', 'Date creation', 'Date debut', 'Date fin', 'Equipement', 'Salle'])
|
||
|
|
|
||
|
|
for i in interventions:
|
||
|
|
writer.writerow([
|
||
|
|
i.id, i.title or '', i.type or '', i.status or '', i.priority or '',
|
||
|
|
i.created_at.strftime('%d/%m/%Y %H:%M') if i.created_at else '',
|
||
|
|
i.started_at.strftime('%d/%m/%Y %H:%M') if i.started_at else '',
|
||
|
|
i.completed_at.strftime('%d/%m/%Y %H:%M') if i.completed_at else '',
|
||
|
|
i.equipment.name if i.equipment else '',
|
||
|
|
i.room.name if i.room else '',
|
||
|
|
])
|
||
|
|
|
||
|
|
response = make_response(output.getvalue())
|
||
|
|
response.headers['Content-Type'] = 'text/csv; charset=utf-8'
|
||
|
|
response.headers['Content-Disposition'] = 'attachment; filename=interventions_export.csv'
|
||
|
|
return response
|