gmao/app_new/documents/routes.py

184 lines
6.8 KiB
Python

"""
Documents Routes - GMAO Collège
Gestion des documents attachés aux interventions et équipements
"""
from flask import Blueprint, render_template, redirect, url_for, request, flash, current_app
from flask_login import login_required, current_user
from werkzeug.utils import secure_filename
from datetime import datetime, timezone
import os
from uuid import uuid4
from app_new.extensions import db
from ..core.models.maintenance import InterventionDocument
documents_bp = Blueprint('documents', __name__, url_prefix='/documents')
ALLOWED_EXTENSIONS = {'pdf', 'png', 'jpg', 'jpeg', 'gif', 'doc', 'docx', 'xls', 'xlsx'}
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@documents_bp.route('/upload/intervention/<int:intervention_id>', methods=['POST'])
@login_required
def upload_intervention(intervention_id):
"""Upload un document pour une intervention."""
from ..core.models.maintenance import Intervention
Intervention.query.get_or_404(intervention_id)
if 'file' not in request.files:
flash('Aucun fichier sélectionné.', 'error')
return redirect(url_for('interventions.detail', id=intervention_id))
file = request.files['file']
if file.filename == '':
flash('Aucun fichier sélectionné.', 'error')
return redirect(url_for('interventions.detail', id=intervention_id))
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
unique_filename = f"{uuid4().hex}_{filename}"
upload_dir = os.path.join(current_app.config.get('UPLOAD_FOLDER', 'uploads'), 'interventions')
os.makedirs(upload_dir, exist_ok=True)
filepath = os.path.join(upload_dir, unique_filename)
file.save(filepath)
document = InterventionDocument(
intervention_id=intervention_id,
filename=unique_filename,
filepath=filepath,
description=request.form.get('description', ''),
uploaded_by_id=current_user.id
)
db.session.add(document)
db.session.commit()
flash('Document uploadé avec succès.', 'success')
else:
flash('Type de fichier non autorisé.', 'error')
return redirect(url_for('interventions.detail', id=intervention_id))
@documents_bp.route('/upload/equipment/<int:equipment_id>', methods=['POST'])
@login_required
def upload_equipment(equipment_id):
"""Upload un document pour un équipement."""
from ..core.models.equipment import Equipment, EquipmentDocument
Equipment.query.get_or_404(equipment_id)
if 'file' not in request.files:
flash('Aucun fichier sélectionné.', 'error')
return redirect(url_for('equipments.detail', id=equipment_id))
file = request.files['file']
if file.filename == '':
flash('Aucun fichier sélectionné.', 'error')
return redirect(url_for('equipments.detail', id=equipment_id))
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
unique_filename = f"{uuid4().hex}_{filename}"
upload_dir = os.path.join(current_app.config.get('UPLOAD_FOLDER', 'uploads'), 'equipments')
os.makedirs(upload_dir, exist_ok=True)
filepath = os.path.join(upload_dir, unique_filename)
file.save(filepath)
document = EquipmentDocument(
equipment_id=equipment_id,
filename=unique_filename,
filepath=filepath,
file_type=filename.rsplit('.', 1)[1].lower() if '.' in filename else 'unknown',
file_size=os.path.getsize(filepath),
uploaded_by_id=current_user.id
)
db.session.add(document)
db.session.commit()
flash('Document uploadé avec succès.', 'success')
else:
flash('Type de fichier non autorisé.', 'error')
return redirect(url_for('equipments.detail', id=equipment_id))
@documents_bp.route('/intervention/delete/<int:doc_id>', methods=['POST'])
@login_required
def delete_intervention_document(doc_id):
"""Supprimer un document d'intervention."""
document = InterventionDocument.query.get_or_404(doc_id)
intervention_id = document.intervention_id
# Supprimer le fichier physique
if document.filepath and os.path.exists(document.filepath):
os.remove(document.filepath)
db.session.delete(document)
db.session.commit()
flash('Document supprimé.', 'success')
return redirect(url_for('interventions.detail', id=intervention_id))
@documents_bp.route('/intervention/<int:doc_id>/edit', methods=['POST'])
@login_required
def edit_intervention(doc_id):
"""Modifier uniquement la description d'un document d'intervention."""
document = InterventionDocument.query.get_or_404(doc_id)
document.description = (request.form.get('description') or '').strip() or None
db.session.commit()
flash('Description du document mise à jour.', 'success')
return redirect(url_for('interventions.detail', id=document.intervention_id))
@documents_bp.route('/intervention/download/<int:doc_id>')
@login_required
def download_intervention_document(doc_id):
"""Télécharger un document d'intervention."""
from flask import send_file
document = InterventionDocument.query.get_or_404(doc_id)
if document.filepath and os.path.exists(document.filepath):
return send_file(document.filepath, as_attachment=True, download_name=document.filename)
flash('Fichier non trouvé.', 'error')
return redirect(url_for('interventions.detail', id=document.intervention_id))
@documents_bp.route('/equipment/delete/<int:doc_id>', methods=['POST'])
@login_required
def delete_equipment_document(doc_id):
"""Supprimer un document d'équipement."""
from ..core.models.equipment import EquipmentDocument
document = EquipmentDocument.query.get_or_404(doc_id)
equipment_id = document.equipment_id
# Supprimer le fichier physique
if document.filepath and os.path.exists(document.filepath):
os.remove(document.filepath)
db.session.delete(document)
db.session.commit()
flash('Document supprimé.', 'success')
return redirect(url_for('equipments.detail', id=equipment_id))
@documents_bp.route('/equipment/download/<int:doc_id>')
@login_required
def download_equipment_document(doc_id):
"""Télécharger un document d'équipement."""
from flask import send_file
from ..core.models.equipment import EquipmentDocument
document = EquipmentDocument.query.get_or_404(doc_id)
if document.filepath and os.path.exists(document.filepath):
return send_file(document.filepath, as_attachment=True, download_name=document.filename)
flash('Fichier non trouvé.', 'error')
return redirect(url_for('equipments.detail', id=document.equipment_id))