Index: issue.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project_issue/issue.inc,v
retrieving revision 1.355
diff -u -p -r1.355 issue.inc
--- issue.inc	24 Apr 2010 01:58:18 -0000	1.355
+++ issue.inc	13 Aug 2010 18:42:33 -0000
@@ -139,6 +139,17 @@ function project_issue_project_issue_ass
     }
     // Always let the person replying assign it to themselves.
     $assigned[$user->uid] = $user->name;
+
+    // See if the current user is an issue maintainer for the current project.
+    $project = node_load($node->project_issue['pid']);
+    $maintainers = $project->project['maintainers'];
+    if (!empty($maintainers[$user->uid]['permissions']['maintain project issues'])) {
+      foreach ($maintainers as $uid => $maintainer) {
+        if (!empty($maintainer['permissions']['maintain project issues'])) {
+          $assigned[$uid] = $maintainer['name'];
+        }        
+      }
+    }
   }
 
   if (user_access('assign and be assigned project issues')) {
@@ -154,6 +165,7 @@ function project_issue_project_issue_ass
       $assigned[$assignee->uid] = $assignee->name;
     }
   }
+
 }
 
 // Support stuff
Index: project_issue.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project_issue/project_issue.install,v
retrieving revision 1.67
diff -u -p -r1.67 project_issue.install
--- project_issue.install	19 Jul 2010 19:00:34 -0000	1.67
+++ project_issue.install	13 Aug 2010 18:42:33 -0000
@@ -355,6 +355,33 @@ function project_issue_schema() {
     'primary key' => array('sid'),
   );
 
+  $schema['project_issue_project_maintainer'] = array(
+    'description' => t('Users who have various per-project maintainer permissions.'),
+    'fields' => array(
+      'nid' => array(
+        'description' => t('Foreign key: {project_projects}.nid of the project.'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'uid' => array(
+        'description' => t('Foreign key: {users}.uid of a user with any project maintainer permissions.'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'maintain_project_issues' => array(
+        'description' => t('Can this user maintain issues for the given project.'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'primary key' => array('nid', 'uid'),
+  );
   return $schema;
 }
 
@@ -551,3 +578,52 @@ function project_issue_update_6005() {
 
  return $ret;
 }
+
+/**
+ * Add the {project_issue_project_maintainer} table.
+ */
+function project_issue_update_6006() {
+  $ret = array();
+
+  $table = array(
+    'description' => t('Users who have various per-project maintainer permissions.'),
+    'fields' => array(
+      'nid' => array(
+        'description' => t('Foreign key: {project_projects}.nid of the project.'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'uid' => array(
+        'description' => t('Foreign key: {users}.uid of a user with any project maintainer permissions.'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'maintain_project_issues' => array(
+        'description' => t('Can this user maintain issues for the given project.'),
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'primary key' => array('nid', 'uid'),
+  );
+  db_create_table($ret, 'project_issue_project_maintainer', $table);
+
+  // Initially populate the table so that every project owner has full
+  // powers on their own projects.
+  $ret[] = update_sql("INSERT INTO {project_issue_project_maintainer} (nid, uid, maintain_project_issues) SELECT nid, uid, 1 FROM {node} WHERE type = 'project_project'");
+
+  // If CVS module is enabled, also populate the table from the
+  // {cvs_project_maintainers} table so that anyone with CVS access
+  // who is not the project owner can maintain issues.
+  if (module_exists('cvs')) {
+    $ret[] = update_sql("INSERT INTO {project_issue_project_maintainer} (nid, uid, maintain_project_issues) SELECT cpm.nid, cpm.uid, 1 FROM {cvs_project_maintainers} cpm INNER JOIN {node} n ON cpm.nid = n.nid WHERE cpm.uid != n.uid");
+  }
+
+  return $ret;
+}
Index: project_issue.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project_issue/project_issue.module,v
retrieving revision 1.180
diff -u -p -r1.180 project_issue.module
--- project_issue.module	24 Apr 2010 01:58:18 -0000	1.180
+++ project_issue.module	13 Aug 2010 18:42:35 -0000
@@ -549,6 +549,48 @@ function project_issue_access($op, $node
 }
 
 /**
+ * Implement hook_project_permission_info()
+ */
+function project_issue_project_permission_info() {
+  return array(
+    'maintain project issues' => array(
+      'title' => t('Maintain project issues'),
+      'description' => t('Allows a user to assign issues to other issue maintainers for this project.'),
+    ),
+  );
+}
+
+/**
+ * Implement hook_project_maintainer_save()
+ */
+function project_issue_project_maintainer_save($nid, $uid, $permissions = array()) {
+  db_query("UPDATE {project_issue_project_maintainer} SET maintain_project_issues = %d WHERE nid = %d AND uid = %d", !empty($permissions['maintain project issues']), $nid, $uid);
+  if (!db_affected_rows()) {
+    db_query("INSERT INTO {project_issue_project_maintainer} (nid, uid, maintain_project_issues) VALUES (%d, %d, %d)", $nid, $uid, !empty($permissions['maintain project issues']));
+  }
+}
+
+/**
+ * Implement hook_project_maintainer_remove()
+ */
+function project_issue_project_maintainer_remove($nid, $uid) {
+  db_query("DELETE FROM {project_issue_project_maintainer} WHERE nid = %d and uid = %d", $nid, $uid);
+}
+
+/**
+ * Implement hook_project_maintainer_project_load().
+ */
+function project_issue_project_maintainer_project_load($nid, &$maintainers) {
+  $query = db_query('SELECT u.uid, u.name, pipm.maintain_project_issues FROM {project_issue_project_maintainer} pipm INNER JOIN {users} u ON pipm.uid = u.uid WHERE pipm.nid = %d', $nid);
+  while ($maintainer = db_fetch_object($query)) {
+    if (empty($maintainers[$maintainer->uid])) {
+      $maintainers[$maintainer->uid]['name'] = $maintainer->name;
+    }
+    $maintainers[$maintainer->uid]['permissions']['maintain project issues'] = $maintainer->maintain_project_issues;
+  }
+}
+
+/**
  * Helper to trim all elements in an array.
  */
 function project_issue_trim(&$item, $key) {
