43 lines
1.6 KiB
Python
43 lines
1.6 KiB
Python
from django.core.exceptions import ValidationError
|
||
from django.db import models
|
||
|
||
|
||
class User(models.Model):
|
||
name = models.CharField(verbose_name='Имя', max_length=50)
|
||
email = models.CharField(verbose_name='Почта', max_length=50)
|
||
|
||
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, verbose_name='Пользователь')
|
||
activity = models.ForeignKey(Activity, on_delete=models.CASCADE, verbose_name='Тип активности')
|
||
|
||
start_time = models.DateTimeField(verbose_name='Момент начала')
|
||
end_time = models.DateTimeField(verbose_name='Момент окончания')
|
||
logged_at = models.DateTimeField(auto_now_add=True)
|
||
|
||
def clean(self):
|
||
if self.start_time is None or self.end_time is None:
|
||
raise ValidationError(f'Не указано время: {self}')
|
||
|
||
if self.start_time >= self.end_time:
|
||
raise ValidationError(f'Некорректное время: {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'Пересекается с другой активностью: \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})'
|