Corp/backend/tasks/migrations/0038_taskboardgroupmembership.py

140 lines
4.6 KiB
Python

from datetime import timedelta
import django.db.models.deletion
import django.utils.timezone
from django.db import migrations, models
def copy_group_boards_to_memberships(apps, schema_editor):
group_model = apps.get_model("tasks", "TaskBoardGroup")
membership_model = apps.get_model("tasks", "TaskBoardGroupMembership")
old_through = group_model.boards.through
base_time = django.utils.timezone.now()
positions = {}
memberships = []
for link in old_through.objects.order_by(
"taskboardgroup_id",
"id",
).iterator():
group_id = link.taskboardgroup_id
positions[group_id] = positions.get(group_id, 0) + 1
memberships.append(
membership_model(
group_id=group_id,
board_id=link.taskboard_id,
position=positions[group_id],
added_at=base_time + timedelta(microseconds=link.id),
)
)
membership_model.objects.bulk_create(memberships)
def restore_implicit_group_boards(apps, schema_editor):
group_model = apps.get_model("tasks", "TaskBoardGroup")
membership_model = apps.get_model("tasks", "TaskBoardGroupMembership")
old_through = group_model.boards.through
old_through.objects.bulk_create(
[
old_through(
taskboardgroup_id=membership.group_id,
taskboard_id=membership.board_id,
)
for membership in membership_model.objects.order_by(
"group_id",
"position",
"id",
).iterator()
],
ignore_conflicts=True,
)
class Migration(migrations.Migration):
dependencies = [
("tasks", "0037_shared_task_board_groups"),
]
operations = [
migrations.CreateModel(
name="TaskBoardGroupMembership",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("position", models.PositiveIntegerField(verbose_name="Позиция")),
(
"added_at",
models.DateTimeField(
default=django.utils.timezone.now,
verbose_name="Добавлено",
),
),
(
"board",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="group_memberships",
to="tasks.taskboard",
verbose_name="Доска",
),
),
(
"group",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="board_memberships",
to="tasks.taskboardgroup",
verbose_name="Группа",
),
),
],
options={
"verbose_name": "Доска в группе",
"verbose_name_plural": "Доски в группах",
"ordering": ["group_id", "position", "id"],
"constraints": [
models.UniqueConstraint(
fields=("group", "board"),
name="uniq_task_board_group_membership",
),
models.UniqueConstraint(
fields=("group", "position"),
name="uniq_task_board_group_position",
),
],
},
),
migrations.RunPython(
copy_group_boards_to_memberships,
restore_implicit_group_boards,
),
migrations.RemoveField(
model_name="taskboardgroup",
name="boards",
),
migrations.AddField(
model_name="taskboardgroup",
name="boards",
field=models.ManyToManyField(
blank=True,
related_name="board_groups",
through="tasks.TaskBoardGroupMembership",
to="tasks.taskboard",
verbose_name="Доски",
),
),
migrations.AlterField(
model_name="taskboardgroupmembership",
name="added_at",
field=models.DateTimeField(auto_now_add=True, verbose_name="Добавлено"),
),
]