Index: modules/project/release/project_release.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/project/release/project_release.module,v retrieving revision 1.1.2.43 diff -u -p -r1.1.2.43 project_release.module --- modules/project/release/project_release.module 3 Dec 2006 02:25:46 -0000 1.1.2.43 +++ modules/project/release/project_release.module 5 Dec 2006 08:36:33 -0000 @@ -38,6 +38,12 @@ function project_release_menu($may_cache $items[] = array('path' => 'node/'. arg(1) .'/release', 'title' => t('releases'), 'callback' => 'project_release_project_releases', 'access' => node_access('view', $node), 'weight' => 0, 'type' => MENU_CALLBACK); if (node_access('update', $node)) { $items[] = array('path' => 'node/'. arg(1) .'/release/overview', 'title' => t('overview'), 'callback' => 'project_release_project_releases', 'access' => node_access('view', $node), 'weight' => 0, 'type' => MENU_CALLBACK); + $items[] = array( + 'path' => 'node/'. arg(1) .'/edit/releases', + 'title' => t('releases'), + 'callback' => 'project_release_project_edit_releases', + 'weight' => 0, 'type' => MENU_LOCAL_TASK, + ); } } } @@ -548,6 +554,19 @@ function project_release_db_save($node, } $values['nid'] = $node->nid; db_query($sql, $values); + + // If this is the first release for a given compatibility term, add + // a record into the {project_release_default_versions} table. + if ($is_new && module_exist('taxonomy')) { + $vid = _project_release_get_api_vid(); + if (isset($node->taxonomy[$vid])) { + $tid = $node->taxonomy[$vid]; + $has_default = db_result(db_query("SELECT COUNT(*) FROM {project_release_default_versions} WHERE nid = %d AND tid = %d", $node->pid, $tid)); + if (!$has_default) { + db_query("INSERT INTO {project_release_default_versions} (nid, tid, major) VALUES (%d, %d, %d)", $node->pid, $tid, $node->version_major); + } + } + } } /** @@ -817,14 +836,26 @@ function project_release_form_alter($for * @see project_release_form_alter */ function project_release_alter_project_form(&$form) { - $node = $form['#node']; - $form['release'] = array( + $form['project']['uri']['#description'] .= ' '. t("This string is also used to generate the name of releases associated with this project."); +} + +/** + * Releases subtab for the project edit tab. + */ +function project_release_project_edit_releases() { + $node = node_load(arg(1)); + project_project_set_breadcrumb($node); + drupal_set_title(check_plain($node->title)); + + $form['advanced'] = array( '#type' => 'fieldset', - '#title' => t('Release information'), + '#title' => t('Advanced options'), '#collapsible' => TRUE, '#collapsed' => TRUE, + '#weight' => 5, ); - $form['release']['releases'] = array( + + $form['advanced']['releases'] = array( '#type' => 'checkbox', '#title' => t('Enable releases'), '#return_value' => 1, @@ -832,46 +863,148 @@ function project_release_alter_project_f '#default_value' => isset($node->releases) ? $node->releases : 1, '#description' => t('Allow releases of this project with specific versions.'), ); - if ($releases = project_release_get_releases($node, false, 'version', 'files')) { - $form['release']['version'] = array( - '#type' => 'select', - '#title' => t('Default version'), - '#default_value' => $node->version, - '#options' => $releases, - '#description' => t('Default version for downloading.'), - ); + if ($node->releases) { + $releases = array(); + if ($tree = project_release_get_api_taxonomy()) { + $query = db_query('SELECT tid, major FROM {project_release_default_versions} WHERE nid = %d', $node->nid); + $node->default_versions = array(); + while ($version = db_fetch_object($query)) { + $tid = $version->tid; + $major = $version->major; + $node->default_versions[$tid] = $major; + } + $result = db_query(db_rewrite_sql("SELECT n.nid, tn.tid, td.name, r.* FROM {node} n INNER JOIN {project_release_nodes} r ON r.nid = n.nid INNER JOIN {term_node} tn ON tn.nid = r.nid INNER JOIN {term_data} td ON tn.tid = td.tid WHERE (r.pid = %d) AND (n.status = 1) AND (r.file_path <> '') ORDER BY tn.tid, r.rebuild, r.version_major DESC, r.version_minor DESC, r.version_patch DESC, r.file_date DESC"), $node->nid); + while ($rel = db_fetch_object($result)) { + $tid = $rel->tid; + $major = $rel->version_major; + if (isset($major)) { + $releases[$tid]['majors'][$major] = $major; + } + $releases[$tid]['name'] = $rel->name; + if (!isset($releases[$tid]['current']) && $node->default_versions[$tid] == $major) { + $releases[$tid]['current'] = $rel->version; + } + } + $form['default_versions'] = array('#tree' => TRUE); + foreach ($tree as $term) { + $tid = $term->tid; + if (isset($releases[$tid])) { + $form['default_versions'][$tid] = array(); + if (count($releases[$tid]['majors']) > 1) { + $form['default_versions'][$tid]['major'] = array( + '#title' => t('Major version'), + '#type' => 'select', + '#options' => $releases[$tid]['majors'], + '#default_value' => isset($node->default_versions[$tid]) ? $node->default_versions[$tid] : 1, + ); + } + else { + $form['default_versions'][$tid]['major'] = array( + '#type' => 'value', + '#value' => current($releases[$tid]['majors']), + ); + } + $form['default_versions'][$tid]['current_release'] = array( + '#type' => 'value', + '#value' => $releases[$tid]['current'], + ); + $form['default_versions'][$tid]['name'] = array( + '#type' => 'value', + '#value' => $releases[$tid]['name'], + ); + } + } + } + + if (user_access('administer projects')) { + $form['advanced']['version_format'] = array( + '#type' => 'textfield', + '#title' => t('Version format string'), + '#default_value' => $node->version_format, + '#size' => 50, + '#maxlength' => 255, + '#description' => t('Customize the format of the version strings for releases of this project.') .' '. PROJECT_RELEASE_VERSION_FORMAT_HELP .' '. t('If blank, this project will use the site-wide default (currently set to: %default)', array('%default' => theme('placeholder', variable_get('project_release_default_version_format', PROJECT_RELEASE_DEFAULT_VERSION_FORMAT)))), + ); + $form['#validate'] = array_merge($form['#validate'], array('project_release_project_edit_form_validate' => array())); + } } - $form['project']['uri']['#description'] .= ' '. t("This string is also used to generate the name of releases associated with this project."); + $form['nid'] = array('#type' => 'value', '#value' => $node->nid); + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Submit'), + '#weight' => 45, + ); - // TODO: disable this form element if the "Enable releases" checkbox - // is not checked? - if (user_access('administer projects')) { - $form['release']['version_format'] = array( - '#type' => 'textfield', - '#title' => t('Version format string'), - '#default_value' => $node->version_format, - '#size' => 50, - '#maxlength' => 255, - '#description' => t('Customize the format of the version strings for releases of this project.') .' '. PROJECT_RELEASE_VERSION_FORMAT_HELP .' '. t('If blank, this project will use the site-wide default (currently set to: %default)', array('%default' => theme('placeholder', variable_get('project_release_default_version_format', PROJECT_RELEASE_DEFAULT_VERSION_FORMAT)))), + return drupal_get_form('project_release_project_edit_form', $form); +} + +function theme_project_release_project_edit_form($form) { + $output = ''; + $rows = array(); + if ($vocab = taxonomy_get_vocabulary(_project_release_get_api_vid())) { + $header = array( + check_plain($vocab->name), + t('Major version'), + t('Current release'), ); - $form['#validate'] = array_merge($form['#validate'], array('project_release_project_form_validate' => array())); } + foreach (element_children($form['default_versions']) as $tid) { + $row = array(); + $row[] = check_plain($form['default_versions'][$tid]['name']['#value']); + unset($form['default_versions'][$tid]['major']['#title']); + if ($form['default_versions'][$tid]['major']['#type'] == 'select') { + $row[] = form_render($form['default_versions'][$tid]['major']); + } + else { + $row[] = check_plain($form['default_versions'][$tid]['major']['#value']); + } + $row[] = check_plain($form['default_versions'][$tid]['current_release']['#value']); + $rows[] = $row; + } + if (count($rows)) { + $output .= '