Files
ACORE/apps/projects/migrations/0001_initial.py
T
lokses 030bbc98fd projects: модуль проектов с шагами по отделам и Task.
Шаблоны/ручное создание, access_projects, сид «Открытие аптеки». Плюс SILO/S3 для Django media.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-23 16:26:45 +03:00

147 lines
9.9 KiB
Python
Raw 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 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'),
),
]