Index: release/project_release.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/release/project_release.module,v
retrieving revision 1.97
diff -u -F^f -u -F^f -r1.97 project_release.module
--- release/project_release.module	28 Jan 2009 17:20:17 -0000	1.97
+++ release/project_release.module	28 Jan 2009 23:04:11 -0000
@@ -240,6 +240,7 @@ function project_release_node_info() {
  * @ingroup project_release_node
  */
 function project_release_form($release, &$form_state) {
+
   if (arg(1) == 'add') {
     // Initialize variables and $release object properties to prevent notices.
     $is_edit = FALSE;
@@ -284,6 +285,24 @@ function project_release_form($release, 
     $format = project_release_get_version_format($project);
   }
 
+  $modify = $admin || !$is_edit;
+
+  // If we're in preview, assign the submitted values as the node values.
+  if (isset($form_state['node'])) {
+    $node = (object) $form_state['node'];
+    // Since these items can be conditionally disabled, we need to
+    // check for that and repopulate them with saved node values.
+    if (!$modify) {
+      $release_values = array(
+        'version_major', 'version_minor', 'version_patch', 'version_extra', 'tag', 'version'
+      );
+      foreach ($release_values as $field) {
+      	$node->project_release[$field] = $release->project_release[$field];
+      }
+    }
+    $release->project_release = $node->project_release;
+  }
+
   $form['#attributes'] = array("enctype" => "multipart/form-data");
 
   if ($is_edit) {
@@ -297,18 +316,21 @@ function project_release_form($release, 
   }
   _project_release_form_add_text_element($form['rel_id']['title'], t('Title'), $release->title, $is_edit, $admin, TRUE, 40, 128);
   _project_release_form_add_text_element($form['rel_id']['version'], t('Version string'), $release->project_release['version'], $is_edit, $admin, TRUE, 20, 255);
+  $form['rel_id']['version']['#parents'] = array('project_release', 'version');
 
-  $form['pid'] = array(
-    '#type' => 'value',
-    '#value' => $release->project_release['pid'],
-  );
-  $form['version']['num'] = array(
+  $form['project_release'] = array(
     '#type' => 'fieldset',
+    '#tree' => TRUE,
     '#title' => t('Version number elements'),
     '#collapsible' => TRUE,
     '#theme' => 'project_release_node_form_version_elements',
   );
-  $modify = $admin || !$is_edit;
+
+  $form['project_release']['pid'] = array(
+    '#type' => 'value',
+    '#value' => $release->project_release['pid'],
+  );
+
   $form['validate_version'] = array('#type' => 'hidden', '#value' => 1);
   _project_release_form_add_version_element($form, $release, $modify, $format, 'major', t('Major'));
   _project_release_form_add_version_element($form, $release, $modify, $format, 'minor', t('Minor'));
@@ -325,6 +347,11 @@ function project_release_form($release, 
   if (!empty($release->project_release['files'])) {
     $files = $release->project_release['files'];
     foreach ($files as $fid => $file) {
+      // In the case of previews, we only have the fid of the file,
+      // so check for that and load the file object if necessary.
+      if (is_numeric($file)) {
+        $file = project_release_load_file($file);
+      }
       $form['project_release_files'][$fid]['file_info'] = array(
         '#value' => theme('project_release_download_file', $file, FALSE),
       );
@@ -332,28 +359,53 @@ function project_release_form($release, 
         $form['project_release_files'][$fid]['delete'] = array(
           '#type' => 'checkbox',
           '#title' => t('Delete @filename', array('@filename' => $file->filename)),
+          '#default_value' => isset($release->project_release_files[$fid]['delete']) ? $release->project_release_files[$fid]['delete'] : 0,
           // TODO: we'll need to rip this out when multiple files lands.
           '#description' => (isset($files) ? t('In order to add a new file, you must first delete %filename.', array('%filename' => $file->filename)) : ''),
         );
       }
+      // Storing the fid here in the proper $node->project_release structure
+      // so it can be used to generate file previews.
+      $form['project_release']['files'][$fid] = array(
+        '#type' => 'hidden',
+        '#value' => $fid,
+      );
     }
   }
 
   // TODO: we'll need to rip out the conditional when multiple files lands.
   if (!isset($files)) {
+    // In case of previews, get any uploaded file info.
+    if (isset($form_state['project_release']['new_file'])) {
+      $new_file = $form_state['project_release']['new_file'];
+    }
+    elseif (isset($release->project_release_files['temp']) && $release->project_release_files['temp']) {
+      $new_file = db_fetch_object(db_query("SELECT * FROM {files} WHERE fid = %d", $release->project_release_files['temp']));
+    }
     $form['project_release_files']['file'] = array(
       '#title' => t('File'),
       '#type' => 'file',
       // TODO: fix the operator in this tenary.
-      '#description' => (FALSE ? t('A file named %filename has already been uploaded. If you upload another file %filename will be replaced.', array('%filename' => $file->filename)) : t('Choose a file that will be associated with this release.')),
+      '#description' => isset($new_file) ? t('A file named %filename has already been uploaded. If you upload another file %filename will be replaced.', array('%filename' => $new_file->filename)) : t('Choose a file that will be associated with this release.'),
     );
+    // Account for already uploaded files being previewed.
+    if (isset($new_file)) {
+      $form['project_release_files']['temp'] = array(
+        '#type' => 'hidden',
+        '#value' => $new_file->fid,
+      );
+    }
   }
 
   $form['body_field'] = node_body_field($release, t('Release notes'), !$admin);
   // Add a description to the body field.
   $form['body_field']['body']['#description'] = t('Enter a description of this release, such as a list of the major changes or updates.');
 
-  _project_release_form_add_text_element($form['tag']['tag'], t('Tag'), $release->project_release['tag'], $is_edit, $admin, TRUE, 40, 255);
+  $form['tag'] = array(
+    '#parents' => array('project_release'),
+  );
+  $tag = isset($release->project_release['tag']) ? $release->project_release['tag'] : '';
+  _project_release_form_add_text_element($form['tag']['tag'], t('Tag'), $tag, $is_edit, $admin, TRUE, 40, 255);
   $form['tag']['rebuild'] = array(
     '#type' => 'value',
     '#value' => !empty($release->project_release['rebuild']),
@@ -390,7 +442,7 @@ function _project_release_form_add_versi
   $var_name = 'version_'. $name;
   $regexp = "@.*[!#%]$name.*@";
   if (preg_match($regexp, $format)) {
-    $form['version']['num'][$var_name] = array(
+    $form['project_release'][$var_name] = array(
       '#type' => 'textfield',
       '#title' => $title,
       '#default_value' => $release->project_release[$var_name],
@@ -405,14 +457,14 @@ function _project_release_form_add_versi
       $form[$var_name]['#required'] = TRUE;
     }
     if ($description) {
-      $form['version']['num'][$var_name]['#description'] = $description;
+      $form['project_release'][$var_name]['#description'] = $description;
     }
     if (!$modify) {
-      $form['version']['num'][$var_name]['#attributes'] = array('disabled' => 'disabled');
+      $form['project_release'][$var_name]['#attributes'] = array('disabled' => 'disabled');
     }
   }
   else {
-    $form['version']['num'][$var_name] = array(
+    $form['project_release'][$var_name] = array(
       '#type' => 'value',
       '#value' => $release->project_release[$var_name],
     );
@@ -457,11 +509,12 @@ function _project_release_form_add_text_
     );
     if(!$admin) {
       $form['#attributes']['disabled'] = 'disabled';
+
     }
   }
   else {
     $form = array(
-      '#type' => 'value',
+      '#type' => 'hidden',
       '#value' => $value,
     );
   }
@@ -469,22 +522,23 @@ function _project_release_form_add_text_
 
 function project_release_node_form_validate(&$form, &$form_state) {
   global $user;
+  $project_release = $form_state['values']['project_release'];
   if (!empty($form_state['values']['validate_version'])) {
-    if (!isset($form_state['values']['version_major']) && !isset($form_state['values']['version_minor']) &&
-        !isset($form_state['values']['version_patch']) &&
-        (!($form_state['values']['version_extra']) || $form_state['values']['version_extra'] === '')) {
-      form_set_error('version_major', t('You must fill in some version information.'));
+    if (!isset($project_release['version_major']) && !isset($project_release['version_minor']) &&
+        !isset($project_release['version_patch']) &&
+        (!($project_release['version_extra']) || $project_release['version_extra'] === '')) {
+      form_set_error('project_release][version_major', t('You must fill in some version information.'));
       // TODO: find a better form value to mark as the error?
     }
     foreach (array('version_major' => t('Major version number'), 'version_minor' => t('Minor version number')) as $field => $name) {
-      $val = $form_state['values'][$field];
+      $val = $project_release[$field];
       if (isset($val) && $val !== '' && !is_numeric($val)) {
-        form_set_error($field, t('%name must be a number.', array('%name' => $name)));
+        form_set_error("project_release][$field", t('%name must be a number.', array('%name' => $name)));
       }
     }
-    $val = $form_state['values']['version_patch'];
+    $val = $project_release['version_patch'];
     if (isset($val) && $val !== '' && !is_numeric($val) && $val != 'x') {
-      form_set_error('version_patch', t("Patch-level version number must be numeric or the letter 'x'."));
+      form_set_error('project_release][version_patch', t("Patch-level version number must be numeric or the letter 'x'."));
     }
   }
 
@@ -496,10 +550,7 @@ function project_release_node_form_valid
   // #tree'd, the uploaded file shows up in 'project_release_files'
   // and not it's sub-element, so we use that here.
   if ($file = file_save_upload('project_release_files', $validators, file_directory_path() . '/project')) {
-    // We need the file object and filehash for the submit function,
-    // so pass those into $form_state here.
-    $filepath = file_create_path($file->filepath);
-    $file->filehash = md5_file($filepath);
+    // We need the file object, so pass that into $form_state here.
     $form_state['project_release']['new_file'] = $file;
   }
 
@@ -508,8 +559,8 @@ function project_release_node_form_valid
     if (isset($form_state['values']['taxonomy'])) {
       $tid = $form_state['values']['taxonomy'][$vid];
     }
-    elseif (isset($form_state['values']['$vid'])) {
-      $tid = $form_state['values']['$vid'];
+    elseif (isset($form_state['values'][$vid])) {
+      $tid = $form_state['values'][$vid];
     }
     if (isset($tid) && is_numeric($tid)) {
       $form_state['values']['version_api_tid'] = $tid;
@@ -518,11 +569,11 @@ function project_release_node_form_valid
 
   // With cvs.module installed, this validation is already handled.
   // We only want to do it here if we're *not* doing the N-page form...
-  if (!project_use_cvs($form_state['values']['pid']) && !isset($form_state['values']['nid'])) {
-    $version = (object)$form_state['values'];
+  if (!project_use_cvs($project_release['pid']) && !isset($form_state['values']['nid'])) {
+    $version = (object) $project_release;
     if (project_release_exists($version)) {
       // TODO: is there a better form element to mark with this error?
-      form_set_error('version_patch', t('This version already exists for this project.'));
+      form_set_error('project_release][version_patch', t('This version already exists for this project.'));
     }
   }
 
@@ -535,18 +586,18 @@ function project_release_node_form_valid
   if (isset($project->project['uri'])) {
     $project_name = $project->project['uri'];
   }
-  elseif (isset($form_state['values']['pid'])) {
-    $project_name = db_result(db_query("SELECT uri FROM {project_projects} WHERE nid = %d", $form_state['values']['pid']));
+  elseif (isset($project_release['pid'])) {
+    $project_name = db_result(db_query("SELECT uri FROM {project_projects} WHERE nid = %d", $form_state['values']['project_release']['pid']));
   }
   if (isset($form_state['values']['title'])) {
     // TODO: Magic re-setting to "%project_name %version" ??
   }
-  elseif (isset($form_state['values']['version']) && $form_state['values']['version'] !== '') {
-    form_set_value($form['title'], $project_name .' '. $form_state['values']['version'], $form_state);
+  elseif (isset($project_release['version']) && $project_release['version'] !== '') {
+    form_set_value($form['title'], $project_name .' '. $project_release['version'], $form_state);
   }
   elseif (!empty($project)) {
-    $version = project_release_get_version((object)$form_state['values'], $project);
-    form_set_value(array('#parents' => array('version')), $version, $form_state);
+    $version = project_release_get_version((object) $project_release, $project);
+    form_set_value(array('#parents' => array('project_release', 'version')), $version, $form_state);
     $title = $project->title;
     form_set_value($form['title'], "$title $version", $form_state);
   }
@@ -567,8 +618,20 @@ function project_release_validate_file_e
 function project_release_node_submit(&$form, $form_state) {
   // Get rid of the file upload item, not needed.
   unset($form_state['values']['project_release_files']['file']);
+  // Look for newly uploaded files.
+  if (isset($form_state['project_release']['new_file'])) {
+    $new_file = $form_state['project_release']['new_file'];
+  }
+  elseif (isset($form_state['values']['project_release_files']['temp'])) {
+    if ($temp = $form_state['values']['project_release_files']['temp']) {
+      // Have to ensure the temp file hasn't been wiped from the files table.
+      if ($temp_file = db_fetch_object(db_query("SELECT * FROM {files} WHERE fid = %d", $temp))) {
+        $new_file = $temp_file;
+      }
+    }
+    unset($form_state['values']['project_release_files']['temp']);
+  }
   $existing_files = !empty($form_state['values']['project_release_files']) ? $form_state['values']['project_release_files'] : NULL;
-  $new_file = isset($form_state['project_release']['new_file']) ? $form_state['project_release']['new_file'] : NULL;
 
   if (isset($existing_files)) {
     foreach ($existing_files as $fid => $values) {
@@ -582,7 +645,9 @@ function project_release_node_submit(&$f
   if (isset($new_file)) {
     $status_updated = file_set_status($new_file, FILE_STATUS_PERMANENT);
     if ($status_updated) {
-      $new_file->nid = $form_state['values']['nid'];
+      $new_file->nid = $form_state['nid'];
+      $filepath = file_create_path($new_file->filepath);
+      $new_file->filehash = md5_file($filepath);
       drupal_write_record('project_release_file', $new_file);
     }
   }
@@ -670,29 +735,29 @@ function project_release_update($node) {
 function project_release_db_save($node, $is_new) {
   // If the patch field is set to a non-numeric value, we just want to
   // keep it as a NULL in the DB, instead of casting it to a 0.
-  if (isset($node->version_patch) && !is_numeric($node->version_patch)) {
-    unset($node->version_patch);
+  if (isset($node->project_release['version_patch']) && !is_numeric($node->project_release['version_patch'])) {
+    unset($node->project_release['version_patch']);
   }
 
   $types = array('pid' => "%d", 'version' => "'%s'", 'tag' => "'%s'",
     'rebuild' => "%d",
   );
   $values = array(
-    'pid' => $node->pid,
-    'version' => $node->version,
-    'tag' => $node->tag,
-    'rebuild' => $node->rebuild,
+    'pid' => $node->project_release['pid'],
+    'version' => $node->project_release['version'],
+    'tag' => $node->project_release['tag'],
+    'rebuild' => $node->project_release['rebuild'],
   );
   $fields = array('version_major', 'version_minor', 'version_patch');
   foreach ($fields as $field) {
-    if (isset($node->$field) && is_numeric($node->$field)) {
+    if (isset($node->project_release[$field]) && is_numeric($node->project_release[$field])) {
       $types[$field] = "%d";
-      $values[$field] = $node->$field;
+      $values[$field] = $node->project_release[$field];
     }
   }
-  if (!empty($node->version_extra)) {
+  if (!empty($node->project_release['version_extra'])) {
     $types['version_extra'] = "'%s'";
-    $values['version_extra'] = $node->version_extra;
+    $values['version_extra'] = $node->project_release['version_extra'];
   }
 
   if ($is_new) {
@@ -923,10 +988,19 @@ function project_release_view($node, $te
     $output .= '<small>'. t('First released: !created', array('!created' => format_date($node->created))) .'</small><br />';
   }
   if (!empty($node->project_release['files'])) {
-    foreach ($node->project_release['files'] as $file) {
-      $output .= '<div class="project-release-download-file">';
-      $output .= theme('project_release_download_file', $file);
-      $output .= '</div>';
+    foreach ($node->project_release['files'] as $fid => $file) {
+      // In the case of previews, we only have the fid of the file,
+      // so check for that and load the file object if necessary.
+      if (is_numeric($file)) {
+        $file = project_release_load_file($file);
+      }
+      // In the case of previews, if the file has been marked for deletion,
+      // then don't display.
+      if (!(isset($node->project_release_files) && $node->project_release_files[$fid]['delete'])) {
+        $output .= '<div class="project-release-download-file">';
+        $output .= theme('project_release_download_file', $file);
+        $output .= '</div>';
+      }
     }
   }
 
@@ -959,6 +1033,10 @@ function project_release_view($node, $te
   return $node;
 }
 
+function project_release_load_file($fid) {
+  return db_fetch_object(db_query("SELECT f.*, prf.filehash FROM {project_release_file} prf INNER JOIN {files} f ON prf.fid = f.fid WHERE f.fid = %d", $fid));
+}
+
 function theme_project_release_download_file($file, $download_link = TRUE) {
   $output = '';
   if ($download_link) {
