? package/dif
Index: release/project_release.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/release/project_release.module,v
retrieving revision 1.144
diff -u -p -r1.144 project_release.module
--- release/project_release.module	1 Dec 2009 01:02:02 -0000	1.144
+++ release/project_release.module	1 Dec 2009 02:37:05 -0000
@@ -390,6 +390,8 @@ function project_release_check_supported
  */
 function project_release_compute_update_status($pid, $api_tid, $major) {
   $latest_release = $recommended_release = $latest_security_release = 0;  
+  $not_current_nids = array();
+  $not_secure_nids = array();
   $query = project_release_query_releases_by_branch($pid, $api_tid, $major);
   while ($release = db_fetch_object($query)) {
     // Clear out the status so we always start fresh with each release.
@@ -426,7 +428,24 @@ function project_release_compute_update_
 
     // If the status is different than what we have in the DB, update the DB.
     if ($update_status != $release->update_status) {
-      db_query("UPDATE {project_release_nodes} SET update_status = %d WHERE nid = %d", $update_status, $release->nid);
+      if ($update_status == PROJECT_RELEASE_UPDATE_STATUS_NOT_CURRENT) {
+        $not_current_nids[] = $release->nid;
+      }
+      else {
+        $not_secure_nids[] = $release->nid;
+      }
+    }
+  }
+
+  if (!empty($not_current_nids)) {
+    $placeholders = db_placeholders($not_current_nids);
+    db_query("UPDATE {project_release_nodes} SET update_status = %d WHERE nid IN ($placeholders)", array_merge(array(PROJECT_RELEASE_UPDATE_STATUS_NOT_CURRENT), $not_current_nids));
+  }
+  if (!empty($not_secure_nids)) {
+    $placeholders = db_placeholders($not_secure_nids);
+    db_query("UPDATE {project_release_nodes} SET update_status = %d WHERE nid IN ($placeholders)", array_merge(array(PROJECT_RELEASE_UPDATE_STATUS_NOT_SECURE), $not_secure_nids));
+    if (module_exists('project_package')) {
+      project_package_check_update_status($not_secure_nids);
     }
   }
 }
@@ -598,8 +617,7 @@ function project_release_view($node, $te
 
   if (module_exists('project_package')) {
     $output = '';
-    // TODO need a better solution for this.
-    if ($item_count = db_result(db_query("SELECT COUNT(*) FROM {project_package_local_release_item} WHERE package_nid = %d", $node->nid))) {
+    if (!empty($node->project_package['count'])) {
       $view_info = variable_get('project_package_release_items_view', 'project_package_items:default');
       list($view_name, $display_name) = split(':', $view_info);
       $output .= '<h3>' . t('In this package') . '</h3>';
cvs diff: Diffing package
Index: package/project_package.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/package/project_package.install,v
retrieving revision 1.1
diff -u -p -r1.1 project_package.install
--- package/project_package.install	27 Nov 2009 20:06:51 -0000	1.1
+++ package/project_package.install	1 Dec 2009 02:37:06 -0000
@@ -12,6 +12,7 @@
 function project_package_install() {
   // Create the database tables.
   drupal_install_schema('project_package');
+  db_query("UPDATE {system} SET weight = %d WHERE name = '%s'", 3, 'project_package');
 }
 
 /**
Index: package/project_package.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/package/project_package.module,v
retrieving revision 1.1
diff -u -p -r1.1 project_package.module
--- package/project_package.module	27 Nov 2009 20:06:51 -0000	1.1
+++ package/project_package.module	1 Dec 2009 02:37:06 -0000
@@ -16,3 +16,69 @@ function project_package_views_api() {
   );
 }
 
+/**
+ * Implement hook_nodeapi().
+ */
+function project_package_nodeapi(&$node, $op, $arg) {
+  switch ($node->type) {
+    case 'project_release':
+      project_package_release_nodeapi($node, $op, $arg);
+      break;
+
+  }
+}
+
+/**
+ * hook_nodeapi implementation specific to "project_release" nodes.
+ *
+ * @see project_package_nodeapi().
+ */
+function project_package_release_nodeapi(&$node, $op, $arg) {
+  switch ($op) {
+    case 'insert':
+    case 'update':
+      // We can't rely on $node->project_package since nodeapi() doesn't have
+      // a fully loaded $node object. :(
+      $count = db_result(db_query("SELECT COUNT(*) FROM {project_package_local_release_item} WHERE package_nid = %d", $node->nid));
+      if (!empty($count)) {
+        project_package_set_update_status($node->nid);
+      }
+      break;
+
+    case 'load':
+      $count = db_result(db_query("SELECT COUNT(*) FROM {project_package_local_release_item} WHERE package_nid = %d", $node->nid));
+      if (!empty($count)) {
+        $node->project_package['count'] = $count;
+      }
+      break;
+      
+  }
+}
+
+/**
+ * Set the {prn}.update_status for a package based on security updates.
+ */
+function project_package_set_update_status($package_nid) {
+  $max = db_result(db_query("SELECT MAX(prn.update_status) FROM {project_release_nodes} prn INNER JOIN {project_package_local_release_item} pp ON prn.nid = pp.item_nid WHERE pp.package_nid = %d", $package_nid));
+  if ($max == PROJECT_RELEASE_UPDATE_STATUS_NOT_SECURE) {
+    // Something included in this package is insecure, so we are, too.
+    db_query("UPDATE {project_release_nodes} SET update_status = %d WHERE nid = %d", PROJECT_RELEASE_UPDATE_STATUS_NOT_SECURE, $package_nid);
+  }
+}
+
+/**
+ * Fix the {prn}.update_status column whenever the status changes on items.
+ */
+function project_package_check_update_status($item_nids) {
+  $affected_packages = array();
+  $placeholders = db_placeholders($item_nids);
+  $query = db_query("SELECT * FROM {project_package_local_release_item} WHERE item_nid IN ($placeholders) GROUP BY package_nid", $item_nids);
+  while ($package = db_fetch_object($query)) {
+    $affected_packages[] = $package->package_nid;
+  }
+  if (!empty($affected_packages)) {
+    $placeholders = db_placeholders($affected_packages);
+    db_query("UPDATE {project_release_nodes} SET update_status = %d WHERE nid IN ($placeholders)", array_merge(array(PROJECT_RELEASE_UPDATE_STATUS_NOT_SECURE), $affected_packages));
+  }
+}
+
cvs diff: Diffing package/views
cvs diff: Diffing package/views/default_views
