from datetime import timedelta from django.db import models from django.utils.timezone import now from project.mixins import BaseModel, DeactivatedMixin from apps.content.models import ImageObject from apps.payment import models as payment_models class SchoolSchedule(models.Model): WEEKDAY_CHOICES = ( (1, 'понедельник'), (2, 'вторник'), (3, 'среда'), (4, 'четверг'), (5, 'пятница'), (6, 'суббота'), (7, 'воскресенье'), ) weekday = models.PositiveSmallIntegerField( 'День недели', choices=WEEKDAY_CHOICES, unique=True ) title = models.CharField('Заголовок', default='', max_length=100, db_index=True) short_description = models.CharField( 'Короткое описание', default='', max_length=100, db_index=True ) description = models.TextField('Описание') materials = models.TextField('Материалы') age = models.PositiveSmallIntegerField('Возраст', default=0) month_price = models.DecimalField('Цена', max_digits=8, decimal_places=2, default=0) day_discount = models.DecimalField( 'Скидка, в валюте', max_digits=8, decimal_places=2, default=0 ) start_at = models.TimeField('Начало урока', null=True) class Meta: ordering = ('weekday',) verbose_name = 'Расписание' verbose_name_plural = 'Расписания' def __str__(self): return dict(self.WEEKDAY_CHOICES).get(self.weekday, '') def is_online(self): return now().isoweekday() == self.weekday and now().time() >= self.start_at def is_purchased(self): date_now = now().date() try: school_payment = payment_models.SchoolPayment.objects.get( weekdays__contains=[self.weekday], date_start__lte=date_now, date_end__gte=date_now, ) except payment_models.SchoolPayment.DoesNotExist: return False else: return school_payment.is_deliverable() def current_live_lesson(self): now_time = now() live_lesson = LiveLesson.objects.filter( date__week_day=self.weekday + 1 if self.weekday % 7 else 1, date__week=now_time.date().isocalendar()[1], deactivated_at__isnull=True, ).first() return live_lesson def previous_live_lesson(self): now_time = now() live_lesson = LiveLesson.objects.filter( date__week_day=self.weekday + 1 if self.weekday % 7 else 1, date__week=(now_time.date() - timedelta(weeks=1)).isocalendar()[1], deactivated_at__isnull=True, ).first() return live_lesson class SchoolScheduleImage(models.Model): schoolschedule = models.ForeignKey( SchoolSchedule, on_delete=models.CASCADE, verbose_name='День занятия', related_name='schoolschedule_images', ) img = models.ForeignKey( ImageObject, related_name='schoolschedule_images', verbose_name='Объект изображения', on_delete=models.CASCADE, null=True, blank=True, ) created_at = models.DateTimeField(auto_now_add=True) update_at = models.DateTimeField(auto_now=True) class Meta: verbose_name = 'Изображение работ' verbose_name_plural = 'Изображения работ' ordering = ('-created_at',) class LiveLesson(BaseModel, DeactivatedMixin): title = models.CharField('Название урока', max_length=100) short_description = models.TextField('Краткое описание урока') stream = models.URLField('Ссылка на VIMEO', default='', blank=True) date = models.DateField(null=True, blank=True) cover = models.ForeignKey( ImageObject, related_name='livelesson_covers', verbose_name='Обложка урока школы', on_delete=models.CASCADE, null=True, blank=True, ) created_at = models.DateTimeField(auto_now_add=True) update_at = models.DateTimeField(auto_now=True) def __str__(self): return self.title class Meta: verbose_name = 'Урок онлайн школы' verbose_name_plural = 'Уроки онлайн школы' ordering = ('title',)