diff --git a/og.module b/og.module index 52f3b28..0cd5410 100644 --- a/og.module +++ b/og.module @@ -800,6 +800,35 @@ function og_form_group_manager_validate($form, &$form_state) { form_error($form, t("Can't save entity as group, because user @name can't be subscribed to group and become a manager.", array('@name' => format_username($account)))); } + +/** + * Find overridden role by role ID. + * + * @param $entity + * The entity from which to extract values. + * @param $entity_type + * The entity type. + * @param $gid + * The default OG role ID. + * + * @return + * The corresponding overridden OG role ID, if any. + */ +function og_roles_get_overridden_role($entity, $entity_type, $rid) { + list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity); + // Get og overridden roles. + $og_overridden_roles = og_roles($entity_type, $bundle, $id); + // Get og default roles. + $og_default_roles = og_roles($entity_type, $bundle, 0, FALSE, FALSE); + $role_name = $og_default_roles[$rid]; + foreach ($og_overridden_roles as $overridden_rid => $overridden_role) { + if ($overridden_role == $role_name) { + $rid = $overridden_rid; + return $rid; + } + } +} + /** * Implements hook_entity_insert(). */ @@ -809,12 +838,21 @@ function og_entity_insert($entity, $entity_type) { } list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity); if (!empty($entity->uid)) { + $og_overridden_roles = FALSE; + if (!og_is_group_default_access($entity_type, $entity)) { + // Override default roles. + og_roles_override($entity_type, $bundle, $id); + $og_overridden_roles = TRUE; + } // Subscribe the group manager. og_group($entity_type, $id, array('entity' => $entity->uid)); // Assign roles to group manager. $name = 'og_group_manager_default_rids_' . $entity_type . '_' . $bundle; if ($rids = variable_get($name)) { foreach ($rids as $rid) { + if ($og_overridden_roles) { + $rid = og_roles_get_overridden_role($entity, $entity_type, $rid); + } og_role_grant($entity_type, $id, $entity->uid, $rid); } } @@ -840,7 +878,14 @@ function og_entity_update($entity, $entity_type) { // Assign roles to group manager. $name = 'og_group_manager_default_rids_' . $entity_type . '_' . $bundle; if ($rids = variable_get($name)) { + $og_overridden_roles = FALSE; + if (!og_is_group_default_access($entity_type, $entity)) { + $og_overridden_roles = TRUE; + } foreach ($rids as $rid) { + if ($og_overridden_roles) { + $rid = og_roles_get_overridden_role($entity, $entity_type, $rid); + } og_role_grant($entity_type, $id, $entity->uid, $rid); } } diff --git a/og.test b/og.test index 7cafc65..026c8c4 100644 --- a/og.test +++ b/og.test @@ -1867,3 +1867,93 @@ class OgNonMembersPublishingContentTestCase extends DrupalWebTestCase { $this->assertText($this->group->title, 'The node is still referenced to the group.'); } } + +/** + * Auto assign roles. + */ +class OgAutoAssignRoleTestCase extends DrupalWebTestCase { + + public $roles; + + public static function getInfo() { + return array( + 'name' => 'OG auto assign role', + 'description' => 'Auto assign role on the creation of a new group.', + 'group' => 'Organic groups', + ); + } + + public function setUp() { + parent::setUp('og'); + // Create a group content type. + $this->drupalCreateContentType(array( 'name' => 'Group', 'type' => 'group')); + og_create_field(OG_GROUP_FIELD, 'node', 'group'); + og_create_field(OG_DEFAULT_ACCESS_FIELD, 'node', 'group'); + + // Define the administer role to be assigned automatically. + $role = user_role_load_by_name('administrator'); + variable_set('og_group_manager_default_rids_node_group', array($role->rid)); + + $this->roles = db_select('og_role', 'ogr') + ->fields('ogr') + ->execute() + ->fetchAllAssoc('rid'); + } + + /** + * Create a new group and verify that new OG roles has been created and + * attached to the group owner. + */ + public function testAutoAssignNewRoles() { + // Create the group. + $node = entity_create('node', array( + 'title' => $this->randomString(), + 'type' => 'group', + 'language' => LANGUAGE_NONE, + 'uid' => 1, + )); + $wrapper = entity_metadata_Wrapper('node', $node); + $wrapper->{OG_GROUP_FIELD}->set(1); + $wrapper->{OG_DEFAULT_ACCESS_FIELD}->set(1); + $wrapper->save(); + + // Verify that the group received new roles. + $group_roles = db_select('og_users_roles', 'ogur') + ->fields('ogur') + ->condition('ogur.group_type', 'node') + ->condition('ogur.gid', $wrapper->getIdentifier()) + ->condition('ogur.rid', array_keys($this->roles), 'NOT IN') + ->execute() + ->fetchAllAssoc('rid'); + + $this->assertTrue(!empty($group_roles), 'A new role has been automatically assigned to the group owner.'); + } + + /** + * Create a new group and verify that the basic OG roles has been assigned to + * the group owner. + */ + public function testAutoAssignCurrentRoles() { + // Create the group. + $node = entity_create('node', array( + 'title' => $this->randomString(), + 'type' => 'group', + 'language' => LANGUAGE_NONE, + 'uid' => 1, + )); + $wrapper = entity_metadata_Wrapper('node', $node); + $wrapper->{OG_GROUP_FIELD}->set(1); + $wrapper->{OG_DEFAULT_ACCESS_FIELD}->set(0); + $wrapper->save(); + + $group_roles = db_select('og_users_roles', 'ogur') + ->fields('ogur') + ->condition('ogur.group_type', 'node') + ->condition('ogur.gid', $wrapper->getIdentifier()) + ->condition('ogur.rid', array_keys($this->roles), 'IN') + ->execute() + ->fetchAllAssoc('rid'); + + $this->assertTrue(!empty($group_roles), 'The basic OG roles has been assigned to the group owner.'); + } +}