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.
 
 
 
 
 
 

130 lines
4.5 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):
return now().isoweekday() == self.weekday and now().time() >= self.start_at
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(default=now)
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 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()