403 lines
14 KiB
Python
403 lines
14 KiB
Python
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 = "Шаблоны писем"
|