Commit 05b2e660 authored by Nikolay Lobachev's avatar Nikolay Lobachev
Browse files

Issue #3314382 by LOBsTerr, Finn Lewis: Group permission 2.0 Roadmap

parent 90c786aa
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -12,12 +12,12 @@
    ],
    "support": {
        "issues": "https://www.drupal.org/project/issues/group_permissions",
        "source": "https://www.drupal.org/project/issues/group_permissions"
        "source": "https://git.drupalcode.org/project/group_permissions"
    },
    "license": "GPL-2.0-or-later",
    "minimum-stability": "dev",
    "require": {
        "drupal/core": "^8.8 || ^9 || ^10",
        "drupal/group": "^1.0"
        "drupal/core": "^9 || ^10",
        "drupal/group": "^2.0"
    }
}
+1 −1
Original line number Diff line number Diff line
name: 'Group permissions'
type: module
description: 'Group permissions module allows to override permissions per group'
core_version_requirement: ^8 || ^9 || ^10
core_version_requirement: ^9 || ^10
package: 'Group'

dependencies:
+3 −152
Original line number Diff line number Diff line
@@ -5,158 +5,9 @@
 * Post update functions for group permissions.
 */

use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\StringTranslation\TranslatableMarkup;

/**
 * Enable revisions.
 * Implements hook_update_last_removed().
 */
function group_permissions_update_8001(&$sandbox) {
  $entity_definition_update_manager = \Drupal::entityDefinitionUpdateManager();
  $last_installed_schema_repository = \Drupal::service('entity.last_installed_schema.repository');

  $entity_type_id = 'group_permission';

  // Update entity type to add revisions settings.
  $group_permission_type = $entity_definition_update_manager->getEntityType($entity_type_id);
  $field_definitions = $last_installed_schema_repository->getLastInstalledFieldStorageDefinitions($entity_type_id);

  $group_permission_type->set('revision_table', 'group_permission_revision');

  $field_definitions['permissions']->setRevisionable(TRUE);
  $field_definitions['gid']->setRevisionable(FALSE);

  $field_definitions['revision_id'] = BaseFieldDefinition::create('integer')
    ->setName('revision_id')
    ->setTargetEntityTypeId($entity_type_id)
    ->setTargetBundle(NULL)
    ->setLabel(new TranslatableMarkup('Revision ID'))
    ->setReadOnly(TRUE)
    ->setSetting('unsigned', TRUE);

  $field_definitions['revision_default'] = BaseFieldDefinition::create('boolean')
    ->setName('revision_default')
    ->setTargetEntityTypeId($entity_type_id)
    ->setTargetBundle(NULL)
    ->setLabel(new TranslatableMarkup('Default revision'))
    ->setDescription(new TranslatableMarkup('A flag indicating whether this was a default revision when it was saved.'))
    ->setStorageRequired(TRUE)
    ->setInternal(TRUE)
    ->setTranslatable(FALSE)
    ->setRevisionable(TRUE);

  $field_definitions['revision_created'] = BaseFieldDefinition::create('created')
    ->setName('revision_created')
    ->setTargetEntityTypeId($entity_type_id)
    ->setTargetBundle(NULL)
    ->setLabel(new TranslatableMarkup('Revision create time'))
    ->setDescription(new TranslatableMarkup('The time that the current revision was created.'))
    ->setRevisionable(TRUE);
  $field_definitions['revision_user'] = BaseFieldDefinition::create('entity_reference')
    ->setName('revision_user')
    ->setTargetEntityTypeId($entity_type_id)
    ->setTargetBundle(NULL)
    ->setLabel(new TranslatableMarkup('Revision user'))
    ->setDescription(new TranslatableMarkup('The user ID of the author of the current revision.'))
    ->setSetting('target_type', 'user')
    ->setRevisionable(TRUE);
  $field_definitions['revision_log_message'] = BaseFieldDefinition::create('string_long')
    ->setName('revision_log_message')
    ->setTargetEntityTypeId($entity_type_id)
    ->setTargetBundle(NULL)
    ->setLabel(new TranslatableMarkup('Revision log message'))
    ->setDescription(new TranslatableMarkup('Briefly describe the changes you have made.'))
    ->setRevisionable(TRUE)
    ->setDefaultValue('');

  $keys = $group_permission_type->getKeys();
  $keys['revision'] = 'revision_id';
  $group_permission_type->set('entity_keys', $keys);

  $revisions_metadata_keys = [
    'revision_user' => 'revision_user',
    'revision_created' => 'revision_created',
    'revision_log_message' => 'revision_log_message',
    'revision_default' => 'revision_default',
  ];
  $group_permission_type->set('revision_metadata_keys', $revisions_metadata_keys);

  $entity_definition_update_manager->updateFieldableEntityType($group_permission_type, $field_definitions, $sandbox);
}

