Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add a permission to a user/group during a django migration?

I would like to execute the following migration:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib.auth.models import Permission
from django.db import migrations
from django.conf import settings
from django.contrib.auth.models import Group, User


def add_api_group(apps, schema_editor):

    Group.objects.create(name=settings.API_USER_GROUP)
    # get_or_create returns a tuple, not a Group
    group = Group.objects.get(name=settings.API_USER_GROUP)
    permissions = Permission.objects.filter(codename__in = [
        'add_topic',
    ])
    group.permissions.add(*permissions)


def add_api_user(apps, schema_editor):

    user = User.objects.create_user(username=settings.API_USER, password=settings.API_USER_PASSWORD)
    group = Group.objects.get(name=settings.API_USER_GROUP)
    user.groups.add(group)

class Migration(migrations.Migration):

    dependencies = [
        ('nd_content', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(add_api_group),
        migrations.RunPython(add_api_user)
    ]

At the last line of the migration, I issued an error to stop execution and look at the database state. The problem is the table auth_permission still has not the permissions of a model of another module, although this other module is registered as a dependecy of this migration.

I can confirm missing permissions seem to be added only after all migrations have been executed.

like image 565
Andras Gyomrey Avatar asked Aug 08 '16 06:08

Andras Gyomrey


2 Answers

AttributeError: 'StateApps' object has no attribute 'label' in Django 1.10

There is a solution:

for app_config in apps.get_app_configs():
    app_config.models_module = True
    create_permissions(app_config, verbosity=0)
    app_config.models_module = None
like image 69
Anton Lisenkov Avatar answered Sep 21 '22 14:09

Anton Lisenkov


EDIT 2018-01-31

This answer will only work until Django 1.9. For Django 1.10 an up, please refer to the answer provided by @anton-lisenkov

Original Answer (Django<1.10)

It turns out I could do the following:

from django.contrib.auth.management import create_permissions

def add_permissions(apps, schema_editor):
    apps.models_module = True

    create_permissions(apps, verbosity=0)
    apps.models_module = None

Thanks @elad-silver for his answer: https://stackoverflow.com/a/34272647/854868

like image 23
Andras Gyomrey Avatar answered Sep 22 '22 14:09

Andras Gyomrey