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.
 
 
 
 
 
 

146 lines
5.3 KiB

import arrow
from datetime import datetime, timedelta
from django.conf import settings
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), settings.TIME_ZONE).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()