# Generated by Django 6.0.3 on 2026-10-23 13:23 import django.db.models.deletion import uuid from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ('core', '0026_access_projects_perm'), ('locations', '0016_ukrainian_phone_field'), ('tasks', '0006_taskattachment'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='ProjectTemplate', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('name', models.CharField(max_length=200, verbose_name='Название')), ('description', models.TextField(blank=True, verbose_name='Описание')), ('default_duration_days', models.PositiveIntegerField(default=90, verbose_name='Длительность по умолчанию (дни)')), ('is_active', models.BooleanField(default=True, verbose_name='Активен')), ], options={ 'verbose_name': 'Шаблон проекта', 'verbose_name_plural': 'Шаблоны проектов', 'ordering': ['name'], }, ), migrations.CreateModel( name='Project', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('title', models.CharField(max_length=250, verbose_name='Название')), ('description', models.TextField(blank=True, verbose_name='Описание')), ('status', models.CharField(choices=[('draft', 'Черновик'), ('active', 'Активен'), ('done', 'Завершён'), ('cancelled', 'Отменён')], db_index=True, default='draft', max_length=20, verbose_name='Статус')), ('start_date', models.DateField(blank=True, null=True, verbose_name='Дата старта')), ('due_date', models.DateField(blank=True, null=True, verbose_name='Срок')), ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_projects', to=settings.AUTH_USER_MODEL, verbose_name='Создал')), ('owner', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='owned_projects', to=settings.AUTH_USER_MODEL, verbose_name='Владелец')), ('pharmacy', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='projects', to='locations.pharmacy', verbose_name='Аптека')), ('template', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='projects', to='projects.projecttemplate', verbose_name='Шаблон')), ], options={ 'verbose_name': 'Проект', 'verbose_name_plural': 'Проекты', 'ordering': ['-created_at'], }, ), migrations.CreateModel( name='ProjectStep', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('title', models.CharField(max_length=250, verbose_name='Название')), ('order', models.PositiveSmallIntegerField(default=0, verbose_name='Порядок')), ('status', models.CharField(choices=[('pending', 'Ожидает'), ('in_progress', 'В работе'), ('done', 'Выполнен')], db_index=True, default='pending', max_length=20, verbose_name='Статус')), ('planned_start', models.DateField(blank=True, null=True, verbose_name='План. старт')), ('planned_due', models.DateField(blank=True, null=True, verbose_name='План. срок')), ('department', models.ForeignKey(blank=True, limit_choices_to={'directory_type__code': 'department'}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='project_steps', to='core.directory', verbose_name='Отдел')), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='steps', to='projects.project', verbose_name='Проект')), ], options={ 'verbose_name': 'Шаг проекта', 'verbose_name_plural': 'Шаги проекта', 'ordering': ['order', 'id'], }, ), migrations.CreateModel( name='ProjectStepItem', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('title', models.CharField(max_length=250, verbose_name='Название')), ('description', models.TextField(blank=True, verbose_name='Описание')), ('priority', models.CharField(default='medium', max_length=10, verbose_name='Приоритет')), ('order', models.PositiveSmallIntegerField(default=0, verbose_name='Порядок')), ('step', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='projects.projectstep', verbose_name='Шаг')), ('task', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='project_step_item', to='tasks.task', verbose_name='Задача')), ], options={ 'verbose_name': 'Пункт шага', 'verbose_name_plural': 'Пункты шага', 'ordering': ['order', 'id'], }, ), migrations.CreateModel( name='ProjectTemplateStep', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('title', models.CharField(max_length=250, verbose_name='Название шага')), ('order', models.PositiveSmallIntegerField(default=0, verbose_name='Порядок')), ('offset_days', models.PositiveIntegerField(default=0, help_text='Плановый старт шага = старт проекта + offset.', verbose_name='Смещение от старта (дни)')), ('duration_days', models.PositiveIntegerField(default=14, verbose_name='Длительность шага (дни)')), ('department', models.ForeignKey(blank=True, limit_choices_to={'directory_type__code': 'department'}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='project_template_steps', to='core.directory', verbose_name='Отдел')), ('template', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='steps', to='projects.projecttemplate', verbose_name='Шаблон')), ], options={ 'verbose_name': 'Шаг шаблона', 'verbose_name_plural': 'Шаги шаблона', 'ordering': ['order', 'id'], }, ), migrations.CreateModel( name='ProjectTemplateStepItem', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('title', models.CharField(max_length=250, verbose_name='Название задачи')), ('description', models.TextField(blank=True, verbose_name='Описание')), ('priority', models.CharField(choices=[('low', 'Низкий'), ('medium', 'Средний'), ('high', 'Высокий')], default='medium', max_length=10, verbose_name='Приоритет')), ('order', models.PositiveSmallIntegerField(default=0, verbose_name='Порядок')), ('step', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='projects.projecttemplatestep', verbose_name='Шаг')), ], options={ 'verbose_name': 'Пункт шага шаблона', 'verbose_name_plural': 'Пункты шага шаблона', 'ordering': ['order', 'id'], }, ), migrations.AddIndex( model_name='project', index=models.Index(fields=['status', '-created_at'], name='projects_pr_status_b6b628_idx'), ), ]