Files
tripwithbonus/backend/sitemanagement/models.py
2025-05-30 18:13:52 +03:00

117 lines
5.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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}"