Adding new permission to groups during migration from 2.1.1 to 2.2

This commit is contained in:
FinnStutzenstein 2018-03-08 16:52:05 +01:00
parent 3e3b62bc38
commit b081401d57
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