Source code for fpiweb.migrations.0030_AddPermissionData

# 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) ]