diff -u project.api.php project.api.php --- project.api.php 11 Aug 2010 17:27:27 -0000 +++ project.api.php 12 Aug 2010 17:20:35 -0000 @@ -24,0 +25,57 @@ +/** + * Invoked whenever a project maintainer is added. + * + * This gives any modules that are providing their own per-project permissions + * a chance to store the data about a given maintainer's permissions. + * + * @param $nid + * The Project NID to add the maintainer to. + * @param $uid + * The user ID of the maintainer to add. + * @param array $permissions + * Associative array of which project-level permissions the maintainer + * should have. The keys are permission names, and the values are if the + * permission should be granted or not. + * + * @see project_maintainer_add() + * @see hook_project_permission_info() + */ +function hook_project_maintainer_add($nid, $uid, $permissions) { + // TODO +} + +/** + * Invoked whenever a project maintainer is updated. + * + * This gives any modules that are providing their own per-project permissions + * a chance to store the data about an updated maintainer's permissions. + * + * @param $nid + * The Project NID to update the maintainer for. + * @param $uid + * The user ID of the maintainer to update. + * @param array $permissions + * Associative array of which project-level permissions the maintainer + * should have. The keys are permission names, and the values are if the + * permission should be granted or not. + * + * @see project_maintainer_update() + * @see hook_project_permission_info() + */ +function hook_project_maintainer_update($nid, $uid, $permissions) { + // TODO +} + +/** + * Invoked whenever a maintainer is removed from a given project. + * + * @param $nid + * The Project NID to remove the maintainer from. + * @param $uid + * The user ID of the maintainer to remove. + * + * @see project_maintainer_remove() + */ +function hook_project_maintainer_remove($nid, $uid) { + // TODO +} diff -u project.module project.module --- project.module 12 Aug 2010 02:01:06 -0000 +++ project.module 12 Aug 2010 17:46:00 -0000 @@ -755,6 +755,16 @@ * 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', @@ -774,7 +784,12 @@ * 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, $permissions['administer projects'], $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 projects']), !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 + // they need to. + module_invoke_all('project_maintainer_add', $nid, $uid, $permissions); } /** @@ -790,7 +805,19 @@ * 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", $permissions['administer projects'], $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 projects']), !empty($permissions['administer project maintainers']), $nid, $uid); + + // Make sure we actually updated a record for this maintainer. + if (!db_affected_rows()) { + // Didn't update anything, add this as a new maintainer, instead. + project_release_project_maintainer_add($nid, $uid, $permissions); + } + else { + // Invoke hook_project_maintainer_update() to let other modules know this + // maintainer is being updated so they can take any actions or record any + // data they need to. + module_invoke_all('project_maintainer_update', $nid, $uid, $permissions); + } } /** @@ -803,6 +830,11 @@ */ function project_maintainer_remove($nid, $uid) { db_query("DELETE FROM {project_maintainer} WHERE nid = %d and uid = %d", $nid, $uid); + + // Invoke hook_project_maintainer_remove() to let other modules know this + // maintainer is being removed so they can take any actions or record any + // data they need to. + module_invoke_all('project_maintainer_remove', $nid, $uid); } /** diff -u includes/project_maintainers.inc includes/project_maintainers.inc --- includes/project_maintainers.inc 12 Aug 2010 01:36:53 -0000 +++ includes/project_maintainers.inc 12 Aug 2010 17:35:16 -0000 @@ -10,15 +10,17 @@ * Build the form for the */ function project_maintainers_form($form_state, $project) { - $project_project_perms = project_project_permission_info(); + // Load all the info about per-project permissions on this site. + $project_perms = project_permission_load(); + $form = array(); $form['#tree'] = TRUE; $form['#header'] = array(); $form['#project'] = $project; $form['#header']['username'] = array('data' => t('User')); - $form['#header']['administer_projects'] = array('data' => t('Administer project')); - $form['#header']['administer_project_maintainers'] = array('data' => t('Administer maintainers')); - + foreach ($project_perms as $perm_key => $perm_name) { + $form['#header'][$perm_key] = array('data' => t(drupal_ucfirst($perm_name))); + } if (!empty($project->project['maintainers'])) { foreach ($project->project['maintainers'] as $uid => $maintainer) { $form['maintainers'][$uid] = array(); @@ -26,7 +28,7 @@ '#type' => 'value', '#value' => $maintainer['name'], ); - foreach ($project_project_perms as $perm) { + foreach ($project_perms as $perm) { $form['maintainers'][$uid]['permissions'][$perm] = array( '#type' => 'checkbox', '#default_value' => !empty($maintainer['permissions'][$perm]), @@ -47,7 +49,7 @@ '#type' => 'value', '#value' => 0, ); - foreach ($project_project_perms as $perm) { + foreach ($project_perms as $perm) { $form['new_maintainer']['permissions'][$perm] = array( '#type' => 'checkbox', ); diff -u release/project_release.module release/project_release.module --- release/project_release.module 12 Aug 2010 02:04:47 -0000 +++ release/project_release.module 12 Aug 2010 17:50:50 -0000 @@ -145,50 +145,34 @@ * 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', ); } /** - * Add a maintainer with the specified permissions to a given project. - * - * @param $nid - * The Project NID to add the maintainer to. - * @param $uid - * The user ID of the maintainer to add. - * @param array $permissions - * Associative array of which project-level permissions the maintainer - * should have. The keys are permission names, and the values are if the - * permission should be granted or not. + * Implement hook_project_maintainer_add() */ function project_release_project_maintainer_add($nid, $uid, $permissions = array()) { - db_query("INSERT INTO {project_release_project_maintainer} (nid, uid, administer_project_releases) VALUES (%d, %d, %d)", $nid, $uid, $permissions['administer project releases']); + db_query("INSERT INTO {project_release_project_maintainer} (nid, uid, administer_project_releases) VALUES (%d, %d, %d)", $nid, $uid, !empty($permissions['administer project releases'])); } /** - * Update the permissions associated with a maintainer for a given project. - * - * @param $nid - * The Project NID to update the maintainer for. - * @param $uid - * The user ID of the maintainer to update. - * @param array $permissions - * Associative array of which project-level permissions the maintainer - * should have. The keys are permission names, and the values are if the - * permission should be granted or not. + * Implement hook_project_maintainer_update() */ function project_release_project_maintainer_update($nid, $uid, $permissions = array()) { - db_query("UPDATE {project_release_project_maintainer} SET administer_project_releases = %d WHERE nid = %d AND uid = %d", $permissions['administer project releases'], $nid, $uid); + db_query("UPDATE {project_release_project_maintainer} SET administer_project_releases = %d WHERE nid = %d AND uid = %d", !empty($permissions['administer project releases']), $nid, $uid); + if (!db_affected_rows()) { + // If we didn't have a record to update, add this as a new maintainer. + project_release_project_maintainer_add($nid, $uid, $permissions); + } } /** - * Remove a maintainer from a given project. - * - * @param $nid - * The Project NID to remove the maintainer from. - * @param $uid - * The user ID of the maintainer to remove. + * Implement hook_project_maintainer_remove() */ function project_release_project_maintainer_remove($nid, $uid) { db_query("DELETE FROM {project_release_project_maintainer} WHERE nid = %d and uid = %d", $nid, $uid); @@ -890,50 +874,6 @@ $form['buttons']['submit']['#submit'][] = 'project_release_node_submit'; } -function project_release_form_project_maintainers_form_alter(&$form) { - $project_release_project_perms = project_release_project_permission_info(); - $project = $form['#project']; - - // Add our checkboxes for the existing maintainers. - if (!empty($project->project['maintainers'])) { - foreach ($project->project['maintainers'] as $uid => $maintainer) { - foreach ($project_release_project_perms as $perm) { - $form['maintainers'][$uid]['permissions'][$perm] = array( - '#type' => 'checkbox', - '#default_value' => !empty($maintainer['permissions'][$perm]), - ); - } - } - } - - foreach ($project_release_project_perms as $key => $perm) { - // Update the header - $form['#header'][$key] = array('data' => drupal_ucfirst($perm)); - - // Add checkboxes for the new maintainer row - $form['new_maintainer']['permissions'][$perm] = array( - '#type' => 'checkbox', - ); - } - - $form['#submit'][] = 'project_release_project_maintainers_form_submit'; -} - -function project_release_project_maintainers_form_submit($form, &$form_state) { - $project_nid = $form['#project']->nid; - - // Loop over all the maintainers and update their permissions accordingly. - if (!empty($form_state['values']['maintainers'])) { - foreach ($form_state['values']['maintainers'] as $uid => $maintainer) { - project_release_project_maintainer_update($project_nid, $uid, $maintainer['permissions']); - } - } - - // See if we need to insert a record for a new maintainer. - if (!empty($form_state['values']['new_maintainer']['uid'])) { - project_release_project_maintainer_add($project_nid, $form_state['values']['new_maintainer']['uid'], $form_state['values']['new_maintainer']['permissions']); - } -} /** * @defgroup project_release_nodeapi Node API hooks