- Исправлена миграция 0010: добавлено удаление старых моделей из Django state - Добавлен default='notification' для поля verb в модели Notification - Создана чистая миграция 0011_initial с новыми моделями: * Notification (с GenericForeignKey) * UserChannelPreferences - Удалены автоматически сгенерированные некорректные миграции Fixes: KeyError при попытке удалить unique_together с несуществующими полями
71 lines
6.6 KiB
Python
71 lines
6.6 KiB
Python
# 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')],
|
||
},
|
||
),
|
||
]
|