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.
 
 
 
 
 
 

145 lines
5.3 KiB

import arrow
from datetime import datetime, timedelta
from django.db import models
from django.urls import reverse_lazy
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=1)
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
@property
def start_at_humanize(self):
return arrow.get(datetime.combine(datetime.today(), self.start_at)).humanize(locale='ru') if self.start_at else None
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 get_absolute_url(self):
return reverse_lazy('school:lesson-detail', args=[str(self.id)])
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=1)
return start_at <= now().time() and end_at.time() >= now().time()