1# -*- coding: utf-8 -*- 2import warnings 3import functools 4 5from django.conf import settings 6from django.db import models, migrations 7 8 9def _get_manager(model, db_alias): 10 return model.objects.db_manager(db_alias) 11 12 13def forwards(apps, schema_editor): 14 db_alias = schema_editor.connection.alias 15 16 get_manager = functools.partial(_get_manager, db_alias=db_alias) 17 18 ContentType = apps.get_model('contenttypes', 'ContentType') 19 Permission = apps.get_model('auth', 'Permission') 20 Group = apps.get_model('auth', 'Group') 21 user_model = apps.get_model(settings.AUTH_USER_MODEL) 22 ph_model = apps.get_model('cms', 'Placeholder') 23 page_model = apps.get_model('cms', 'Page') 24 25 try: 26 ph_ctype = get_manager(ContentType).get_for_model(ph_model) 27 page_ctype = get_manager(ContentType).get_for_model(page_model) 28 permission, __ = get_manager(Permission).get_or_create( 29 codename='use_structure', content_type=ph_ctype, name=u"Can use Structure mode") 30 page_permission, __ = get_manager(Permission).get_or_create( 31 codename='change_page', content_type=page_ctype, name=u'Can change page' 32 ) 33 for user in get_manager(user_model).filter(is_superuser=False, is_staff=True): 34 if user.user_permissions.filter(codename='change_page', content_type_id=page_ctype.pk).exists(): 35 user.user_permissions.add(permission.pk) 36 for group in get_manager(Group).all(): 37 if page_permission in group.permissions.all(): 38 group.permissions.add(permission.pk) 39 except Exception: 40 warnings.warn(u'Users not migrated to use_structure permission, please add the permission manually') 41 42 43def backwards(apps, schema_editor): 44 db_alias = schema_editor.connection.alias 45 46 get_manager = functools.partial(_get_manager, db_alias=db_alias) 47 48 ContentType = apps.get_model('contenttypes', 'ContentType') 49 Permission = apps.get_model('auth', 'Permission') 50 Group = apps.get_model('auth', 'Group') 51 user_model = apps.get_model(settings.AUTH_USER_MODEL) 52 ph_model = apps.get_model('cms', 'Placeholder') 53 ph_ctype = get_manager(ContentType).get( 54 app_label=ph_model._meta.app_label, 55 model=ph_model._meta.model_name, 56 ) 57 58 try: 59 permission, __ = get_manager(Permission).get_or_create( 60 codename='use_structure', content_type=ph_ctype, name=u"Can use Structure mode") 61 for user in get_manager(user_model).filter(is_superuser=False, is_staff=True): 62 user.user_permissions.remove(permission.pk) 63 for group in get_manager(Group).all(): 64 if permission in group.permissions.all(): 65 group.permissions.remove(permission.pk) 66 except Exception: 67 warnings.warn(u'use_structure not removed from all the users, please check the permission manually') 68 69 70class Migration(migrations.Migration): 71 72 dependencies = [ 73 ('cms', '0009_merge'), 74 ('contenttypes', '0001_initial'), 75 ] 76 77 operations = [ 78 migrations.AlterModelOptions( 79 name='placeholder', 80 options={'permissions': (('use_structure', 'Can use Structure mode'),)}, 81 ), 82 migrations.RunPython(forwards, backwards) 83 ] 84