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