Merge pull request #3641 from FinnStutzenstein/add-perms-during-migrations

Adding new permission to groups during migration from 2.1.1 to 2.2
This commit is contained in:
Emanuel Schütze 2018-03-15 12:22:28 +01:00 committed by GitHub
commit 1ac3cb7552
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 48 additions and 0 deletions

View File

@ -4,6 +4,9 @@ from __future__ import unicode_literals
from django.db import migrations
from openslides.utils.migrations import \
add_permission_to_groups_based_on_existing_permission
class Migration(migrations.Migration):
@ -24,4 +27,7 @@ class Migration(migrations.Migration):
)
},
),
migrations.RunPython(add_permission_to_groups_based_on_existing_permission(
'can_manage', 'item', 'agenda', 'can_manage_list_of_speakers', 'Can manage list of speakers'
)),
]

View File

@ -4,6 +4,9 @@ from __future__ import unicode_literals
from django.db import migrations
from openslides.utils.migrations import \
add_permission_to_groups_based_on_existing_permission
class Migration(migrations.Migration):
@ -22,4 +25,7 @@ class Migration(migrations.Migration):
)
},
),
migrations.RunPython(add_permission_to_groups_based_on_existing_permission(
'can_manage_config', 'configstore', 'core', 'can_manage_logos', 'Can manage logos'
)),
]

View File

@ -0,0 +1,36 @@
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
def add_permission_to_groups_based_on_existing_permission(codename, model, app_label, new_codename, new_name):
"""
Creates the new permission given by new_codename and new_name to all groups,
that have the base permission. This base permission is given by codename, model
and app_label. The new permission will have the same content type as the base
permission. The migration just runs, if the base permission and content type do
exist, so this does not run for a fresh database.
"""
def function(apps, schema_editor):
content_type = ContentType.objects.filter(model=model, app_label=app_label)
base_perm = Permission.objects.filter(codename=codename, content_type=content_type)
if len(base_perm) is 1 and len(content_type) is 1:
# get the actual content type and base permission
base_perm = base_perm.get()
content_type = content_type.get()
# Save groups. list() is necessary to evaluate the database query right now.
groups = list(base_perm.group_set.all())
# Create new permission
perm = Permission.objects.create(
codename=new_codename,
name=new_name,
content_type=content_type)
# Add this permission to all groups
for group in groups:
group.permissions.add(perm)
group.save()
return function