import os from django.conf import settings from django.db import models from django.utils.text import slugify from django.db.models.signals import pre_save from django.dispatch import receiver from transliterate import translit from routes.constants.account_types import account_types from django.contrib.auth.models import User from routes.models import Route class FAQ (models.Model): title = models.CharField(max_length=250) content = models.CharField(max_length=800) class Meta: verbose_name = 'FAQ' verbose_name_plural = 'FAQs' ordering = ['id'] def __str__(self): return self.title class News(models.Model): titleImage = models.ImageField(upload_to='uploads/news/images/', verbose_name="Главная картинка") title = models.CharField(max_length=100, verbose_name="Заголовок") content = models.TextField(max_length=1000, verbose_name="Контент статьи") slug = models.SlugField(max_length=255, null=True, blank=True, editable=False) created_at = models.DateTimeField(auto_now_add=True, null=True, blank=True) filename = models.CharField(max_length=255, blank=True) path = models.CharField(max_length=255, blank=True) class Meta: verbose_name = 'Новость' verbose_name_plural = 'Новости' ordering = ['id'] def __str__(self): return self.title def save(self, *args, **kwargs): super().save(*args, **kwargs) #сохраняем изображение # генерируем путь к файлу если удалось его сохранить if self.titleImage: self.filename = os.path.basename(self.titleImage.name) self.path = f'{settings.BASE_URL}{settings.MEDIA_URL}{self.titleImage.name}' super().save(*args, **kwargs) # записываем путь и имя файла в базу else: self.filename = '' self.path = '' @receiver(pre_save, sender=News) def generate_slug(sender, instance, **kwargs): if not instance.slug: # транслит с русского на латиницу transliterated_title = translit(instance.title, 'ru', reversed=True) # создаем слаг и заменяем пробелы на дефисы instance.slug = slugify(transliterated_title) class Pricing(models.Model): plan = models.CharField(max_length=10, choices=account_types) price = models.IntegerField() is_popular = models.BooleanField(default=False) duration = models.CharField(default='7 дней', verbose_name='Длительность подписки (в днях)') duration_hours = models.IntegerField(default=168, verbose_name='Длительность подписки (в часах)') features = models.ManyToManyField('Feature', related_name='pricing_plans', verbose_name='Свойства') highlight_limit = models.IntegerField(default=5, null=True, verbose_name='Лимит выделений в месяц') rising_limit = models.IntegerField(default=5, null=True, verbose_name='Лимит поднятий в месяц') class Meta: verbose_name = 'Тарифный план' verbose_name_plural = 'Тарифные планы' def __str__(self): return self.plan class Feature(models.Model): name = models.CharField(max_length=255, verbose_name='Название свойства') class Meta: verbose_name = 'Свойство' verbose_name_plural = 'Свойства' def __str__(self): return self.name class Transactions(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Пользователь') amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Сумма') plan = models.ForeignKey(Pricing, on_delete=models.CASCADE, verbose_name='Тарифный план') status = models.CharField(max_length=255, verbose_name='Статус', choices=[('success', 'Успешно'), ('failed', 'Отклонено')]) created_at = models.DateTimeField(auto_now_add=True, verbose_name='Дата создания') class Meta: verbose_name = 'Транзакция' verbose_name_plural = 'Транзакции' ordering = ['id'] def __str__(self): return f'{self.user} - {self.amount}' class RoutePromotionLog(models.Model): ACTION_CHOICES = [ ('highlight', 'Выделение'), ('rising', 'Поднятие'), ] route = models.ForeignKey(Route, on_delete=models.CASCADE, related_name='promotion_logs') user = models.ForeignKey(User, on_delete=models.CASCADE) action_type = models.CharField(max_length=20, choices=ACTION_CHOICES) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return f"{self.user} - {self.action_type} for route {self.route.id} at {self.created_at}"