# Generated by Django 5.2.4 on 2025-11-20 12:57 import django.db.models.deletion from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ('contenttypes', '0002_remove_content_type_name'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='NotificationCategory', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('code', models.CharField(choices=[('communications', 'Коммуникации'), ('documents', 'Документы'), ('requests', 'Заявления'), ('calendar', 'Календарь'), ('department', 'Отдел'), ('profile', 'Профиль'), ('feed', 'Новости'), ('system', 'Система')], max_length=50, unique=True, verbose_name='Код')), ('name', models.CharField(max_length=100, verbose_name='Название')), ('description', models.TextField(blank=True, verbose_name='Описание')), ('icon', models.CharField(default='bi-bell', help_text='Bootstrap icon класс', max_length=50, verbose_name='Иконка')), ('color', models.CharField(default='primary', help_text='Bootstrap цвет', max_length=20, verbose_name='Цвет')), ('is_active', models.BooleanField(default=True, verbose_name='Активна')), ('order', models.IntegerField(default=0, verbose_name='Порядок')), ], options={ 'verbose_name': 'Категория уведомлений', 'verbose_name_plural': 'Категории уведомлений', 'db_table': 'notifications_category', 'ordering': ['order', 'name'], }, ), migrations.CreateModel( name='NotificationType', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('code', models.CharField(help_text='Уникальный код типа, например: chat_new_message', max_length=100, unique=True, verbose_name='Код')), ('name', models.CharField(max_length=200, verbose_name='Название')), ('description', models.TextField(blank=True, verbose_name='Описание')), ('default_enabled', models.BooleanField(default=True, verbose_name='Включено по умолчанию')), ('default_channels', models.JSONField(default=dict, help_text='{"web": true, "email": false, "telegram": false}', verbose_name='Каналы по умолчанию')), ('priority', models.CharField(choices=[('low', 'Низкий'), ('normal', 'Обычный'), ('high', 'Высокий'), ('urgent', 'Срочный')], default='normal', max_length=20, verbose_name='Приоритет')), ('is_required', models.BooleanField(default=False, help_text='Нельзя отключить (например, системные уведомления)', verbose_name='Обязательное')), ('is_groupable', models.BooleanField(default=True, help_text='Объединять несколько похожих уведомлений', verbose_name='Можно группировать')), ('grouping_window_minutes', models.IntegerField(default=5, help_text='Группировать уведомления за последние N минут', 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='Обновлен')), ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='types', to='notifications.notificationcategory', verbose_name='Категория')), ], options={ 'verbose_name': 'Тип уведомления', 'verbose_name_plural': 'Типы уведомлений', 'db_table': 'notifications_type', 'ordering': ['category__order', 'name'], }, ), migrations.CreateModel( name='NotificationTemplate', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('channel', models.CharField(choices=[('web', 'Веб'), ('email', 'Email'), ('telegram', 'Telegram'), ('whatsapp', 'WhatsApp'), ('wechat', 'WeChat')], max_length=20, verbose_name='Канал')), ('title_template', models.TextField(help_text='Django template синтаксис', verbose_name='Шаблон заголовка')), ('message_template', models.TextField(help_text='Django template синтаксис', verbose_name='Шаблон сообщения')), ('html_template', models.TextField(blank=True, help_text='Для email', verbose_name='HTML шаблон')), ('action_button_template', models.CharField(blank=True, max_length=200, 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='Обновлен')), ('notification_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='templates', to='notifications.notificationtype', verbose_name='Тип уведомления')), ], options={ 'verbose_name': 'Шаблон уведомления', 'verbose_name_plural': 'Шаблоны уведомлений', 'db_table': 'notifications_template', 'unique_together': {('notification_type', 'channel')}, }, ), migrations.CreateModel( name='Notification', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=255, verbose_name='Заголовок')), ('message', models.TextField(verbose_name='Сообщение')), ('short_message', models.CharField(blank=True, help_text='Для превью', max_length=150, verbose_name='Краткое сообщение')), ('object_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='ID объекта')), ('metadata', models.JSONField(blank=True, default=dict, help_text='Дополнительные данные для рендеринга', verbose_name='Метаданные')), ('action_url', models.CharField(blank=True, max_length=500, verbose_name='Ссылка действия')), ('action_text', models.CharField(default='Посмотреть', max_length=100, verbose_name='Текст кнопки')), ('is_read', models.BooleanField(db_index=True, default=False, verbose_name='Прочитано')), ('read_at', models.DateTimeField(blank=True, null=True, verbose_name='Прочитано когда')), ('is_archived', models.BooleanField(default=False, verbose_name='В архиве')), ('archived_at', models.DateTimeField(blank=True, null=True, verbose_name='Заархивировано когда')), ('sent_web', models.BooleanField(default=False, verbose_name='Отправлено на сайт')), ('sent_email', models.BooleanField(default=False, verbose_name='Отправлено на email')), ('sent_telegram', models.BooleanField(default=False, verbose_name='Отправлено в Telegram')), ('sent_whatsapp', models.BooleanField(default=False, verbose_name='Отправлено в WhatsApp')), ('sent_wechat', models.BooleanField(default=False, verbose_name='Отправлено в WeChat')), ('sent_at', models.DateTimeField(blank=True, null=True, verbose_name='Отправлено когда')), ('group_key', models.CharField(blank=True, db_index=True, help_text='Для объединения похожих уведомлений', max_length=255, verbose_name='Ключ группировки')), ('is_grouped', models.BooleanField(default=False, verbose_name='Сгруппировано')), ('grouped_count', models.IntegerField(default=1, help_text='Сколько уведомлений объединено', verbose_name='Количество в группе')), ('created_at', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Создано')), ('updated_at', models.DateTimeField(auto_now=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='Получатель')), ('notification_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='notifications.notificationtype', verbose_name='Тип')), ], options={ 'verbose_name': 'Уведомление', 'verbose_name_plural': 'Уведомления', 'db_table': 'notifications_notification', 'ordering': ['-created_at'], 'indexes': [models.Index(fields=['recipient', '-created_at'], name='notificatio_recipie_a972ce_idx'), models.Index(fields=['recipient', 'is_read'], name='notificatio_recipie_4e3567_idx'), models.Index(fields=['notification_type', '-created_at'], name='notificatio_notific_c4ec61_idx'), models.Index(fields=['group_key', '-created_at'], name='notificatio_group_k_c495c5_idx')], }, ), migrations.CreateModel( name='UserNotificationSettings', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('is_enabled', models.BooleanField(default=True, verbose_name='Включено')), ('send_web', models.BooleanField(default=True, verbose_name='Отправлять на сайт')), ('send_email', models.BooleanField(default=False, verbose_name='Отправлять на email')), ('send_telegram', models.BooleanField(default=False, verbose_name='Отправлять в Telegram')), ('send_whatsapp', models.BooleanField(default=False, verbose_name='Отправлять в WhatsApp')), ('send_wechat', models.BooleanField(default=False, verbose_name='Отправлять в WeChat')), ('quiet_hours_enabled', models.BooleanField(default=False, verbose_name='Тихий режим включен')), ('quiet_start_time', models.TimeField(blank=True, help_text='Например, 22:00', null=True, verbose_name='Начало тихого режима')), ('quiet_end_time', models.TimeField(blank=True, help_text='Например, 08:00', null=True, verbose_name='Конец тихого режима')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Создано')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Обновлено')), ('notification_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='notifications.notificationtype', verbose_name='Тип уведомления')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notification_settings', to=settings.AUTH_USER_MODEL, verbose_name='Пользователь')), ], options={ 'verbose_name': 'Настройка уведомлений пользователя', 'verbose_name_plural': 'Настройки уведомлений пользователей', 'db_table': 'notifications_user_settings', 'unique_together': {('user', 'notification_type')}, }, ), ]