Index: og_user_roles.pages.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/og_user_roles/og_user_roles.pages.inc,v retrieving revision 1.4 diff -u -p -r1.4 og_user_roles.pages.inc --- og_user_roles.pages.inc 14 Aug 2009 12:00:30 -0000 1.4 +++ og_user_roles.pages.inc 6 Dec 2009 19:22:12 -0000 @@ -18,7 +18,7 @@ function og_user_roles_admin_settings() } // Get list of roles, not counting authenticated and anonymous user. - $all_roles = user_roles(); + $all_roles = array_map('check_plain', user_roles()); foreach ($all_roles as $rid => $role) { if ($rid > DRUPAL_AUTHENTICATED_RID) { $roles[$rid] = $role; @@ -97,7 +97,8 @@ function og_user_roles_page_form($form_s $form['#node'] = $node; // Used for theming. $form['#id'] = 'og-user-roles'; - $form['#roles'] = $roles; + $form['#assignable_roles'] = $roles; + $all_roles = array_map('check_plain', user_roles()); // Unset role titles. foreach ($roles as $rid => $name) { @@ -109,12 +110,23 @@ function og_user_roles_page_form($form_s $form['user_roles'][$account->uid]['user'] = array( '#value' => theme('username', $account), ); + $account_roles = og_user_roles_get_roles_by_group($node->nid, $account->uid); $form['user_roles'][$account->uid]['roles'] = array( '#type' => 'checkboxes', - '#default_value' => og_user_roles_get_roles_by_group($node->nid, $account->uid), + '#default_value' => $account_roles, '#options' => $roles, '#parents' => array('user_roles', $account->uid), ); + // Add default roles that do not appear in the form. + $default_roles = array(); + foreach ($account_roles as $rid) { + if (!isset($roles[$rid])) { + $default_roles[$rid] = $all_roles[$rid]; + } + } + $form['user_roles'][$account->uid]['default_roles'] = array( + '#value' => implode(', ', $default_roles), + ); } $form['submit'] = array('#type' => 'submit', '#value' => t('Save')); @@ -128,11 +140,13 @@ function og_user_roles_page_form_submit( $gid = $form['#node']->nid; foreach ($form_state['values']['user_roles'] as $uid => $new_roles) { - og_user_roles_role_delete($gid, $uid); - - $new_roles = array_filter($new_roles); - foreach ($new_roles as $rid => $checked) { - og_user_roles_role_add($gid, $uid, $rid); + foreach ($form['#assignable_roles'] as $rid => $name) { + if (empty($new_roles[$rid])) { + og_user_roles_role_delete($gid, $uid, $rid); + } + else { + og_user_roles_role_add($gid, $uid, $rid); + } } } @@ -143,12 +157,13 @@ function og_user_roles_page_form_submit( * Render the group user roles assignment form like user permissions table. */ function theme_og_user_roles_page_form($form) { - $header = array_merge(array(''), $form['#roles']); + $header = array_merge(array('', t('Default roles')), $form['#assignable_roles']); $rows = array(); foreach (element_children($form['user_roles']) as $item) { $row = array(); $row[] = drupal_render($form['user_roles'][$item]['user']); + $row[] = drupal_render($form['user_roles'][$item]['default_roles']); foreach (element_children($form['user_roles'][$item]['roles']) as $role) { $row[] = drupal_render($form['user_roles'][$item]['roles'][$role]); } Index: tests/og_user_roles.test =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/og_user_roles/tests/og_user_roles.test,v retrieving revision 1.6 diff -u -p -r1.6 og_user_roles.test --- tests/og_user_roles.test 6 Dec 2009 18:58:26 -0000 1.6 +++ tests/og_user_roles.test 6 Dec 2009 19:09:34 -0000 @@ -322,6 +322,14 @@ class OgUserRolesGroupAdminTestCase exte $this->assertNoText('OGUR privilege escalation'); $this->drupalGet("node/$this->gid1"); $this->assertText('OGUR privilege escalation'); + + // Unassign an additional role from group admin. + $this->drupalLogin($this->admin_user); + $edit = array( + "user_roles[{$this->group_admin->uid}][$this->member_role]" => FALSE, + ); + $this->drupalPost("og/users/$this->gid1/roles", $edit, t('Save')); + $this->assertFieldByName("user_roles[{$this->group_admin->uid}][$this->member_role]", FALSE); } }