import arrow from django.db import models from django.utils import timezone from django.contrib.auth import get_user_model from polymorphic_tree.models import PolymorphicMPTTModel, PolymorphicTreeForeignKey from .manager import CategoryQuerySet from apps.content.models import ImageObject, Gallery User = get_user_model() class Like(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) update_at = models.DateTimeField(auto_now=True) class Course(models.Model): PENDING = 0 PUBLISHED = 1 ARCHIVED = 2 STATUS_CHOICES = ( (PENDING, 'Pending'), (PUBLISHED, 'Published'), (ARCHIVED, 'Archived'), ) author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) title = models.CharField('Название курса', max_length=100, db_index=True) short_description = models.TextField('Краткое описание курса', db_index=True) from_author = models.TextField('От автора', default='', null=True, blank=True) cover = models.ForeignKey( ImageObject, related_name='course_covers', verbose_name='Обложка курса', on_delete=models.CASCADE, null=True, blank=True, ) price = models.DecimalField( 'Цена курса', help_text='Если цены нету, то курс бесплатный', max_digits=10, decimal_places=2, null=True, blank=True ) is_infinite = models.BooleanField(default=False) deferred_start_at = models.DateTimeField( 'Отложенный запуск курса', help_text='Заполнить если курс отложенный', null=True, blank=True ) category = models.ForeignKey('Category', on_delete=models.PROTECT) duration = models.IntegerField('Продолжительность курса', default=0) is_featured = models.BooleanField(default=False) url = models.URLField('Ссылка', default='') status = models.PositiveSmallIntegerField('Статус', default=0, choices=STATUS_CHOICES) likes = models.ManyToManyField(Like, blank=True) materials = models.ManyToManyField('Material', blank=True) gallery = models.ForeignKey( Gallery, 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) @property def is_free(self): if self.price: return False return True @property def deferred_start_at_humanize(self): return arrow.get(self.deferred_start_at).humanize(locale='ru') @property def created_at_humanize(self): return arrow.get(self.created_at).humanize(locale='ru') @property def is_deferred_start(self): if not self.deferred_start_at: return False if timezone.now() < self.deferred_start_at: return True return False def __str__(self): return str(self.id) + ' ' + self.title class Meta: verbose_name = 'Курс' verbose_name_plural = 'Курсы' ordering = ['-created_at'] class Category(models.Model): title = models.CharField('Название категории', max_length=100) def __str__(self): return self.title class Meta: verbose_name = 'Категория' verbose_name_plural = 'Категории' ordering = ['title'] class Lesson(models.Model): title = models.CharField('Название урока', max_length=100) short_description = models.TextField('Краткое описание урока') course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='lessons') cover = models.ForeignKey( ImageObject, related_name='lesson_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',) class Material(models.Model): title = models.CharField('Название материала', max_length=100) cover = models.ImageField('Фон материала', upload_to='materials') short_description = models.TextField('Краткое описание материала') 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',) class Comment(PolymorphicMPTTModel): content = models.TextField('Текст комментария', default='') author = models.ForeignKey(User, on_delete=models.CASCADE) parent = PolymorphicTreeForeignKey( 'self', null=True, blank=True, related_name='children', db_index=True, on_delete=models.PROTECT ) created_at = models.DateTimeField(auto_now_add=True) update_at = models.DateTimeField(auto_now=True) @property def created_at_humanize(self): return arrow.get(self.created_at).humanize(locale='ru') def __str__(self): return self.content class Meta: ordering = ('-created_at',) class MPTTMeta: order_insertion_by = ['-created_at'] class CourseComment(Comment): course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='comments') class Meta(Comment.Meta): verbose_name = 'Комментарий курса' verbose_name_plural = 'Комментарии курсов' class LessonComment(Comment): lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE, related_name='comments') class Meta(Comment.Meta): verbose_name = 'Комментарий урока' verbose_name_plural = 'Комментарии уроков'