diff -u project.api.php project.api.php --- project.api.php 12 Aug 2010 17:20:35 -0000 +++ project.api.php 12 Aug 2010 18:24:43 -0000 @@ -8,18 +8,40 @@ /** * Info hook to advertise per-project permissions supported by a module. + * + * @return + * Nested array of permission information. The keys of this array should be + * the lower-case English version of the permission name, as used throughout + * the code. The values of the array should be associative arrays of + * information about each permission. These subarrays for each permission + * must include a 'title' key for the human-readable (and translatable) + * version of the permission for display in the UI, and an optional + * 'description' key for a description of what the permission allows a + * project maintainer to do. */ function hook_project_permission_info() { return array( - // TODO + 'some permission name' => array( + 'title' => t('Name of this permission'), + 'description' => t('Description of what this this permission allows project maintainers to do.'), + ), ); } /** * Alter hook for per-project permissions supported by a module. + * + * @param $permissions + * Reference to an array of all the permissions defined via + * hook_project_permission_info(). + * + * @see hook_project_permission_info(). + * @see project_permission_load(). + * @see drupal_alter() */ function hook_project_permission_alter(&$permissions) { - // TODO + // I can't yet fathom why we need an alter hook here, but we might need it + // and it was free to include it, so why not? ;) } /** diff -u project.module project.module --- project.module 12 Aug 2010 17:46:00 -0000 +++ project.module 12 Aug 2010 18:30:38 -0000 @@ -603,8 +603,14 @@ } // Otherwise, see if the user has the right permission for this project. + // Special-case: the per-project permission for 'administer projects' is + // singular, 'administer project', so handle that here. + if ($permission == 'administer projects') { + $permission = 'administer project'; + } return !empty($project_obj->project['maintainers'][$user->uid]['permissions'][$permission]); } + // If we haven't granted access yet, deny it. return FALSE; } @@ -755,19 +761,15 @@ * Implement hook_project_permission_info() */ function project_project_permission_info() { - // When these permissions are displayed in the UI, they're capitalized and - // run through t(). To ensure that the translation template knows about - // them, we define the t()'ed versions here. However, in the code itself, we - // always want to operate on the English version of the permissions, so we - // return those for the info hook itself. - /// @todo: This could move into a separate project.potx.inc file... - $translations = array( - t('Administer projects'), - t('Administer project maintainers'), - ); return array( - 'administer_project' => 'administer projects', - 'administer_project_maintainers' => 'administer project maintainers', + 'administer project' => array( + 'title' => t('Administer project'), + 'description' => t('Allows a user to edit a project, and other related operations.'), + ), + 'administer project maintainers' => array( + 'title' => t('Administer project maintainers'), + 'description' => t('Allows a user to add, remove, or update the permissions on other project maintainers.'), + ), ); } @@ -784,7 +786,7 @@ * permission should be granted or not. */ function project_maintainer_add($nid, $uid, $permissions = array()) { - db_query("INSERT INTO {project_maintainer} (nid, uid, administer_project, administer_project_maintainers) VALUES (%d, %d, %d, %d)", $nid, $uid, !empty($permissions['administer projects']), !empty($permissions['administer project maintainers'])); + db_query("INSERT INTO {project_maintainer} (nid, uid, administer_project, administer_project_maintainers) VALUES (%d, %d, %d, %d)", $nid, $uid, !empty($permissions['administer project']), !empty($permissions['administer project maintainers'])); // Invoke hook_project_maintainer_add() to let other modules know this // maintainer now exists so they can take any actions or record any data @@ -805,7 +807,7 @@ * permission should be granted or not. */ function project_maintainer_update($nid, $uid, $permissions = array()) { - db_query("UPDATE {project_maintainer} SET administer_project = %d, administer_project_maintainers = %d WHERE nid = %d AND uid = %d", !empty($permissions['administer projects']), !empty($permissions['administer project maintainers']), $nid, $uid); + db_query("UPDATE {project_maintainer} SET administer_project = %d, administer_project_maintainers = %d WHERE nid = %d AND uid = %d", !empty($permissions['administer project']), !empty($permissions['administer project maintainers']), $nid, $uid); // Make sure we actually updated a record for this maintainer. if (!db_affected_rows()) { @@ -851,7 +853,8 @@ $maintainers = db_query('SELECT u.name, pm.* FROM {project_maintainer} pm INNER JOIN {users} u ON pm.uid = u.uid WHERE pm.nid = %d', $node->nid); while ($maintainer = db_fetch_object($maintainers)) { $project->project['maintainers'][$maintainer->uid]['name'] = $maintainer->name; - foreach ($project_perms as $db_field => $perm_name) { + foreach ($project_perms as $perm_name => $perm_info) { + $db_field = str_replace(' ', '_', $perm_name); $project->project['maintainers'][$maintainer->uid]['permissions'][$perm_name] = $maintainer->$db_field; } } diff -u includes/project_maintainers.inc includes/project_maintainers.inc --- includes/project_maintainers.inc 12 Aug 2010 17:35:16 -0000 +++ includes/project_maintainers.inc 12 Aug 2010 18:17:12 -0000 @@ -18,8 +18,8 @@ $form['#header'] = array(); $form['#project'] = $project; $form['#header']['username'] = array('data' => t('User')); - foreach ($project_perms as $perm_key => $perm_name) { - $form['#header'][$perm_key] = array('data' => t(drupal_ucfirst($perm_name))); + foreach ($project_perms as $perm_name => $perm_info) { + $form['#header'][$perm_name] = array('data' => $perm_info['title']); } if (!empty($project->project['maintainers'])) { foreach ($project->project['maintainers'] as $uid => $maintainer) { @@ -28,10 +28,10 @@ '#type' => 'value', '#value' => $maintainer['name'], ); - foreach ($project_perms as $perm) { - $form['maintainers'][$uid]['permissions'][$perm] = array( + foreach ($project_perms as $perm_name => $perm_info) { + $form['maintainers'][$uid]['permissions'][$perm_name] = array( '#type' => 'checkbox', - '#default_value' => !empty($maintainer['permissions'][$perm]), + '#default_value' => !empty($maintainer['permissions'][$perm_name]), ); } } @@ -49,8 +49,8 @@ '#type' => 'value', '#value' => 0, ); - foreach ($project_perms as $perm) { - $form['new_maintainer']['permissions'][$perm] = array( + foreach ($project_perms as $perm_name => $perm_info) { + $form['new_maintainer']['permissions'][$perm_name] = array( '#type' => 'checkbox', ); } diff -u release/project_release.module release/project_release.module --- release/project_release.module 12 Aug 2010 17:50:50 -0000 +++ release/project_release.module 12 Aug 2010 18:26:29 -0000 @@ -145,11 +145,11 @@ * Implement hook_project_permission_info() */ function project_release_project_permission_info() { - $translations = array( - t('Administer project releases'), - ); return array( - 'administer_project_releases' => 'administer project releases', + 'administer project releases' => array( + 'title' => t('Administer project releases'), + 'description' => t('Allows a user to create and update releases, and to control which branches are recommeneded or supported.'), + ), ); } @@ -933,19 +933,13 @@ } } - // Also load project_release maintainer info. We don't want to load all the - // permissions here, just the ones that project_release is responsible for, - // so we use our implementation of the hook, instead of the global load - // function. - $project_release_project_perms = project_release_project_permission_info(); - $maintainers = db_query('SELECT u.name, prpm.* FROM {project_release_project_maintainer} prpm INNER JOIN {users} u ON prpm.uid = u.uid WHERE prpm.nid = %d', $node->nid); + // Also load project_release project maintainer info. + $maintainers = db_query('SELECT u.uid, u.name, prpm.administer_project_releases FROM {project_release_project_maintainer} prpm INNER JOIN {users} u ON prpm.uid = u.uid WHERE prpm.nid = %d', $node->nid); while ($maintainer = db_fetch_object($maintainers)) { if (empty($node->project['maintainers'][$maintainer->uid])) { $node->project['maintainers'][$maintainer->uid]['name'] = $maintainer->name; } - foreach ($project_release_project_perms as $db_field => $perm_name) { - $node->project['maintainers'][$maintainer->uid]['permissions'][$perm_name] = $maintainer->$db_field; - } + $node->project['maintainers'][$maintainer->uid]['permissions']['administer project releases'] = $maintainer->administer_project_releases; } }