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 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) class Meta: verbose_name = 'Тарифный план' verbose_name_plural = 'Тарифные планы' def __str__(self): return self.plan class MembershipFeatures(models.Model): plan = models.ForeignKey(Pricing, on_delete=models.CASCADE, verbose_name=('Тарифный план')) feature = models.CharField(max_length=255) 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='Статус') 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}'