40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
from django.core.exceptions import ValidationError
|
|
from django.db import models
|
|
|
|
|
|
class User(models.Model):
|
|
name = models.TextField()
|
|
email = models.TextField()
|
|
|
|
def __str__(self):
|
|
return f'{self.name}'
|
|
|
|
|
|
class Activity(models.Model):
|
|
type = models.TextField()
|
|
|
|
def __str__(self):
|
|
return f'{self.type}'
|
|
|
|
|
|
class ActivityLog(models.Model):
|
|
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
|
activity = models.ForeignKey(Activity, on_delete=models.CASCADE)
|
|
|
|
start_time = models.DateTimeField()
|
|
end_time = models.DateTimeField()
|
|
logged_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
def clean(self):
|
|
if self.start_time >= self.end_time:
|
|
raise ValidationError(f'Illegal times: {self}')
|
|
|
|
for other_activity in ActivityLog.objects.filter(user=self.user).exclude(id=self.id):
|
|
l = max(self.start_time, other_activity.start_time)
|
|
r = min(self.end_time, other_activity.end_time)
|
|
if r > l:
|
|
raise ValidationError(f'Intersects with another activity: \n{self}\n{other_activity}\n{l}, {r}')
|
|
|
|
def __str__(self):
|
|
return f'ActivityLog[{self.user}, {self.activity}] {self.start_time}-{self.end_time} ({self.end_time - self.start_time})'
|