mns/global_data/models.py

403 lines
14 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.

from slugify import slugify
from django.db import models
from django.core.validators import MaxValueValidator
from markdownfield.models import MarkdownField, RenderedMarkdownField
from markdownfield.validators import VALIDATOR_STANDARD
from mns.utils import group_based_upload_to
class Seo(models.Model):
"""
Модель SEO содержит информацию о тексте, электронной почте, дополнительном тексте и изображении.
"""
# Первичный ключ, автоинкрементируемый
id = models.AutoField(primary_key=True, verbose_name="ID")
# Поле для хранения текста с максимальной длиной 200 символов
text = models.CharField(
max_length=200, help_text="Введите текст", verbose_name="Текст"
)
# Поле для хранения email-адреса
email = models.EmailField(help_text="Введите Email", verbose_name="Email")
# Поле для хранения дополнительного текста, может быть пустым
blank = models.TextField(blank=True, null=True, verbose_name="Дополнительный текст")
# Поле для хранения изображения, загружается по указанному пути
image = models.ImageField(
upload_to=group_based_upload_to,
default="", # Пустая строка в качестве значения по умолчанию
verbose_name="Изображение",
)
def __str__(self):
return f"{self.text}"
class Meta:
verbose_name = "SEO запись"
verbose_name_plural = "SEO записи"
class Page(models.Model):
"""
Модель Page содержит информацию о странице, включая порядок отображения,
заголовки меню и страницы, содержимое, слаг, изображение и внешнюю ссылку.
"""
# Порядок отображения страницы
order = models.IntegerField(
verbose_name="Порядок",
help_text="Введите порядковый номер страницы для сортировки",
)
# Заголовок меню
menu_title = models.CharField(
max_length=100,
verbose_name="Заголовок меню",
help_text="Введите заголовок, который будет отображаться в меню",
)
# Заголовок страницы
title = models.CharField(
max_length=100,
verbose_name="Заголовок страницы",
help_text="Введите заголовок страницы",
)
# Содержимое страницы в формате Markdown
content = MarkdownField(
rendered_field="content_rendered",
validator=VALIDATOR_STANDARD,
verbose_name="Содержимое (Markdown)",
help_text="Введите содержимое страницы в формате Markdown",
)
# Отрендеренное содержимое страницы
content_rendered = RenderedMarkdownField(
verbose_name="Отрендеренное содержимое",
help_text="Это поле автоматически генерируется из поля 'Содержимое'",
)
# Slug для URL страницы
slug = models.SlugField(
unique=True,
verbose_name="Slug",
help_text="Введите уникальный slug для URL страницы",
)
# Изображение страницы
image = models.ImageField(
upload_to=group_based_upload_to,
default=None, # Убедитесь, что это значение корректно
null=True,
blank=True,
verbose_name="Изображение",
help_text="Выберите изображение для страницы",
)
# Внешняя ссылка
external_link = models.CharField(
max_length=100,
blank=True,
null=True,
verbose_name="Внешняя ссылка",
help_text="Введите внешнюю ссылку, если она есть",
)
def __str__(self):
return f"{self.menu_title} #{self.slug} {self.order}"
class Meta:
verbose_name = "Страница"
verbose_name_plural = "Страницы"
class Menu(models.Model):
"""
Модель Menu содержит информацию о меню, включая страницы и тип меню.
"""
# Связь с моделью Page (многие ко многим)
pages = models.ManyToManyField(
Page,
verbose_name="Страницы",
help_text="Выберите страницы, которые будут включены в меню",
)
# Тип меню (выбор из списка)
type = models.IntegerField(
choices=[
(1, "TopMenu"),
],
unique=True,
verbose_name="Тип меню",
help_text="Выберите тип меню",
)
def __str__(self):
"""
Возвращает строковое представление объекта модели.
"""
menu_type = dict(self._meta.get_field("type").choices).get(
self.type, "Неизвестно"
)
return f"Меню {menu_type}"
class Meta:
verbose_name = "Меню"
verbose_name_plural = "Меню"
class ReviewModel(models.Model):
"""
Модель ReviewModel содержит информацию о отзывах, включая изображение, текст и комментарий.
"""
# Изображение отзыва
image = models.ImageField(
upload_to=group_based_upload_to,
null=True,
blank=True,
verbose_name="Изображение",
help_text="Выберите изображение для отзыва",
)
# Текст отзыва
text = models.CharField(
max_length=200, # Установите максимальную длину строки
verbose_name="Текст",
help_text="Введите текст отзыва",
)
# Комментарий к отзыву
comment = models.TextField(
verbose_name="Комментарий", help_text="Введите комментарий к отзыву"
)
def __str__(self):
"""
Возвращает строковое представление объекта модели.
"""
return f"{self.text}"
class Meta:
verbose_name = "Отзыв"
verbose_name_plural = "Отзывы"
class Ref1C(models.Model):
"""
Модель для хранения ссылки на данные из 1С (Ref_Key), флага для включения синхронизации,
последней синхронизированной цены и значения по умолчанию.
"""
ref_key = models.CharField(
max_length=255,
verbose_name="Ref_Key",
help_text="Уникальный идентификатор из 1С",
)
sync_enabled = models.BooleanField(
default=False,
verbose_name="Включить синхронизацию",
help_text="Флаг для включения синхронизации данных из 1С",
)
default_value = models.DecimalField(
max_digits=7,
decimal_places=2,
verbose_name="Значение по умолчанию",
help_text="Значение, используемое по умолчанию или при отсутствии данных из 1С",
)
last_sync_price = models.DecimalField(
max_digits=7,
decimal_places=2,
null=True,
blank=True,
verbose_name="Последняя синхронизированная цена",
help_text="Последняя цена, полученная из 1С",
)
updated_at = models.DateTimeField(
auto_now=True,
verbose_name="Последнее обновление",
help_text="Дата и время последнего обновления записи"
)
def __str__(self):
return f"Ref_Key: {self.ref_key}"
class Meta:
verbose_name = "Ссылка на 1С"
verbose_name_plural = "Ссылки на 1С"
class FooterModel(models.Model):
"""
Модель FooterModel содержит информацию о нижнем колонтитуле, включая текст и флаг малого текста.
"""
# Текст нижнего колонтитула
text = models.TextField(
max_length=1000,
verbose_name="Текст",
help_text="Введите текст нижнего колонтитула",
)
# Флаг малого текста
small_text = models.BooleanField(
verbose_name="Малый текст",
help_text="Отметьте, если текст должен быть маленьким",
)
def __str__(self):
"""
Возвращает строковое представление объекта модели.
"""
return f"{self.text}"
class Meta:
verbose_name = "Нижний колонтитул"
verbose_name_plural = "Нижние колонтитулы"
class CustomRequest(models.Model):
"""
Модель CustomRequest содержит информацию о пользовательских запросах,
включая имя, телефон, email, дату создания, информацию о заборе и согласие на политику конфиденциальности.
"""
# Имя пользователя
name = models.CharField(
max_length=100, verbose_name="Имя", help_text="Введите имя пользователя"
)
# Телефон пользователя (необязательное поле)
phone = models.CharField(
max_length=100,
blank=True,
null=True,
verbose_name="Телефон",
help_text="Введите телефон пользователя",
)
# Email пользователя (необязательное поле)
email = models.CharField(
max_length=100,
blank=True,
null=True,
verbose_name="Email",
help_text="Введите email пользователя",
)
# Дата и время создания запроса
date = models.DateTimeField(
auto_now_add=True,
verbose_name="Дата создания",
help_text="Дата и время создания запроса",
)
# Информация о заборе
fence_info = models.TextField(
verbose_name="Информация о заборе", help_text="Введите информацию о заборе"
)
# Согласие на политику конфиденциальности
privacy = models.BooleanField(
verbose_name="Политика конфиденциальности",
help_text="Отметьте, если пользователь согласен с политикой конфиденциальности",
)
def __str__(self):
"""
Возвращает строковое представление объекта модели.
"""
return f"{self.name} {self.phone} {self.date}"
class Meta:
verbose_name = "Пользовательский запрос"
verbose_name_plural = "Пользовательские запросы"
class SocialNetwork(models.Model):
"""
Модель SocialNetwork содержит информацию о социальных сетях, включая название, ссылку и иконку.
"""
# Название социальной сети
name = models.CharField(
max_length=50,
verbose_name="Название",
help_text="Введите название социальной сети",
)
# Ссылка на социальную сеть
link = models.CharField(
max_length=50,
verbose_name="Ссылка",
help_text="Введите ссылку на социальную сеть",
)
# Иконка социальной сети (необязательное поле)
icon = models.TextField(
blank=True,
null=True,
verbose_name="Иконка",
help_text="Введите HTML-код или путь к иконке социальной сети",
)
def __str__(self):
"""
Возвращает строковое представление объекта модели.
"""
return f"{self.name}"
class Meta:
verbose_name = "Социальная сеть"
verbose_name_plural = "Социальные сети"
class LetterTemplate(models.Model):
"""
Модель LetterTemplate содержит информацию о шаблонах писем, включая тему, тело письма, копию адресата и тип письма.
"""
# Тема письма
subject = models.CharField(
max_length=100, verbose_name="Тема письма", help_text="Введите тему письма"
)
# Тело письма
body = models.TextField(
verbose_name="Текст письма", help_text="Введите текст письма"
)
# Копия адресата (необязательное поле)
copy_to = models.EmailField(
blank=True,
null=True,
verbose_name="Копия адресата",
help_text="Введите email для копии письма",
)
# Тип письма (выбор из списка)
type = models.CharField(
choices=[
("user_submit", "Submit"),
],
unique=True,
verbose_name="Тип письма",
help_text="Выберите тип письма",
)
def __str__(self):
"""
Возвращает строковое представление объекта модели.
"""
return f"{self.subject}"
class Meta:
verbose_name = "Шаблон письма"
verbose_name_plural = "Шаблоны писем"