Вопрос про порядок исполнения нескольких миграций.
Задача: Мне нужно добавить кастомное право в модель, и добавить это право в две группы,
так чтобы это можно было оформить коммитом и соотв. задеплоить. Хотел сделать это миграциями.
определяю свое право в Мета классе модели:
...
class Meta:
permissions = (
('can_chpok_user', 'может чпокать юзеров'),
)
...
генерю миграцию(допустим имя у нее будет migration_А):
# -*- coding: utf-8 -*-
# Generated by Django 1.9.3 on 2020-01-17 12:00
from
future import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('core', '0010_auto_20200116_0055'),
]
operations = [
migrations.AlterModelOptions(
name='yesuser',
options={'permissions': (('can_chpok_user', 'может чпокать юзеров'),)},
),
]
дальше пишу такую миграцию(допустим ее имя migration_B):
...
from django.contrib.auth.models import Group, Permission
from django.db import migrations
...
def add_chpok_perm(apps, schema_editor):
can_chpok_user = Permission.objects.get(codename='can_chpok_user')
lookup_groups = Group.objects.filter(name__in=('Оператор Чпока', 'МегаЧпокер'))
for g in lookup_groups:
g.permissions.add(can_chpok_user)
class Migration(migrations.Migration):
atomic = True
dependencies = [
('core', 'migration_A'),
]
operations = [
migrations.RunPython(add_chpok_perm, reverse_code=migrations.RunPython.noop),
]
т.е. предполагая что сначала будет выполнена миграция А(потому что B зависит от А), в миграции B хочу найти уже созданную запись права и добавить ее в нужные группы.
Выполняется так: миграция А применяется, а вот в миграции B ошибка - не найдена соотв. запись Permission.
Пробовал это сделать с atomic=True, но результат такой же.
Пробовал в миграцию А добавить вторую операцию(по сути все то что есть в миграции B) - тот же эффект - запись в БД не создается.
Причем если выполнять только А, то все нормально. Право создается, все стандартно. Но мне нужно не только само право, но и назначение этого права нужным группам.
Юзеркейс то в этом и заключается...
=========================================================================================
В итоге пришлось писать совсем сыро - без class Metа,
а хотелось бы с ним - чтобы видеть в коде кастомные права модели,
...
from django.contrib.auth.models import Group, Permission
from django.db import migrations
...
def add_chpok_perm(apps, schema_editor):
chpok_desc = {
'content_type_id': 13,
'codename': 'chpok',
'name': 'может чпокать юзеров'
}
perm = Permission.objects.create(**chpok_desc)
perm.save()
lookup_groups = Group.objects.filter(name__in=('Оператор Чпока', 'МегаЧпокер'))
can_chpok_user = Permission.objects.get(codename='can_chpok_user')
for g in lookup_groups:
g.permissions.add(can_chpok_user)
class Migration(migrations.Migration):
atomic = True
dependencies = [
('core', 'chpok_migration'),
]
operations = [
migrations.RunPython(add_chpok_perm, reverse_code=migrations.RunPython.noop),
]