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 .= '

'. t('Default versions') .'

'; + $output .= theme('table', $header, $rows); + $output .= '
'. t('This table allows you to specify the default version for any given %vocabulary_name. For both the release series (major version) and release type, if there are more than option, you can select which one should be used. For each series, the current default release based on the saved filters is shown.', array('%vocabulary_name' => theme('placeholder', $vocab->name))) ."
\n"; + } + $output .= form_render($form['advanced']); + $output .= form_render($form); + return $output; } /** * Validates the project form regarding release-specific fields. * Ensures that the version format string doesn't contain bad characters. * @ingroup project_release_fapi - * @see project_release_alter_project_form + * @see project_release_project_edit_releases */ -function project_release_project_form_validate($form_id, $form_values, $form) { +function project_release_project_edit_form_validate($form_id, $form_values, $form) { if (!empty($form_values['version_format'])) { _project_release_validate_format_string($form_values, 'version_format'); } } /** + * Submit handler when project admins use the releases subtab. + * @ingroup project_release_fapi + * @see project_release_project_edit_releases + */ +function project_release_project_edit_form_submit($form_id, $form_values) { + db_query("UPDATE {project_release_projects} SET releases = %d, version_format = '%s' WHERE nid = %d", $form_values['releases'], $form_values['version_format'], $form_values['nid']); + + foreach ($form_values['default_versions'] as $tid => $values) { + if ($obj = db_fetch_object(db_query("SELECT * FROM {project_release_default_versions} WHERE nid = %d AND tid = %d", $form_values['nid'], $tid))) { + if ($obj->major != $values['major']) { + db_query("UPDATE {project_release_default_versions} SET major = %d WHERE nid = %d AND tid = %d", $values['major'], $form_values['nid'], $tid); + } + } + else { + db_query("INSERT INTO {project_release_default_versions} (nid, tid, major) VALUES (%d, %d, %d)", $form_values['nid'], $tid, $values['major']); + } + } +} + +/** * Alters the project_release node form to handle the API taxonomy. * If the vocabulary is empty, this removes the form elements. * @ingroup project_release_fapi @@ -903,9 +1036,9 @@ function project_release_alter_release_f $options[$tid] = $form['taxonomy'][$vid]['#options'][$tid]; $form['taxonomy'][$vid]['#default_value'] = $tid; } - elseif ($tids = variable_get('project_release_active_compatibility_tids', '')) { + elseif ($tids = variable_get('project_release_active_compatibility_tids', '')) { // We don't have the term since we're adding a new release. - // Restrict to the active terms (if any). + // Restrict to the active terms (if any). foreach ($form['taxonomy'][$vid]['#options'] as $tid => $name) { if ($tid && $tids[$tid]) { $options[$tid] = check_plain($name); @@ -914,11 +1047,11 @@ function project_release_alter_release_f if (!empty($options)) { $options = array(0 => $form['taxonomy'][$vid]['#options'][0]) + $options; } - } + } if (!empty($options)) { $form['taxonomy'][$vid]['#options'] = $options; } - else { + else { unset($form['taxonomy'][$vid]); } } @@ -963,14 +1096,19 @@ function project_release_project_nodeapi foreach (array('releases', 'version_format') as $field) { $node->$field = $project->$field; } +/* + $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; + } +*/ break; case 'insert': - db_query("INSERT INTO {project_release_projects} (nid, releases, version_format) VALUES (%d, %d, '%s')", $node->nid, $node->releases, $node->version_format); - break; - - case 'update': - db_query("UPDATE {project_release_projects} SET releases = %d, version_format = '%s' WHERE nid = %d", $node->releases, $node->version_format, $node->nid); + db_query("INSERT INTO {project_release_projects} (nid, releases, version_format) VALUES (%d, %d, '%s')", $node->nid, 1, ''); break; case 'delete': Index: modules/project/release/project_release.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/project/release/project_release.install,v retrieving revision 1.1.2.10 diff -u -p -r1.1.2.10 project_release.install --- modules/project/release/project_release.install 12 Nov 2006 13:52:35 -0000 1.1.2.10 +++ modules/project/release/project_release.install 5 Dec 2006 08:36:33 -0000 @@ -1,34 +1,41 @@