Commit 6775dcc9 authored by Kristiaan Van den Eynde's avatar Kristiaan Van den Eynde
Browse files

Issue #3259144 by kristiaanvandeneynde: Add an isAdmin flag to GroupRole...

Issue #3259144 by kristiaanvandeneynde: Add an isAdmin flag to GroupRole entities and adjust code base
parent 85723257
Loading
Loading
Loading
Loading
+3 −0
Changes for config/schema/group.schema.yml: 3 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -63,6 +63,9 @@ group.role.*:
    weight:
      type: 'integer'
      label: 'Weight'
    admin:
      type: 'boolean'
      label: 'Group role is an admin role'
    internal:
      type: 'boolean'
      label: 'Group role is used internally'
+0 −5
Changes for group.group.permissions.yml: 0 added lines, 5 removed lines.
Original line number Diff line number Diff line
# @todo Remove god-mode permission in 8.2.0 release, use 'is_admin' flag on role instead.
administer group:
  title: 'Administer group'
  description: 'Administer the group, its content and members'
  restrict access: TRUE
view group:
  title: 'View published group'
view any unpublished group:
+18 −0
Changes for group.install: 18 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -84,3 +84,21 @@ function group_update_9202() {
    $role->save(TRUE);
  }
}

/**
 * Convert group roles with the 'administer group' permission to admin roles.
 */
function group_update_9203() {
  $config_factory = \Drupal::configFactory();
  foreach ($config_factory->listAll('group.role.') as $config_name) {
    $role = $config_factory->getEditable($config_name);
    if (in_array('administer group', $role->get('permissions'), TRUE)) {
      $role->set('permissions', []);
      $role->set('admin', TRUE);
    }
    else {
      $role->set('admin', FALSE);
    }
    $role->save(TRUE);
  }
}
+3 −8
Changes for src/Access/CalculatedGroupPermissionsItem.php: 3 added lines, 8 removed lines.
Original line number Diff line number Diff line
@@ -49,16 +49,11 @@ class CalculatedGroupPermissionsItem implements CalculatedGroupPermissionsItemIn
   * @param bool $is_admin
   *   (optional) Whether the item grants admin privileges.
   */
  public function __construct($scope, $identifier, $permissions, $is_admin = NULL) {
  public function __construct($scope, $identifier, $permissions, $is_admin = FALSE) {
    $this->scope = $scope;
    $this->identifier = $identifier;
    $this->permissions = array_unique($permissions);

    // @todo Rework for group 8.2.x to no longer use the admin permission.
    // @todo Do make flag default to FALSE and pass role's isAdmin flag instead.
    $this->isAdmin = isset($is_admin)
      ? $is_admin
      : in_array('administer group', $permissions, TRUE);
    $this->permissions = $is_admin ? [] : array_unique($permissions);
    $this->isAdmin = $is_admin;
  }

  /**
+8 −10
Changes for src/Access/DefaultGroupPermissionCalculator.php: 8 added lines, 10 removed lines.
Original line number Diff line number Diff line
@@ -65,7 +65,8 @@ class DefaultGroupPermissionCalculator extends GroupPermissionCalculatorBase {
      $item = new CalculatedGroupPermissionsItem(
        CalculatedGroupPermissionsItemInterface::SCOPE_GROUP_TYPE,
        $group_type_id,
        $group_role->getPermissions()
        $group_role->getPermissions(),
        $group_role->isAdmin()
      );

      $calculated_permissions->addItem($item);
@@ -95,7 +96,8 @@ class DefaultGroupPermissionCalculator extends GroupPermissionCalculatorBase {
      $item = new CalculatedGroupPermissionsItem(
        CalculatedGroupPermissionsItemInterface::SCOPE_GROUP_TYPE,
        $group_type_id,
        $group_role->getPermissions()
        $group_role->getPermissions(),
        $group_role->isAdmin()
      );

      $calculated_permissions->addItem($item);
@@ -119,21 +121,17 @@ class DefaultGroupPermissionCalculator extends GroupPermissionCalculatorBase {
      // If the member's roles change, so do the permissions.
      $calculated_permissions->addCacheableDependency($group_membership);

      $permission_sets = [];
      foreach ($group_membership->getRoles() as $group_role) {
        $permission_sets[] = $group_role->getPermissions();
        $calculated_permissions->addCacheableDependency($group_role);
      }

      $permissions = $permission_sets ? array_merge(...$permission_sets) : [];
        $item = new CalculatedGroupPermissionsItem(
          CalculatedGroupPermissionsItemInterface::SCOPE_GROUP,
          $group_membership->getGroup()->id(),
        $permissions
          $group_role->getPermissions(),
          $group_role->isAdmin()
        );

        $calculated_permissions->addCacheableDependency($group_role);
        $calculated_permissions->addItem($item);
      }
    }

    return $calculated_permissions;
  }
Loading