/**
 * Add the status, created, changed, owner fields.
 */
function group_permissions_update_8002(&$sandbox) {
  $entity_definition_update_manager = \Drupal::entityDefinitionUpdateManager();

  $entity_type_id = 'group_permission';

  $group_permission_type = $entity_definition_update_manager->getEntityType($entity_type_id);

  // Add the 'published' entity key to the taxonomy_term entity type.
  $keys = $group_permission_type->getKeys();
  $keys['published'] = 'status';
  $keys['owner'] = 'uid';
  $group_permission_type->set('entity_keys', $keys);

  $entity_definition_update_manager->updateEntityType($group_permission_type);

  // Add the status field.
  $status = BaseFieldDefinition::create('boolean')
    ->setLabel(new TranslatableMarkup('Publishing status'))
    ->setDescription(new TranslatableMarkup('A boolean indicating the published state.'))
    ->setRevisionable(TRUE)
    ->setTranslatable(TRUE)
    ->setDefaultValue(TRUE)
    ->setInitialValue(TRUE);

  $entity_definition_update_manager->installFieldStorageDefinition($group_permission_type->getKey('published'), $entity_type_id, $entity_type_id, $status);

  $created = BaseFieldDefinition::create('created')
    ->setLabel(new TranslatableMarkup('Created on'))
    ->setDescription(new TranslatableMarkup('The time that the group permissions were created.'))
    ->setTranslatable(FALSE)
    ->setRevisionable(FALSE);

  $entity_definition_update_manager->installFieldStorageDefinition('created', $entity_type_id, $entity_type_id, $created);

  $changed = BaseFieldDefinition::create('changed')
    ->setLabel(new TranslatableMarkup('Changed on'))
    ->setDescription(new TranslatableMarkup('The time that the group permissions were last edited.'))
    ->setTranslatable(FALSE)
    ->setRevisionable(FALSE);

  $entity_definition_update_manager->installFieldStorageDefinition('changed', $entity_type_id, $entity_type_id, $changed);

  $owner = BaseFieldDefinition::create('entity_reference')
    ->setLabel(new TranslatableMarkup('Creator'))
    ->setSetting('target_type', 'user')
    ->setSetting('handler', 'default')
    ->setTranslatable(FALSE)
    ->setInitialValue(1)
    ->setDefaultValueCallback('Drupal\group_permissions\Entity\GroupPermission\GroupPermission::getDefaultEntityOwner')
    ->setDescription(new TranslatableMarkup('The username of the group permissions creator.'));

  $entity_definition_update_manager->installFieldStorageDefinition($group_permission_type->getKey('owner'), $entity_type_id, $entity_type_id, $owner);
}

/**
 * Add links and handlers for revisions.
 */
