# Generated by Django 3.0.8 on 2020-07-30 00:27
from typing import Dict, List
from sys import stderr
from django.apps import apps
from django.db import migrations
GROUPS_AND_PERMISSIONS: Dict[str, Dict[str, Dict[str, List[str]]]] = {
'Volunteer': {
'fpiweb': {
'box': [
'add_box',
'check_in_box',
'check_out_box',
'move_box',
'view_box'
],
'pallet': [
'build_pallet',
'move_pallet',
'view_pallet',
],
},
},
'Staff': {
'fpiweb': {
'activity': [
'view_activity',
],
'box': [
'print_labels_box',
],
'constraints': [
'add_constraints',
'change_constraints',
'delete_constraints',
'view_constraints',
],
'locbin': [
'add_locbin',
'change_locbin',
'delete_locbin',
'view_locbin',
],
'locrow': [
'add_locrow',
'change_locrow',
'delete_locrow',
'view_locrow',
],
'loctier': [
'add_loctier',
'change_loctier',
'delete_loctier',
'view_loctier',
], 'profile': [
'view_system_maintenance',
],
},
},
'Admin': {
'fpiweb': {
'profile': [
'view_system_maintenance',
],
}
}
}
[docs]def iterate_permissions(permissions):
"""
Generator to pick up the needed foreign keys for a given permission.
:param permissions: attributes associated with this permission
:return:
"""
for app_label, models in permissions.items():
for model, model_permissions in models.items():
for permission in model_permissions:
yield app_label, model, permission
[docs]def setup_group_permissions(group, permissions):
"""
For a given group, create or replace the permissions for it.
:param group: group to be created or replaced
:param permissions: list of permissions to be applied to this group
:return:
"""
# Establish the correct historical models for the auth tables.
Group = apps.get_model('auth', 'Group')
Permission = apps.get_model('auth', 'Permission')
print(f"Clearing {group.name} permissions.")
group.permissions.clear()
for app_label, model, codename in iterate_permissions(permissions):
try:
permission = Permission.objects.get(
content_type__app_label=app_label, content_type__model=model,
codename=codename)
except Permission.DoesNotExist:
print(f"Permission {model} {codename} not found", file=stderr)
continue
print(f"Granting {model} {codename} to {group.name}")
group.permissions.add(permission)
[docs]def setup_groups_and_permissions(*args, **kwargs):
"""
Create or replace groups and add permissions.
:param groups_and_permissions: table of groups and associated permissions
:return:
"""
# Establish the correct historical models for the auth tables.
Group = apps.get_model('auth', 'Group')
Permission = apps.get_model('auth', 'Permission')
# Establish data needed by this function
groups_and_permissions = GROUPS_AND_PERMISSIONS
for group_name, permissions in groups_and_permissions.items():
group, created = Group.objects.get_or_create(name=group_name)
if created:
print(f"Created {group_name} group.")
else:
print(f"Found {group_name} group.")
setup_group_permissions(group, permissions)
print()
[docs]class Migration(migrations.Migration):
dependencies = [
('fpiweb', '0029_add_model_permissions'),
('auth', '0012_alter_user_first_name_max_length'),
]
operations = [
migrations.RunPython(setup_groups_and_permissions)
]