Прочие изменения в модулях inventory и products

This commit is contained in:
2025-12-22 13:44:08 +03:00
parent c476eafd4a
commit 6eea53754a
8 changed files with 222 additions and 24 deletions

View File

@@ -0,0 +1,101 @@
# Generated manually - Change conducted_by from CharField to ForeignKey
from django.db import migrations, models
import django.db.models.deletion
def migrate_conducted_by_data(apps, schema_editor):
"""
Миграция данных: для существующих записей инвентаризации
найти первого пользователя с ролью "owner" (владелец) в текущем тенанте
и проставить его UserRole. Если владельца нет - оставить NULL.
"""
Inventory = apps.get_model('inventory', 'Inventory')
UserRole = apps.get_model('user_roles', 'UserRole')
Role = apps.get_model('user_roles', 'Role')
# Находим первого владельца в текущем тенанте
try:
owner_role = Role.objects.get(code='owner', is_system=True)
owner_user_role = UserRole.objects.filter(
role=owner_role,
is_active=True
).first()
if owner_user_role:
# Обновляем все существующие инвентаризации, у которых есть старое текстовое значение
# Используем conducted_by_old (переименованное поле) для проверки
Inventory.objects.exclude(conducted_by_old__isnull=True).exclude(conducted_by_old='').update(
conducted_by_new=owner_user_role
)
except Role.DoesNotExist:
# Если нет роли - оставляем NULL
pass
def reverse_migration(apps, schema_editor):
"""
Откат: очищаем новое поле
"""
Inventory = apps.get_model('inventory', 'Inventory')
Inventory.objects.filter(conducted_by_new__isnull=False).update(conducted_by_new=None)
class Migration(migrations.Migration):
dependencies = [
('inventory', '0016_add_document_number_to_inventory'),
('user_roles', '0001_initial'),
]
operations = [
# Шаг 1: Переименовываем старое поле в conducted_by_old
migrations.RenameField(
model_name='inventory',
old_name='conducted_by',
new_name='conducted_by_old',
),
# Шаг 2: Добавляем новое поле как ForeignKey
migrations.AddField(
model_name='inventory',
name='conducted_by_new',
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name='inventories_new',
to='user_roles.userrole',
verbose_name='Провел инвентаризацию'
),
),
# Шаг 3: Миграция данных
migrations.RunPython(
migrate_conducted_by_data,
reverse_code=reverse_migration
),
# Шаг 4: Удаляем старое поле
migrations.RemoveField(
model_name='inventory',
name='conducted_by_old',
),
# Шаг 5: Переименовываем новое поле в conducted_by
migrations.RenameField(
model_name='inventory',
old_name='conducted_by_new',
new_name='conducted_by',
),
# Шаг 6: Исправляем related_name
migrations.AlterField(
model_name='inventory',
name='conducted_by',
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name='inventories',
to='user_roles.userrole',
verbose_name='Провел инвентаризацию'
),
),
]