docs: 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')