You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
4.9 KiB
136 lines
4.9 KiB
from datetime import datetime, 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):
|
|
end_at = datetime.combine(now().today(), self.start_at) + timedelta(hours=2)
|
|
return self.start_at <= now().time() and end_at.time() >= now().time() and self.weekday == now().isoweekday()
|
|
|
|
def current_live_lesson(self):
|
|
now_time = now()
|
|
live_lesson = LiveLesson.objects.filter(
|
|
date__week_day=self.weekday % 7 + 1,
|
|
date__range=[now_time.date(), (now_time + timedelta(days=6)).date()],
|
|
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 % 7 + 1,
|
|
date__range=[(now_time - timedelta(days=8)).date(), (now_time - timedelta(days=1)).date()],
|
|
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, default='', blank=True)
|
|
short_description = models.TextField('Краткое описание урока', default='', blank=True)
|
|
stream = models.URLField('Ссылка на VIMEO', default='', blank=True)
|
|
date = models.DateField(default=now, unique=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)
|
|
|
|
class Meta:
|
|
verbose_name = 'Урок онлайн школы'
|
|
verbose_name_plural = 'Уроки онлайн школы'
|
|
ordering = ('-date', 'title',)
|
|
|
|
def __str__(self):
|
|
return self.title
|
|
|
|
def save(self, *args, **kwargs):
|
|
if not self.id and LiveLesson.objects.filter(date=self.date).exists():
|
|
self.date = (datetime.combine(self.date, now().time()) + timedelta(days=1)).date()
|
|
super().save(*args, **kwargs)
|
|
|
|
def stream_index(self):
|
|
return self.stream.split('/')[-1]
|
|
|
|
def is_online(self):
|
|
weekday = self.date.isoweekday() if self.date else None
|
|
try:
|
|
school_schedule = SchoolSchedule.objects.get(weekday=weekday)
|
|
except SchoolSchedule.DoesNotExist:
|
|
return False
|
|
else:
|
|
start_at = school_schedule.start_at
|
|
end_at = datetime.combine(now().today(), start_at) + timedelta(hours=2)
|
|
return start_at <= now().time() and end_at.time() >= now().time()
|
|
|