uchill/backend/apps/notifications/migrations/0001_initial.py

367 lines
15 KiB
Python
Raw Permalink 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.

# 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",
),
],
},
),
]