diff -u project.api.php project.api.php --- project.api.php 13 Aug 2010 17:17:50 -0000 +++ project.api.php 13 Aug 2010 17:47:30 -0000 @@ -86,0 +87,29 @@ + +/** + * Populate the maintainer information for a given project. + * + * Whenever a project node is being loaded, this hook is invoked to give any + * modules providing per-project permissions a chance to update the maintainer + * array. This array is stored in the project as $node->project['maintainers']. + * + * The maintainers array is keyed by the UID of each maintainer. Each value is + * itself a nested array of information about the maintainer. These arrays + * have the keys 'name' for the username and 'permissions', which is an array + * of per-project permissions associated with the maintainer. This + * 'permissions' subarray is keyed by permission name, and the values are 0 or + * 1 to indicate if the maintainer should have access to that permission. + * + * @param $nid + * The Project NID to populate maintainer information about. + * @param $maintainers + * Reference to a nested array of maintainers. + */ +function hook_project_maintainer_project_load($nid, &$maintainers) { + $query = db_query('SELECT u.uid, u.name, epm.some_project_permission FROM {example_project_maintainer} epm INNER JOIN {users} u ON epm.uid = u.uid WHERE epm.nid = %d', $nid); + while ($maintainer = db_fetch_object($query)) { + if (empty($maintainers[$maintainer->uid])) { + $maintainers[$maintainer->uid]['name'] = $maintainer->name; + } + $maintainers[$maintainer->uid]['permissions']['some project permission'] = $maintainer->some_project_permission; + } +} diff -u project.module project.module --- project.module 13 Aug 2010 17:14:08 -0000 +++ project.module 13 Aug 2010 17:53:20 -0000 @@ -832,24 +832,51 @@ } /** - * Implement hook_load(). + * Load all the per-project maintainer info for a given project. + * + * @param $nid + * Node ID of the project to load maintainer info about. + * + * @return + * Array of maintainer info for the given project. + * + * @see hook_project_maintainer_project_load(). */ -function project_project_load($node) { - $additions = db_fetch_array(db_query('SELECT * FROM {project_projects} WHERE nid = %d', $node->nid)); - $project = new stdClass; - $project->project = $additions; +function project_maintainer_project_load($nid) { + $maintainers = array(); + // We don't want to load all the permissions here, just the ones that // Project itself is responsible for, so we use our implementation of the // hook, instead of the global load function. $project_perms = project_project_permission_info(); - $maintainers = db_query('SELECT u.name, pm.* FROM {project_maintainer} pm INNER JOIN {users} u ON pm.uid = u.uid WHERE pm.nid = %d ORDER BY u.name', $node->nid); - while ($maintainer = db_fetch_object($maintainers)) { - $project->project['maintainers'][$maintainer->uid]['name'] = $maintainer->name; + $query = db_query('SELECT u.name, pm.* FROM {project_maintainer} pm INNER JOIN {users} u ON pm.uid = u.uid WHERE pm.nid = %d ORDER BY u.name', $nid); + while ($maintainer = db_fetch_object($query)) { + $maintainers[$maintainer->uid]['name'] = $maintainer->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; + $maintainers[$maintainer->uid]['permissions'][$perm_name] = $maintainer->$db_field; } } + + // Invoke hook_project_maintainer_project_load(). We can't use + // module_invoke_all() since we want a reference to the $maintainers array. + foreach (module_implements('project_maintainer_project_load') as $module) { + $function_name = $module . '_project_maintainer_project_load'; + $function_name($nid, $maintainers); + } + + return $maintainers; +} + +/** + * Implement hook_load(). + */ +function project_project_load($node) { + $additions = db_fetch_array(db_query('SELECT * FROM {project_projects} WHERE nid = %d', $node->nid)); + $project = new stdClass; + $project->project = $additions; + $project->project['maintainers'] = project_maintainer_project_load($node->nid); + return $project; } diff -u release/project_release.module release/project_release.module --- release/project_release.module 13 Aug 2010 17:17:54 -0000 +++ release/project_release.module 13 Aug 2010 17:46:30 -0000 @@ -172,6 +172,19 @@ } /** + * Implement hook_project_maintainer_project_load() + */ +function project_release_project_maintainer_project_load($nid, &$maintainers) { + $query = 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', $nid); + while ($maintainer = db_fetch_object($query)) { + if (empty($maintainers[$maintainer->uid])) { + $maintainers[$maintainer->uid]['name'] = $maintainer->name; + } + $maintainers[$maintainer->uid]['permissions']['administer project releases'] = $maintainer->administer_project_releases; + } +} + +/** * Implement of hook_form() for project_release nodes. */ function project_release_form(&$release, &$form_state) { @@ -925,15 +938,6 @@ $node->project_release['project_release_show_snapshots'] = TRUE; } } - - // 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; - } - $node->project['maintainers'][$maintainer->uid]['permissions']['administer project releases'] = $maintainer->administer_project_releases; - } } /**