103 lines
2.0 KiB
Python
103 lines
2.0 KiB
Python
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 |