120 lines
4.9 KiB
Python
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}'))
|