2026-09-07 19:43:48 +03:00

305 lines
12 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 5.2.4 on 2026-03-10 05:02
import django.db.models.deletion
import django.utils.timezone
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
("contenttypes", "0002_remove_content_type_name"),
("notifications", "0010_drop_old_tables"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="UserChannelPreferences",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"web_enabled",
models.BooleanField(
default=True,
help_text="Показывать в интерфейсе сайта",
verbose_name="Веб уведомления",
),
),
(
"email_enabled",
models.BooleanField(
default=False, verbose_name="Email уведомления"
),
),
(
"push_enabled",
models.BooleanField(
default=False,
help_text="Web Push для браузера",
verbose_name="Push уведомления",
),
),
(
"email_frequency",
models.CharField(
choices=[
("instant", "Мгновенно"),
("daily", "Ежедневный дайджест"),
("weekly", "Еженедельный дайджест"),
("never", "Никогда"),
],
default="instant",
max_length=20,
verbose_name="Частота email",
),
),
(
"dnd_enabled",
models.BooleanField(
default=False,
help_text="Отключить все уведомления в определенное время",
verbose_name='Режим "Не беспокоить"',
),
),
(
"dnd_start_time",
models.TimeField(
blank=True,
help_text="Например, 22:00",
null=True,
verbose_name="Начало тихого режима",
),
),
(
"dnd_end_time",
models.TimeField(
blank=True,
help_text="Например, 08:00",
null=True,
verbose_name="Конец тихого режима",
),
),
(
"disabled_verbs",
models.JSONField(
blank=True,
default=list,
help_text='Список verb для которых не показывать уведомления. Например: ["liked", "followed"]',
verbose_name="Отключенные типы",
),
),
(
"user",
models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
related_name="channel_preferences",
to=settings.AUTH_USER_MODEL,
verbose_name="Пользователь",
),
),
],
options={
"verbose_name": "Настройки каналов пользователя",
"verbose_name_plural": "Настройки каналов пользователей",
"db_table": "notifications_userchannelpreferences",
},
),
migrations.CreateModel(
name="Notification",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"actor_object_id",
models.CharField(
blank=True, max_length=255, null=True, verbose_name="ID актора"
),
),
(
"verb",
models.CharField(
db_index=True,
default="notification",
help_text="Например: liked, commented, approved, mentioned",
max_length=255,
verbose_name="Действие",
),
),
(
"action_object_object_id",
models.CharField(
blank=True,
max_length=255,
null=True,
verbose_name="ID объекта действия",
),
),
(
"target_object_id",
models.CharField(
blank=True,
max_length=255,
null=True,
verbose_name="ID целевого объекта",
),
),
(
"description",
models.TextField(
blank=True,
help_text="Человекочитаемое описание уведомления",
null=True,
verbose_name="Описание",
),
),
(
"action_url",
models.CharField(
blank=True,
help_text="Куда перейти при клике на уведомление",
max_length=500,
null=True,
verbose_name="URL действия",
),
),
(
"data",
models.JSONField(
blank=True,
default=dict,
help_text="Любые метаданные для рендеринга или логики",
verbose_name="Дополнительные данные",
),
),
(
"unread",
models.BooleanField(
db_index=True, default=True, verbose_name="Непрочитано"
),
),
(
"timestamp_read",
models.DateTimeField(
blank=True, null=True, verbose_name="Время прочтения"
),
),
(
"public",
models.BooleanField(
db_index=True,
default=True,
help_text="Можно показывать другим пользователям",
verbose_name="Публичное",
),
),
(
"deleted",
models.BooleanField(
db_index=True,
default=False,
help_text="Мягкое удаление",
verbose_name="Удалено",
),
),
(
"emailed",
models.BooleanField(
db_index=True, default=False, verbose_name="Отправлено на email"
),
),
(
"timestamp",
models.DateTimeField(
db_index=True,
default=django.utils.timezone.now,
verbose_name="Создано",
),
),
(
"action_object_content_type",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="notify_action_object",
to="contenttypes.contenttype",
verbose_name="Тип объекта действия",
),
),
(
"actor_content_type",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="notify_actor",
to="contenttypes.contenttype",
verbose_name="Тип актора",
),
),
(
"recipient",
models.ForeignKey(
help_text="Кому адресовано уведомление",
on_delete=django.db.models.deletion.CASCADE,
related_name="notifications",
to=settings.AUTH_USER_MODEL,
verbose_name="Получатель",
),
),
(
"target_content_type",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="notify_target",
to="contenttypes.contenttype",
verbose_name="Тип целевого объекта",
),
),
],
options={
"verbose_name": "Уведомление",
"verbose_name_plural": "Уведомления",
"db_table": "notifications_notification_v2",
"ordering": ["-timestamp"],
"indexes": [
models.Index(
fields=["recipient", "-timestamp"],
name="notificatio_recipie_91dc91_idx",
),
models.Index(
fields=["recipient", "unread", "-timestamp"],
name="notificatio_recipie_9b2135_idx",
),
models.Index(
fields=["verb", "-timestamp"],
name="notificatio_verb_1060e9_idx",
),
models.Index(
fields=["-timestamp"], name="notificatio_timesta_e0a5cf_idx"
),
],
},
),
]