from django.db import models from django.utils.text import slugify from apps.catalog.models import Brand, Product class Collection(models.Model): """Подборка позиций (ТЗ §3.7, §4: Collection).""" name = models.CharField('Название', max_length=200) slug = models.SlugField('Slug', max_length=220, unique=True, blank=True) banner = models.ImageField('Баннер', upload_to='collections/', blank=True, null=True) description = models.TextField('Описание', blank=True) products = models.ManyToManyField( Product, related_name='collections', blank=True, verbose_name='Позиции', ) is_published = models.BooleanField('Опубликована', default=False) published_at = models.DateTimeField('Дата публикации', null=True, blank=True) class Meta: verbose_name = 'Подборка' verbose_name_plural = 'Подборки' ordering = ('name',) def __str__(self): return self.name def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.name, allow_unicode=True) super().save(*args, **kwargs) class Article(models.Model): """Раздел «Истории брендов» (ТЗ §3.7).""" brand = models.ForeignKey( Brand, null=True, blank=True, on_delete=models.SET_NULL, related_name='articles', verbose_name='Бренд', ) title = models.CharField('Заголовок', max_length=255) slug = models.SlugField('Slug', max_length=280, unique=True, blank=True) cover = models.ImageField('Обложка', upload_to='articles/', blank=True, null=True) body = models.TextField('Текст') published_at = models.DateTimeField('Опубликована', null=True, blank=True) class Meta: verbose_name = 'История бренда' verbose_name_plural = 'Истории брендов' ordering = ('-published_at',) def __str__(self): return self.title def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.title, allow_unicode=True) super().save(*args, **kwargs) class NewsEvent(models.Model): """Новости проекта и анонсы офлайн-ярмарок (ТЗ §3.7).""" title = models.CharField('Заголовок', max_length=255) slug = models.SlugField('Slug', max_length=280, unique=True, blank=True) body = models.TextField('Текст') image = models.ImageField('Изображение', upload_to='news/', blank=True, null=True) event_date = models.DateTimeField('Дата события', null=True, blank=True) is_published = models.BooleanField('Опубликовано', default=False) published_at = models.DateTimeField('Опубликовано', null=True, blank=True) class Meta: verbose_name = 'Новость / событие' verbose_name_plural = 'Новости и события' ordering = ('-published_at',) def __str__(self): return self.title def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.title, allow_unicode=True) super().save(*args, **kwargs) class Banner(models.Model): """Баннерная зона на главной (ТЗ §3.7).""" title = models.CharField('Заголовок', max_length=200, blank=True) image = models.ImageField('Изображение', upload_to='banners/') url = models.URLField('Ссылка', blank=True) sort_order = models.PositiveIntegerField('Порядок', default=0) is_active = models.BooleanField('Активен', default=True) class Meta: verbose_name = 'Баннер' verbose_name_plural = 'Баннеры' ordering = ('sort_order',) def __str__(self): return self.title or f'Баннер #{self.pk}'