function group_permissions_update_8003(&$sandbox = NULL) {
  $entity_definition_update_manager = \Drupal::entityDefinitionUpdateManager();

  $group_permission_type = $entity_definition_update_manager->getEntityType('group_permission');
  $group_permission_type->setFormClass('edit_revision', 'Drupal\group_permissions\Form\GroupPermissionRevisionEditForm');
  $group_permission_type->setHandlerClass('route_provider', ['html' => 'Drupal\group_permissions\GroupPermissionHtmlRouteProvider']);
  $group_permission_type->setHandlerClass('storage_schema', 'Drupal\group_permissions\GroupPermissionStorageSchema');
  $group_permission_type->setLinkTemplate('canonical', '/group/{group}/permissions');
  $group_permission_type->setLinkTemplate('delete-form', '/group/{group}/permissions/delete');
  $group_permission_type->setLinkTemplate('version-history', '/group/{group}/permissions/revisions');
  $group_permission_type->setLinkTemplate('revision', '/group/{group}/permissions/revision/{group_permission_revision}');
  $group_permission_type->setLinkTemplate('revision-revert', '/group/{group}/permissions/{group_permission}/revision/{group_permission_revision}/revert');
  $group_permission_type->setLinkTemplate('revision-delete', '/group/{group}/permissions/{group_permission}/revision/{group_permission_revision}/delete');

  $entity_definition_update_manager->updateEntityType($group_permission_type);
function group_permissions_update_last_removed() {
  return 8003;
}
+2 −3
Original line number Diff line number Diff line
@@ -5,14 +5,13 @@
 * Hooks for handling group_permissions module features.
 */

use Drupal\group_permissions\Entity\GroupPermission;
use Drupal\group\Entity\GroupInterface;

/**
 * Implements hook_entity_delete().
 */
function group_permissions_group_delete(GroupInterface $group) {
  if ($group_permissions = \Drupal::service('group_permission.group_permissions_manager')->loadByGroup($group)) {
  if ($group_permissions = \Drupal::service('group_permissions.group_permissions_manager')->loadByGroup($group)) {
    $group_permissions->delete();
  }
}
@@ -25,7 +24,7 @@ function group_permissions_menu_local_tasks_alter(&$data, $route_name) {
  if (!$group instanceof GroupInterface) {
    return;
  }
  $group_permission = \Drupal::service('group_permission.group_permissions_manager')->loadByGroup($group);
  $group_permission = \Drupal::service('group_permissions.group_permissions_manager')->loadByGroup($group);
  if (empty($group_permission)) {
    unset($data['tabs'][1]['group_permissions.link.group_permissions_revisions']);
    unset($data['tabs'][1]['group_permissions.link.group_permissions_delete']);
+20 −12
Original line number Diff line number Diff line
services:
  group_permission.group_permission_calculator:
    class: 'Drupal\group_permissions\Access\GroupPermissionCalculator'
    arguments: ['@entity_type.manager', '@group.membership_loader', '@group_permission.group_permissions_manager']
    tags:
      - { name: group_permission_calculator, priority: -110 }

  group_permission.group_permissions_manager:
    arguments: ['@cache.default', '@entity_type.manager', '@group_role.synchronizer']
  group_permissions.group_permissions_manager:
    arguments: ['@cache.default', '@entity_type.manager']
    class: Drupal\group_permissions\GroupPermissionsManager

  group_permission.group_permission_chain_calculator:
    class: Drupal\group_permissions\Access\GroupPermissionsChainGroupPermissionCalculator
    decorates: group_permission.chain_calculator
  group_permissions.group_permission_chain_calculator:
    class: Drupal\group_permissions\Access\GroupPermissionsChainPermissionCalculator
    decorates: flexible_permissions.chain_calculator
    decoration_priority: 1
    arguments: ['@variation_cache.group_default', '@variation_cache.corefix_static_no_serialize', '@cache.corefix_static_no_serialize', '@account_switcher']
    arguments: ['@variation_cache.flexible_permissions', '@variation_cache.flexible_permissions_memory', '@cache.flexible_permissions_memory', '@account_switcher']
    tags:
      - { name: 'service_collector', call: 'addCalculator', tag: 'flexible_permission_calculator' }

  # Flexible permissions calculators.
  group_permissions.individual_calculator:
    class: 'Drupal\group_permissions\Access\IndividualGroupPermissionCalculator'
    arguments: ['@entity_type.manager', '@group.membership_loader', '@group_permissions.group_permissions_manager']
    tags:
      - { name: flexible_permission_calculator, priority: -250 }

  group_permissions.synchronized_calculator:
    class: 'Drupal\group_permissions\Access\SynchronizedGroupPermissionCalculator'
    arguments: ['@entity_type.manager', '@group_permissions.group_permissions_manager']
    tags:
      - { name: service_collector, call: addCalculator, tag: group_permission_calculator }
      - { name: flexible_permission_calculator, priority: -150 }
Loading