from django.core.exceptions import ValidationError from django.db import models class User(models.Model): name = models.TextField(verbose_name='Имя') email = models.TextField(verbose_name='Почта') 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 >= 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})'