? storm--1052154-11.patch
? stormteam-1052154-3.patch
Index: stormteam/stormteam.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/storm/stormteam/stormteam.install,v
retrieving revision 1.1.2.5
diff -u -p -r1.1.2.5 stormteam.install
--- stormteam/stormteam.install	5 Jan 2010 17:42:43 -0000	1.1.2.5
+++ stormteam/stormteam.install	16 Feb 2011 23:06:19 -0000
@@ -47,23 +47,25 @@ function stormteam_schema() {
         'type' => 'int',
         'not null' => TRUE,
         'default' => 0),
-      'members' => array(
-        'type' => 'text',
-        'size' => 'medium',
+      'mnid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0
       ),
     ),
     'primary key' => array(
       'vid',
       'nid',
+      'mnid',
     ),
   );
-  
+
   return $schema;
 }
 
 /**
  * @function
- * Implementatin of hook_update_N
+ * Implementation of hook_update_N
  * Removes 0:N from members array
  */
 function stormteam_update_6101() {
@@ -87,3 +89,81 @@ function stormteam_update_6101() {
   }
   return $ret;
 }
+
+/**
+* Implements hook_update_N().
+*
+* Migrate members serialized array to member node id
+*/
+function stormteam_update_6200() {
+
+  $ret = array();
+  $new_schema = array();
+  $new_schema['stormteam_6200'] = array(
+    'fields' => array(
+      'vid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'nid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0
+      ),
+      'mnid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0
+      ),
+    ),
+    'primary key' => array(
+      'vid',
+      'nid',
+      'mnid',
+    ),
+  );
+
+  // Create the new table with a temporary name
+  db_create_table($ret, 'stormteam_6200', $new_schema['stormteam_6200']);
+
+  // Check for collisions between org names and person names
+  $result = db_query("SELECT * FROM {stormteam}");
+  $mapping = array();
+  while ($team = db_fetch_object($result)) {
+    $members = unserialize($team->members);
+
+    // Generate the mapping array and save it to the database
+    foreach($members as $nid => $fullname) {
+      $mapping = new stdClass();
+      $mapping->nid = $team->nid;
+      $mapping->vid = $team->vid;
+      $mapping->mnid = $nid;
+      $result = db_query('INSERT INTO {stormteam_6200} VALUES (%d, %d, %d)', $mapping->nid, $mapping->vid, $mapping->mnid);
+      if (FALSE === $result) {
+        // Write failed, abort the update
+        $mapping = FALSE;
+        break 2;
+      }
+    }
+  }
+
+  if (FALSE === $mapping) {
+    // Abort the changes
+    $ret['#abort'] = array('success' => FALSE, 'query' => "Unable to map team members to nodes. Failed to write data to new table.");
+
+    // Remove the new table
+    db_drop_table($ret, 'stormteam_6200');
+
+    // Return the failed update
+    return $ret;
+  }
+
+  // Remove the old table
+  db_drop_table($ret, 'stormteam');
+
+  // Rename the table to the proper name
+  db_rename_table($ret, 'stormteam_6200', 'stormteam');
+
+  return $ret;
+}
Index: stormteam/stormteam.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/storm/stormteam/stormteam.module,v
retrieving revision 1.1.2.28.2.2
diff -u -p -r1.1.2.28.2.2 stormteam.module
--- stormteam/stormteam.module	13 Feb 2011 13:43:41 -0000	1.1.2.28.2.2
+++ stormteam/stormteam.module	16 Feb 2011 23:06:19 -0000
@@ -293,10 +293,10 @@ function stormteam_form(&$node) {
   
   $i = 1;
   $variable = 'members_array_'. $i;
-  
+
   // Add rows for existing team members
   if (isset($node->members_array) && is_array($node->members_array)) {
-    foreach ($node->members_array as $node->$variable => $name) {
+    foreach($node->members_array as $node->$variable => $name) {
       $form['group1'][$variable] = array(
         '#type' => 'select',
         '#title' => t('Team Member @num', array('@num' => $i)),
@@ -307,9 +307,9 @@ function stormteam_form(&$node) {
       $variable = 'members_array_'. $i;
     }
   }
-  
+
   // Add placeholder rows
-  for ($j = 0; $j < 3; $j++) {
+  for($j = 0; $j < 3; $j++) {
     $variable = 'members_array_'. $i;
     $form['group1'][$variable] = array(
       '#type' => 'select',
@@ -319,7 +319,7 @@ function stormteam_form(&$node) {
     );
     $i++;
   }
-  
+
   if ($type->has_body) {
     $form['body_field'] = node_body_field($node, $type->body_label, $type->min_word_count);
   }
@@ -337,9 +337,11 @@ function stormteam_form(&$node) {
  * Implementation of hook_load
  */
 function stormteam_load($node) {
-  $additions = db_fetch_object(db_query('SELECT * FROM {stormteam} WHERE vid = %d', $node->vid));
-  if (isset($additions->members)) {
-    $additions->members_array = unserialize($additions->members);
+  $result = db_query('SELECT mnid FROM {stormteam} WHERE vid = %d', $node->vid);
+  $additions = new stdClass();
+  while ($members = db_fetch_object($result)) {
+    $mnode = node_load($members->mnid);
+    $additions->members_array[$members->mnid] = $mnode->title;
   }
   $additions->title_old = $node->title;
   return $additions;
@@ -390,12 +392,14 @@ function _stormteam_beforesave(&$node) {
  */
 function stormteam_insert($node) {
   _stormteam_beforesave($node);
-  if (isset($node->vid) && (isset($node->nid)) && (isset($node->members))) {
-    db_query("INSERT INTO {stormteam}
-      (vid, nid, members) VALUES
-      (%d, %d, '%s')",
-      $node->vid, $node->nid, $node->members
-    );
+  if (isset($node->vid) && (isset($node->nid)) && (isset($node->members_array))) {
+    $member = new stdClass();
+    $member->nid = $node->nid;
+    $member->vid = $node->vid;
+    foreach($node->members_array as $mnid => $member_name) {
+      $member->mnid = $mnid;
+      drupal_write_record('stormteam', $member);
+    }
   }
 }
 
@@ -410,11 +414,21 @@ function stormteam_update($node) {
     stormteam_insert($node);
   }
   else {
-    db_query("UPDATE {stormteam} SET
-      members = '%s' WHERE vid = %d",
-      $node->members, $node->vid
-    );
     
+    if (isset($node->vid) && (isset($node->nid)) && (isset($node->members_array))) {
+      // Delete the old members
+      db_query("DELETE FROM {stormteam} WHERE nid = %d AND vid = %d", $node->nid, $node->vid);
+
+      // Insert entries
+      $member = new stdClass();
+      $member->nid = $node->nid;
+      $member->vid = $node->vid;
+      foreach($node->members_array as $mnid => $member_name) {
+        $member->mnid = $mnid;
+        drupal_write_record('stormteam', $member);
+      }
+    }
+
     // Invokes hook_stormteam_change so that if title has changed, other modules that have cached the title can update it.
     if ($node->title != $node->title_old) {
       module_invoke_all('stormteam_change', $node->nid, $node->title);
@@ -678,8 +692,9 @@ function stormteam_user_return_teams($ac
     $account = $user;
   }
   
-  $s = "SELECT ste.nid FROM {stormteam} ste WHERE (ste.members LIKE '%%i:%d;%%' OR ste.members LIKE '%%i:%d;%%')";
-  $r = db_query($s, $account->stormperson_nid, $account->stormorganization_nid);
+  // Get the list of team nodes. Include organizations which the person is a member of.
+  $s = "SELECT ste.nid FROM {stormteam} ste JOIN {stormperson} stp ON (stp.nid = ste.mnid OR stp.orgnization_nid = ste.mnid) WHERE stp.user_uid = %d";
+  $r = db_query($s, $account->uid);
   $teams = array();
   while ($team = db_fetch_object($r)) {
     $teams[] = $team->nid;
Index: stormteam/stormteam.views.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/storm/stormteam/Attic/stormteam.views.inc,v
retrieving revision 1.1.2.2
diff -u -p -r1.1.2.2 stormteam.views.inc
--- stormteam/stormteam.views.inc	12 Dec 2009 21:38:39 -0000	1.1.2.2
+++ stormteam/stormteam.views.inc	16 Feb 2011 23:06:19 -0000
@@ -2,7 +2,7 @@
 // $Id: stormteam.views.inc,v 1.1.2.2 2009/12/12 21:38:39 magnity Exp $
 
 function stormteam_views_data() {
-  $data['stormteam']['table']['group']  = 'Storm';
+  $data['stormteam']['table']['group']  = 'Storm Team';
   $data['stormteam']['table']['join'] = array(
     'node' => array(
       'left_field' => 'vid',
@@ -10,27 +10,34 @@ function stormteam_views_data() {
     ),
   );
   
-  $data['stormteam']['members'] = array(
-    'title' => t('Team Members'),
+  $data['stormteam']['mnid'] = array(
+    'title' => t('Team Member Nid'),
     'help' => 'Storm Team Members',
     'field' => array(
-      'handler' => 'stormteam_handler_field_teammembers',
+      'handler' => 'views_handler_field_node',
       'click sortable' => FALSE,
     ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_node_nid',
+      'parent' => 'views_handler_argument_numeric',
+      'numeric' => TRUE,
+      'validate type' => 'nid',
+    ),
+    // Information for accepting a nid as a filter
+    'filter' => array(
+      'handler' => 'views_handler_filter_nid',
+    ),
+    // Information for sorting on a nid.
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'relationship' => array(
+      'base' => 'node',
+      'field' => 'nid',
+      'handler' => 'views_handler_relationship',
+      'label' => t('Member -> Node'),
+    ),
   );
   
   return $data;
-}
-
-function stormteam_views_handlers() {
-  return array(
-    'info' => array(
-      'path' => drupal_get_path('module', 'stormteam'),
-    ),
-    'handlers' => array(
-      'stormteam_handler_field_teammembers' => array(
-        'parent' => 'views_handler_field_prerender_list',
-      ),
-    ),
-  );
-}
+}
\ No newline at end of file
Index: stormteam/stormteam_handler_field_teammembers.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/storm/stormteam/stormteam_handler_field_teammembers.inc,v
retrieving revision 1.1.2.1
diff -u -p -r1.1.2.1 stormteam_handler_field_teammembers.inc
--- stormteam/stormteam_handler_field_teammembers.inc	3 Oct 2009 17:03:35 -0000	1.1.2.1
+++ stormteam/stormteam_handler_field_teammembers.inc	16 Feb 2011 23:06:19 -0000
@@ -1,34 +0,0 @@
-<?php
-// $Id: stormteam_handler_field_teammembers.inc,v 1.1.2.1 2009/10/03 17:03:35 magnity Exp $
-
-/**
- * Separate team members into array.
- */
-class stormteam_handler_field_teammembers extends views_handler_field_prerender_list {
-  
-  function render($values) {
-    $field = $values->{$this->field_alias};
-    $field = unserialize($field);
-    
-    if (!empty($field)) {
-      // Turn member names into links to Storm person.
-      if (is_array($field)) {
-        $temp_field = array();
-        foreach ($field as $field_nid => $field_title) {
-          $temp_field[] = l($field_title, 'node/'. $field_nid);
-        }
-        $field = $temp_field;
-      }
-      
-      if ($this->options['type'] == 'separator') {
-        return implode(check_plain($this->options['separator']), $field);
-      }
-      else {
-        return theme('item_list', $field, NULL, $this->options['type']);
-      }
-    }
-    else if (!empty($this->options['empty'])) {
-      return $this->options['empty'];
-    }
-  }
-}
