367 lines
15 KiB
Python
367 lines
15 KiB
Python
# Generated by Django 4.2.7 on 2025-12-09 21:02
|
||
|
||
from django.conf import settings
|
||
from django.db import migrations, models
|
||
import django.db.models.deletion
|
||
|
||
|
||
class Migration(migrations.Migration):
|
||
initial = True
|
||
|
||
dependencies = [
|
||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||
("contenttypes", "0002_remove_content_type_name"),
|
||
]
|
||
|
||
operations = [
|
||
migrations.CreateModel(
|
||
name="NotificationTemplate",
|
||
fields=[
|
||
(
|
||
"id",
|
||
models.BigAutoField(
|
||
auto_created=True,
|
||
primary_key=True,
|
||
serialize=False,
|
||
verbose_name="ID",
|
||
),
|
||
),
|
||
(
|
||
"notification_type",
|
||
models.CharField(
|
||
max_length=50, unique=True, verbose_name="Тип уведомления"
|
||
),
|
||
),
|
||
(
|
||
"in_app_title",
|
||
models.CharField(
|
||
blank=True,
|
||
max_length=200,
|
||
verbose_name="Заголовок (внутри приложения)",
|
||
),
|
||
),
|
||
(
|
||
"in_app_message",
|
||
models.TextField(
|
||
blank=True, verbose_name="Сообщение (внутри приложения)"
|
||
),
|
||
),
|
||
(
|
||
"email_subject",
|
||
models.CharField(
|
||
blank=True, max_length=200, verbose_name="Тема email"
|
||
),
|
||
),
|
||
(
|
||
"email_body",
|
||
models.TextField(blank=True, verbose_name="Тело email (HTML)"),
|
||
),
|
||
(
|
||
"telegram_message",
|
||
models.TextField(blank=True, verbose_name="Сообщение Telegram"),
|
||
),
|
||
(
|
||
"variables",
|
||
models.JSONField(
|
||
blank=True,
|
||
default=list,
|
||
help_text="Список доступных переменных для подстановки",
|
||
verbose_name="Переменные шаблона",
|
||
),
|
||
),
|
||
(
|
||
"is_active",
|
||
models.BooleanField(default=True, verbose_name="Активен"),
|
||
),
|
||
(
|
||
"created_at",
|
||
models.DateTimeField(
|
||
auto_now_add=True, verbose_name="Дата создания"
|
||
),
|
||
),
|
||
(
|
||
"updated_at",
|
||
models.DateTimeField(auto_now=True, verbose_name="Дата обновления"),
|
||
),
|
||
],
|
||
options={
|
||
"verbose_name": "Шаблон уведомления",
|
||
"verbose_name_plural": "Шаблоны уведомлений",
|
||
"db_table": "notification_templates",
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name="NotificationPreference",
|
||
fields=[
|
||
(
|
||
"id",
|
||
models.BigAutoField(
|
||
auto_created=True,
|
||
primary_key=True,
|
||
serialize=False,
|
||
verbose_name="ID",
|
||
),
|
||
),
|
||
(
|
||
"enabled",
|
||
models.BooleanField(
|
||
default=True, verbose_name="Уведомления включены"
|
||
),
|
||
),
|
||
(
|
||
"email_enabled",
|
||
models.BooleanField(default=True, verbose_name="Email уведомления"),
|
||
),
|
||
(
|
||
"telegram_enabled",
|
||
models.BooleanField(
|
||
default=False, verbose_name="Telegram уведомления"
|
||
),
|
||
),
|
||
(
|
||
"in_app_enabled",
|
||
models.BooleanField(
|
||
default=True, verbose_name="Внутренние уведомления"
|
||
),
|
||
),
|
||
(
|
||
"type_preferences",
|
||
models.JSONField(
|
||
blank=True,
|
||
default=dict,
|
||
help_text="Настройки для каждого типа уведомлений",
|
||
verbose_name="Настройки по типам",
|
||
),
|
||
),
|
||
(
|
||
"quiet_hours_enabled",
|
||
models.BooleanField(
|
||
default=False, verbose_name="Режим тишины включен"
|
||
),
|
||
),
|
||
(
|
||
"quiet_hours_start",
|
||
models.TimeField(
|
||
blank=True, null=True, verbose_name="Начало режима тишины"
|
||
),
|
||
),
|
||
(
|
||
"quiet_hours_end",
|
||
models.TimeField(
|
||
blank=True, null=True, verbose_name="Конец режима тишины"
|
||
),
|
||
),
|
||
(
|
||
"created_at",
|
||
models.DateTimeField(
|
||
auto_now_add=True, verbose_name="Дата создания"
|
||
),
|
||
),
|
||
(
|
||
"updated_at",
|
||
models.DateTimeField(auto_now=True, verbose_name="Дата обновления"),
|
||
),
|
||
(
|
||
"user",
|
||
models.OneToOneField(
|
||
on_delete=django.db.models.deletion.CASCADE,
|
||
related_name="notification_preferences",
|
||
to=settings.AUTH_USER_MODEL,
|
||
verbose_name="Пользователь",
|
||
),
|
||
),
|
||
],
|
||
options={
|
||
"verbose_name": "Настройки уведомлений",
|
||
"verbose_name_plural": "Настройки уведомлений",
|
||
"db_table": "notification_preferences",
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name="Notification",
|
||
fields=[
|
||
(
|
||
"id",
|
||
models.BigAutoField(
|
||
auto_created=True,
|
||
primary_key=True,
|
||
serialize=False,
|
||
verbose_name="ID",
|
||
),
|
||
),
|
||
(
|
||
"notification_type",
|
||
models.CharField(
|
||
choices=[
|
||
("lesson_created", "Создано занятие"),
|
||
("lesson_updated", "Занятие обновлено"),
|
||
("lesson_cancelled", "Занятие отменено"),
|
||
("lesson_rescheduled", "Занятие перенесено"),
|
||
("lesson_reminder", "Напоминание о занятии"),
|
||
("lesson_started", "Занятие началось"),
|
||
("lesson_completed", "Занятие завершено"),
|
||
("homework_assigned", "Назначено домашнее задание"),
|
||
("homework_submitted", "ДЗ сдано"),
|
||
("homework_reviewed", "ДЗ проверено"),
|
||
("material_added", "Добавлен материал"),
|
||
("message_received", "Новое сообщение"),
|
||
("subscription_expiring", "Подписка истекает"),
|
||
("subscription_expired", "Подписка истекла"),
|
||
("payment_received", "Платеж получен"),
|
||
("system", "Системное уведомление"),
|
||
],
|
||
db_index=True,
|
||
max_length=50,
|
||
verbose_name="Тип уведомления",
|
||
),
|
||
),
|
||
(
|
||
"channel",
|
||
models.CharField(
|
||
choices=[
|
||
("in_app", "Внутри приложения"),
|
||
("email", "Email"),
|
||
("telegram", "Telegram"),
|
||
],
|
||
default="in_app",
|
||
max_length=20,
|
||
verbose_name="Канал отправки",
|
||
),
|
||
),
|
||
(
|
||
"priority",
|
||
models.CharField(
|
||
choices=[
|
||
("low", "Низкий"),
|
||
("normal", "Обычный"),
|
||
("high", "Высокий"),
|
||
("urgent", "Срочный"),
|
||
],
|
||
default="normal",
|
||
max_length=20,
|
||
verbose_name="Приоритет",
|
||
),
|
||
),
|
||
("title", models.CharField(max_length=200, verbose_name="Заголовок")),
|
||
("message", models.TextField(verbose_name="Сообщение")),
|
||
(
|
||
"data",
|
||
models.JSONField(
|
||
blank=True,
|
||
default=dict,
|
||
help_text="Дополнительная информация в формате JSON",
|
||
verbose_name="Дополнительные данные",
|
||
),
|
||
),
|
||
(
|
||
"object_id",
|
||
models.PositiveIntegerField(
|
||
blank=True, null=True, verbose_name="ID объекта"
|
||
),
|
||
),
|
||
(
|
||
"action_url",
|
||
models.CharField(
|
||
blank=True,
|
||
help_text="URL для перехода при клике на уведомление",
|
||
max_length=500,
|
||
verbose_name="Ссылка для действия",
|
||
),
|
||
),
|
||
(
|
||
"is_read",
|
||
models.BooleanField(
|
||
db_index=True, default=False, verbose_name="Прочитано"
|
||
),
|
||
),
|
||
(
|
||
"read_at",
|
||
models.DateTimeField(
|
||
blank=True, null=True, verbose_name="Время прочтения"
|
||
),
|
||
),
|
||
(
|
||
"is_sent",
|
||
models.BooleanField(default=False, verbose_name="Отправлено"),
|
||
),
|
||
(
|
||
"sent_at",
|
||
models.DateTimeField(
|
||
blank=True, null=True, verbose_name="Время отправки"
|
||
),
|
||
),
|
||
(
|
||
"send_error",
|
||
models.TextField(blank=True, verbose_name="Ошибка отправки"),
|
||
),
|
||
(
|
||
"created_at",
|
||
models.DateTimeField(
|
||
auto_now_add=True, db_index=True, verbose_name="Дата создания"
|
||
),
|
||
),
|
||
(
|
||
"scheduled_for",
|
||
models.DateTimeField(
|
||
blank=True,
|
||
help_text="Время когда нужно отправить уведомление",
|
||
null=True,
|
||
verbose_name="Запланировано на",
|
||
),
|
||
),
|
||
(
|
||
"expires_at",
|
||
models.DateTimeField(
|
||
blank=True,
|
||
help_text="После этого времени уведомление неактуально",
|
||
null=True,
|
||
verbose_name="Истекает",
|
||
),
|
||
),
|
||
(
|
||
"content_type",
|
||
models.ForeignKey(
|
||
blank=True,
|
||
null=True,
|
||
on_delete=django.db.models.deletion.CASCADE,
|
||
to="contenttypes.contenttype",
|
||
verbose_name="Тип объекта",
|
||
),
|
||
),
|
||
(
|
||
"recipient",
|
||
models.ForeignKey(
|
||
on_delete=django.db.models.deletion.CASCADE,
|
||
related_name="notifications",
|
||
to=settings.AUTH_USER_MODEL,
|
||
verbose_name="Получатель",
|
||
),
|
||
),
|
||
],
|
||
options={
|
||
"verbose_name": "Уведомление",
|
||
"verbose_name_plural": "Уведомления",
|
||
"db_table": "notifications",
|
||
"ordering": ["-created_at"],
|
||
"indexes": [
|
||
models.Index(
|
||
fields=["recipient", "-created_at"],
|
||
name="notificatio_recipie_2d3764_idx",
|
||
),
|
||
models.Index(
|
||
fields=["recipient", "is_read"],
|
||
name="notificatio_recipie_583549_idx",
|
||
),
|
||
models.Index(
|
||
fields=["notification_type", "created_at"],
|
||
name="notificatio_notific_4b40ec_idx",
|
||
),
|
||
models.Index(
|
||
fields=["is_sent", "scheduled_for"],
|
||
name="notificatio_is_sent_3b099f_idx",
|
||
),
|
||
],
|
||
},
|
||
),
|
||
]
|