import uuid from datetime import datetime from django.conf import settings from django.db import models class TimeEntry(models.Model): user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='time_entries', ) # Même group_id = même pointage logique réparti sur plusieurs jours. # NULL pour les pointages classiques sur une seule journée. group_id = models.UUIDField( null=True, blank=True, db_index=True, ) date = models.DateField() start_time = models.TimeField( null=True, blank=True, ) end_time = models.TimeField( null=True, blank=True, ) end_time = models.TimeField( null=True, blank=True, ) created_at = models.DateTimeField( auto_now_add=True, ) updated_at = models.DateTimeField( auto_now=True, ) class Meta: ordering = ['-date', '-start_time'] unique_together = [ 'user', 'date', 'start_time', ] def __str__(self): return ( f"{self.user.username} - " f"{self.date} " f"({self.start_time} to {self.end_time})" ) @property def duration(self): if not self.start_time or not self.end_time: return None end_date = self.end_date or self.date start = datetime.combine( self.date, self.start_time, ) end = datetime.combine( end_date, self.end_time, ) seconds = ( end - start ).total_seconds() if seconds < 0: return None return seconds / 3600 @property def day_of_week(self): return self.date.strftime('%A') @property def is_complete(self): return bool( self.start_time and self.end_time ) @property def is_incomplete(self): return not self.is_complete