from django.db import models from django.contrib.auth.models import User from django.utils import timezone from common.storages import PrivateMediaStorage private_storage = PrivateMediaStorage() class GeocodingTask(models.Model): """Model to track geocoding tasks""" STATUS_CHOICES = [ ('pending', 'En attente'), ('processing', 'En cours'), ('completed', 'Terminé'), ('failed', 'Échoué'), ] user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Utilisateur") uploaded_file = models.FileField( upload_to='schools/geocoding/uploads/%Y/%m/%d/', storage=private_storage, verbose_name="Fichier uploadé" ) output_file = models.FileField( upload_to='schools/geocoding/outputs/%Y/%m/%d/', storage=private_storage, verbose_name="Fichier résultat", blank=True, null=True ) status = models.CharField( max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name="Statut" ) created_at = models.DateTimeField(auto_now_add=True, verbose_name="Créé le") started_at = models.DateTimeField(null=True, blank=True, verbose_name="Démarré le") completed_at = models.DateTimeField(null=True, blank=True, verbose_name="Terminé le") error_message = models.TextField(blank=True, null=True, verbose_name="Message d'erreur") # Statistics total_rows = models.IntegerField(default=0, verbose_name="Nombre total de lignes") successful_geocodes = models.IntegerField(default=0, verbose_name="Géolocalisations réussies") failed_geocodes = models.IntegerField(default=0, verbose_name="Géolocalisations échouées") class Meta: verbose_name = "Tâche de géolocalisation" verbose_name_plural = "Tâches de géolocalisation" ordering = ['-created_at'] def __str__(self): return f"Tâche {self.id} - {self.user.username} - {self.status}"