def update_permission(obj, data):
    """Update object permissions."""
    full_permissions = get_all_perms(obj)

    def apply_perm(perm_func, perms, entity):
        """Apply permissions using given ``perm_func``.

        ``perm_func`` is intended to be ``assign_perms`` or
        ``remove_perms`` shortcut function from ``django-guardian``, but
        can be any function that accepts permission codename,
        user/group and object parameters (in this order).

        If given permission does not exist, ``exceptions.ParseError`` is
        raised.

        "ALL" passed as ``perms`` parameter, will call ``perm_function``
        with ``full_permissions`` list.

        :param func perm_func: Permissions function to be applied
        :param list params: list of params to be allpied
        :param entity: user or group to be passed to ``perm_func``
        :type entity: `~django.contrib.auth.models.User` or
            `~django.contrib.auth.models.Group`

        """
        if perms == 'ALL':
            perms = full_permissions
        for perm in perms:
            perm_codename = get_full_perm(perm, obj)
            if perm_codename not in full_permissions:
                raise exceptions.ParseError("Unknown permission: {}".format(perm))
            perm_func(perm_codename, entity, obj)

    def set_permissions(entity_type, perm_type):
        """Set object permissions."""
        perm_func = assign_perm if perm_type == 'add' else remove_perm
        fetch_fn = fetch_user if entity_type == 'users' else fetch_group

        for entity_id in data.get(entity_type, {}).get(perm_type, []):
            entity = fetch_fn(entity_id)
            if entity:
                perms = data[entity_type][perm_type][entity_id]
                apply_perm(perm_func, perms, entity)

    def set_public_permissions(perm_type):
        """Set public permissions."""
        perm_func = assign_perm if perm_type == 'add' else remove_perm
        user = AnonymousUser()
        perms = data.get('public', {}).get(perm_type, [])
        apply_perm(perm_func, perms, user)

    with transaction.atomic():
        set_permissions('users', 'add')
        set_permissions('users', 'remove')
        set_permissions('groups', 'add')
        set_permissions('groups', 'remove')
        set_public_permissions('add')
        set_public_permissions('remove')
def update_permission ( obj , data ) : full_permissions = get_all_perms ( obj ) def apply_perm ( perm_func , perms , entity ) : if perms == 'ALL' : perms = full_permissions for perm in perms : perm_codename = get_full_perm ( perm , obj ) if perm_codename not in full_permissions : raise exceptions . ParseError ( "Unknown permission: {}" . format ( perm ) ) perm_func ( perm_codename , entity , obj ) def set_permissions ( entity_type , perm_type ) : perm_func = assign_perm if perm_type == 'add' else remove_perm fetch_fn = fetch_user if entity_type == 'users' else fetch_group for entity_id in data . get ( entity_type , { } ) . get ( perm_type , [ ] ) : entity = fetch_fn ( entity_id ) if entity : perms = data [ entity_type ] [ perm_type ] [ entity_id ] apply_perm ( perm_func , perms , entity ) def set_public_permissions ( perm_type ) : perm_func = assign_perm if perm_type == 'add' else remove_perm user = AnonymousUser ( ) perms = data . get ( 'public' , { } ) . get ( perm_type , [ ] ) apply_perm ( perm_func , perms , user ) with transaction . atomic ( ) : set_permissions ( 'users' , 'add' ) set_permissions ( 'users' , 'remove' ) set_permissions ( 'groups' , 'add' ) set_permissions ( 'groups' , 'remove' ) set_public_permissions ( 'add' ) set_public_permissions ( 'remove' )
Update object permissions.