-
Notifications
You must be signed in to change notification settings - Fork 1
/
djangocms_misc_add_cms_group.py
114 lines (106 loc) · 4.14 KB
/
djangocms_misc_add_cms_group.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import logging
import os
import shutil
from django.contrib.auth.models import Group, Permission
from django.core.management.base import BaseCommand
from django.db.models import Q
class Command(BaseCommand):
"""
"""
help = (
"Add an auth.Group that gives basic CMS Permissions. User --plugin or --cms to add additional perms."
"")
def add_arguments(self, parser):
parser.add_argument(
'--cms-base',
required=False,
action='store_const',
const=True,
default=False,
help="Basic CMS permissions (edit and publish pages, etc).")
parser.add_argument(
'--cms-publish',
required=False,
action='store_const',
const=True,
default=False,
help="adds exactly 'can publish page' permission)."
"")
parser.add_argument(
'--cms-superuser',
required=False,
action='store_const',
const=True,
default=False,
help="Superuser CMS permissions (add own users, page permissions, etc, etc)."
"")
parser.add_argument(
'--plugin',
required=False,
action='store_const',
const=True,
default=False,
help="""
Searches for permissions with 'plugin' in their content type's app_label (ex.: cmsplugin_googlemaps), adds to group.""")
parser.add_argument(
'--cms',
action='store_const',
const=True,
default=False,
required=False,
help="""
Searches for permissions with 'cms' in their content type's app_label (ex.:djangocms_text_ckeditor), adds to group.""")
parser.add_argument(
'--name',
required=False,
default='cms_base',
help="""
Name of group. Defaults to cms_base.""")
parser.add_argument(
'--force',
action='store_const',
const=True,
required=False,
help="""
Force overwrite of existing group and it's permissions.""")
def handle(self, *args, **options):
group_name = options.get('name')
# copy
groups = Group.objects.filter(name=group_name)
if groups.count():
if not options.get('force', None):
exit("use --force to overwrite existing groups!")
if groups.count() > 1:
exit("more than one group with name that name ({}) found! exiting.".format(group_name))
group = groups.first()
else:
group = Group.objects.create(name=group_name)
group.permissions.clear()
if options.get('cms_base'):
q_filter = Q(content_type__app_label='cms')
q_exclude = Q(name__icontains='user')
q_exclude |= Q(name__icontains='permission')
q_exclude |= Q(name__icontains='publish')
self.add_permission(group, q_filter, q_exclude)
if options.get('cms_publish'):
q_filter = Q(content_type__app_label='cms')
q_filter &= Q(name__icontains='publish')
self.add_permission(group, q_filter)
if options.get('cms_superuser'):
q_filter = Q(content_type__app_label='cms')
self.add_permission(group, q_filter)
if options.get('cms'):
q_filter = Q(content_type__app_label__icontains='cms')
q_exclude = Q(content_type__app_label='cms')
self.add_permission(group, q_filter, q_exclude)
if options.get('plugin'):
q_filter = Q(content_type__app_label__icontains='plugin')
q_exclude = Q(content_type__app_label='cms')
self.add_permission(group, q_filter, q_exclude)
print(logging.INFO, 'Group created! ({})'.format(group_name))
print(logging.INFO, 'Following permissions were granted:')
for perm in group.permissions.all():
print(logging.INFO, '{}'.format(perm))
def add_permission(self, group, q_filter=Q(), q_exclude=Q()):
perms = Permission.objects.filter(q_filter).exclude(q_exclude)
group.permissions.add(*perms)