loko/streetup/interventions/management/commands/export_interventions_xlsx.py
2026-07-22 14:48:40 +02:00

120 lines
4.9 KiB
Python

"""
Script pour exporter les interventions en fichier XLSX avec filtrage par dates.
Usage:
python manage.py export_interventions_xlsx --start_date=2024-01-01 --end_date=2024-12-31 --output=interventions.xlsx
# Ou sans dates (exporte le mois précédent par défaut)
python manage.py export_interventions_xlsx --output=interventions.xlsx
"""
from django.core.management.base import BaseCommand
from django.conf import settings
from datetime import datetime, date
from dateutil.relativedelta import relativedelta
import os
from interventions.services import generate_interventions_excel
class Command(BaseCommand):
help = 'Exporte les interventions au format XLSX avec possibilité de filtrage par dates'
def add_arguments(self, parser):
parser.add_argument(
'--start_date',
type=str,
help='Date de début (format: YYYY-MM-DD)',
default=None,
)
parser.add_argument(
'--end_date',
type=str,
help='Date de fin (format: YYYY-MM-DD)',
default=None,
)
parser.add_argument(
'--output',
type=str,
help='Nom du fichier de sortie',
default='exports/interventions_%(year)s_%(month)s.xlsx',
)
def handle(self, *args, **options):
start_date = options['start_date']
end_date = options['end_date']
output_file = options['output']
# Si aucune date n'est fournie, utiliser le mois précédent par défaut
if not start_date and not end_date:
today = date.today()
# Premier jour du mois précédent
first_day_prev_month = (today.replace(day=1) - relativedelta(months=1))
# Dernier jour du mois précédent
last_day_prev_month = today.replace(day=1) - relativedelta(days=1)
start_date = first_day_prev_month
end_date = last_day_prev_month
self.stdout.write(
self.style.WARNING(
f'Aucune date fournie : export du mois précédent ({start_date.strftime("%B %Y")}) '
f'du {start_date} au {end_date}'
)
)
else:
# Validation des dates
if start_date:
try:
start_date = datetime.strptime(start_date, '%Y-%m-%d').date()
except ValueError:
self.stderr.write(self.style.ERROR(f'Format de date invalide pour start_date: {start_date}. Utilisez YYYY-MM-DD'))
return
if end_date:
try:
end_date = datetime.strptime(end_date, '%Y-%m-%d').date()
except ValueError:
self.stderr.write(self.style.ERROR(f'Format de date invalide pour end_date: {end_date}. Utilisez YYYY-MM-DD'))
return
# Substituer les variables dans le nom du fichier de sortie
if output_file:
# Utiliser le mois précédent pour le nom de fichier (cohérent avec les données exportées)
if start_date:
file_year = start_date.year
file_month = start_date.month
else:
today = date.today()
prev_month = today.replace(day=1) - relativedelta(months=1)
file_year = prev_month.year
file_month = prev_month.month
output_file = output_file.replace('%(year)s', str(file_year))
output_file = output_file.replace('%(month)s', f'{file_month:02d}')
output_file = output_file.replace('%(day)s', f'{date.today().day:02d}')
output_file = output_file.replace('%(date)s', date.today().strftime('%Y-%m-%d'))
# Convertir en chemin absolu si c'est un chemin relatif
if not os.path.isabs(output_file):
output_file = os.path.join(settings.BASE_DIR, output_file)
# Créer le répertoire parent s'il n'existe pas
output_dir = os.path.dirname(output_file)
if output_dir and not os.path.exists(output_dir):
os.makedirs(output_dir, exist_ok=True)
self.stdout.write(f'Répertoire créé: {output_dir}')
self.stdout.write(self.style.SUCCESS('Démarrage de l\'export des interventions...'))
self.stdout.write(f'Fichier de sortie: {output_file}')
# Générer le workbook en utilisant le service
wb = generate_interventions_excel(start_date, end_date, output_format='workbook')
# Sauvegarder le fichier
try:
wb.save(output_file)
self.stdout.write(self.style.SUCCESS(f'\n✓ Export terminé avec succès!'))
self.stdout.write(self.style.SUCCESS(f'✓ Fichier généré: {output_file}'))
except Exception as e:
self.stderr.write(self.style.ERROR(f'Erreur lors de la sauvegarde du fichier: {e}'))