Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.idea/workspace.xml
etc/

# Swap
Expand Down
498 changes: 498 additions & 0 deletions .idea/workspace.xml

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@

# check for any obvious issues
python manage.py check

# set group permissions (add and change for ALL apps)
python manage.py set_group_permissions --group-name='foo'

# set group permissions (add and change for specified apps)
python manage.py set_group_permissions --group-name='foo' --app-list='foo,bar,foobar'


### Production setup
Expand Down
Empty file added ambition/management/__init__.py
Empty file.
Empty file.
34 changes: 34 additions & 0 deletions ambition/management/commands/set_group_permissions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import os

from django.apps import apps as django_apps
from django.core.management.base import BaseCommand, CommandError
from django.apps import apps
from ...permissions import Permissions
from django.conf import settings


class Command(BaseCommand):

help = 'Set permissions for group'

def add_arguments(self, parser):
parser.add_argument(
'--group-name',
dest='group_name',
default=None,
help=('group name in which you want to set app permissions',
'for'),
)

parser.add_argument(
'--app-list',
dest='list_of_apps',
default=None,
help=('group name in which you want to set app permissions',
'for'),
)

def handle(self, *args, **options):
app_list = options['list_of_apps'].split(',') if options['list_of_apps'] else None
group_name = options['group_name']
Permissions(group_name, app_list)
51 changes: 51 additions & 0 deletions ambition/permissions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
from django.db.models import Q
from django.apps import apps
from django.contrib.auth.models import Group, Permission


class PermissionsInvalidAppError(Exception):
pass


class Permissions:

def __init__(self, group_name=None, list_of_apps=None):
new_group, created = Group.objects.get_or_create(name=group_name)

""" Provided a list of apps is given """
if list_of_apps:
for app in list_of_apps:
self.add_permissions_for_app(group_name=new_group, app=app)
else:
self.add_for_all_apps(group_name=new_group)

def add_permissions_for_app(self, group_name=None, app=None):
"""Given a group name and a specific app,
input add & change permissions for the app."""

try:
app_models = apps.get_app_config(app).get_models()

except LookupError:
raise LookupError(f'Got invalid app name {app}')

else:
for model in app_models:
permissions = Permission.objects.filter(
Q(codename__contains=model._meta.model_name),
Q(codename__startswith='add_') |
Q(codename__startswith='change_'))
for permission in permissions:
group_name.permissions.add(permission)
group_name.save()


def add_for_all_apps(self, group_name=None):
"""Get list of ALL app permissions with add and change.
Will be called if list of apps is not specified"""
permissions = Permission.objects.filter(
Q(codename__startswith='add_') |
Q(codename__startswith='change_'))
for permission in permissions:
group_name.permissions.add(permission)
group_name.save()