cvs diff: Diffing release Index: release/project_release.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/project/release/project_release.install,v retrieving revision 1.15 diff -u -p -r1.15 project_release.install --- release/project_release.install 22 Dec 2007 09:11:44 -0000 1.15 +++ release/project_release.install 26 Dec 2007 21:29:39 -0000 @@ -25,16 +25,18 @@ function project_release_install() { db_query("CREATE TABLE IF NOT EXISTS {project_release_projects} ( nid int unsigned NOT NULL default '0', releases tinyint NOT NULL default '1', - snapshot_table tinyint unsigned NOT NULL default '1', version_format varchar(255) NOT NULL default '', PRIMARY KEY (nid), KEY project_release_projects_releases (releases) ) /*!40100 DEFAULT CHARACTER SET utf8 */;"); - db_query("CREATE TABLE IF NOT EXISTS {project_release_default_versions} ( + db_query("CREATE TABLE IF NOT EXISTS {project_release_supported_versions} ( nid int unsigned NOT NULL default '0', tid int unsigned NOT NULL default '0', major int unsigned NOT NULL default '0', - PRIMARY KEY (nid, tid) + supported tinyint unsigned NOT NULL default '1', + recommended tinyint unsigned NOT NULL default '0', + snapshot tinyint unsigned NOT NULL default '0', + PRIMARY KEY (nid, tid, major) ) /*!40100 DEFAULT CHARACTER SET utf8 */;"); db_query("CREATE TABLE IF NOT EXISTS {project_release_package_errors} ( nid int unsigned NOT NULL default '0', @@ -75,18 +77,20 @@ function project_release_install() { db_query("CREATE TABLE {project_release_projects} ( nid int NOT NULL default '0', releases smallint NOT NULL default '1', - snapshot_table smallint NOT NULL default '1', version_format varchar(255) NOT NULL default '', PRIMARY KEY (nid) );"); db_query("CREATE INDEX {project_release_projects}_releases_idx ON {project_release_projects} (releases)"); } - if (!db_table_exists('project_release_default_versions')) { - db_query("CREATE TABLE {project_release_default_versions} ( + if (!db_table_exists('project_release_supported_versions')) { + db_query("CREATE TABLE {project_release_supported_versions} ( nid int NOT NULL default '0', tid int NOT NULL default '0', major int NOT NULL default '0', - PRIMARY KEY (nid, tid) + supported smallint NOT NULL default '1', + recommended smallint NOT NULL default '0', + snapshot smallint NOT NULL default '0', + PRIMARY KEY (nid, tid, major) );"); } if (!db_table_exists('project_release_package_errors')) { @@ -296,3 +300,56 @@ function project_release_update_5003() { } return $ret; } + +/** + * Add the new {project_release_supported_versions} table, transfer data + * from {project_release_default_versions} and {project_release_projects}, + * and drop the stale table and columns. + */ +function project_release_update_5200() { + $ret = array(); + switch ($GLOBALS['db_type']) { + case 'mysql': + case 'mysqli': + $ret[] = update_sql("CREATE TABLE IF NOT EXISTS {project_release_supported_versions} ( + nid int unsigned NOT NULL default '0', + tid int unsigned NOT NULL default '0', + major int unsigned NOT NULL default '0', + supported tinyint unsigned NOT NULL default '1', + recommended tinyint unsigned NOT NULL default '0', + snapshot tinyint unsigned NOT NULL default '0', + PRIMARY KEY (nid, tid, major) + ) /*!40100 DEFAULT CHARACTER SET utf8 */;"); + break; + case 'pgsql': + if (!db_table_exists('project_release_supported_versions')) { + $ret[] = update_sql("CREATE TABLE {project_release_supported_versions} ( + nid int NOT NULL default '0', + tid int NOT NULL default '0', + major int NOT NULL default '0', + supported smallint NOT NULL default '1', + recommended smallint NOT NULL default '0', + snapshot smallint NOT NULL default '0', + PRIMARY KEY (nid, tid, major) + );"); + } + break; + } + // Now, populate the table with the existing data. First, populate all the + // recommended majors versions from {project_release_default_versions}. + $ret[] = update_sql("INSERT INTO {project_release_supported_versions} (nid, tid, major, supported, recommended, snapshot) SELECT prdv.nid, prdv.tid, prdv.major, 1, 1, prp.snapshot_table FROM {project_release_default_versions} prdv INNER JOIN {project_release_projects} prp ON prdv.nid = prp.nid"); + + // Now, fill in all the non-recommended versions. For the migration path, we + // assume that if it's not recommended, it's also not supported. Project + // maintainers will have to manually visit the new UI if they want to + // specify multiple supported versions. + $vid = _project_release_get_api_vid(); + $ret[] = update_sql("INSERT INTO {project_release_supported_versions} (nid, tid, major, supported, recommended, snapshot) SELECT DISTINCT prn.pid, tn.tid, prn.version_major, 0, 0, prp.snapshot_table FROM {project_release_nodes} prn INNER JOIN {project_release_projects} prp ON prn.pid = prp.nid INNER JOIN {term_node} tn ON prn.nid = tn.nid INNER JOIN {term_data} td ON tn.tid = td.tid INNER JOIN {node} n ON prn.nid = n.nid LEFT JOIN {project_release_default_versions} prdv ON prdv.nid = prn.pid AND prdv.tid = tn.tid AND prdv.major = prn.version_major WHERE n.status = 1 AND td.vid = $vid AND prn.version_major IS NOT NULL AND prdv.major IS NULL"); + + // Finally, drop the stale table and column. + // While testing the upgrade path, these are both commented out for now: + //$ret[] = update_sql('DROP TABLE {project_release_default_versions}'); + //$ret[] = update_sql("ALTER TABLE {project_release_projects} DROP snapshot_table"); + + return $ret; +} Index: release/project_release.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/project/release/project_release.module,v retrieving revision 1.55 diff -u -p -r1.55 project_release.module --- release/project_release.module 21 Oct 2007 19:45:45 -0000 1.55 +++ release/project_release.module 26 Dec 2007 21:29:40 -0000 @@ -1023,7 +1023,75 @@ function project_release_project_edit_re return drupal_get_form('project_release_project_edit_form', $node); } + function project_release_project_edit_form($node) { + $data = _project_release_project_edit_form_getdef($node); + return _project_release_project_edit_form_formdef($data); +} + +function _project_release_project_edit_form_getdef($node) { + $data = array(); + $data[102] = array( + 'name' => '4.6.x', + 'majors' => array( + 1 => array('#recommended' => TRUE, '#supported' => TRUE), + ), + ); + $data[103] = array( + 'name' => '4.7.x', + 'majors' => array( + 1 => array('#recommended' => TRUE, '#supported' => TRUE), + ), + ); + $data[104] = array( + 'name' => '5.x', + 'majors' => array( + 1 => array('#recommended' => FALSE, '#supported' => FALSE), + 2 => array('#recommended' => FALSE, '#supported' => TRUE), + 3 => array('#recommended' => TRUE, '#supported' => TRUE), + ), + ); + $data[105] = array( + 'name' => '6.x', + 'majors' => array( + 1 => array('#recommended' => TRUE, '#supported' => TRUE), + ), + ); + + $data['node'] = $node; + + return $data; +} + +function _project_release_project_edit_form_formdef($data) { + $form = array(); + + $node = $data['node']; + unset($data['node']); + + foreach ($data as $core_tid => $core_data) { + $form['cores'][$core_tid] = array( + '#core_name' => $core_data['name'], + ); + $recommended_version = -1; + foreach ($core_data['majors'] as $major_version => $major_data) { + if ($major_data['#supported'] == TRUE) { + $recommended_version = $major_version; + } + $form['cores'][$core_tid]['major'][$major_version]['supported'] = array( + '#type' => 'checkbox', + '#title' => t('Supported'), + '#default_value' => $major_data['#supported'], + ); + } + $form['cores'][$core_tid]['recommended'] = array( + '#type' => 'radios', + '#title' => t('Recommended'), + '#options' => array_keys($core_data['majors']), + '#default_value' => $recommended_version, + ); + } + $form['advanced'] = array( '#type' => 'fieldset', '#title' => t('Advanced options'), @@ -1040,121 +1108,49 @@ function project_release_project_edit_fo '#default_value' => isset($node->releases) ? $node->releases : 1, '#description' => t('Allow releases of this project with specific versions.'), ); - 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']) && (!isset($node->default_versions[$tid]) || $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', - '#theme' => 'project_release_form_value', - '#value' => is_array($releases[$tid]['majors']) ? current($releases[$tid]['majors']) : '', - ); - } - $form['default_versions'][$tid]['current_release'] = array( - '#type' => 'value', - '#theme' => 'project_release_form_value', - '#value' => $releases[$tid]['current'], - ); - $form['default_versions'][$tid]['name'] = array( - '#type' => 'value', - '#theme' => 'project_release_form_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' => variable_get('project_release_default_version_format', PROJECT_RELEASE_DEFAULT_VERSION_FORMAT))), - ); - } - $vocab = taxonomy_get_vocabulary(_project_release_get_api_vid()); - $vocab = isset($vocab) ? theme('placeholder', $vocab->name) : t('version'); - $form['snapshot_table'] = array( - '#type' => 'checkbox', - '#title' => t('Display snapshot releases on project page'), - '#return_value' => 1, - '#default_value' => isset($node->snapshot_table) ? $node->snapshot_table : 1, - '#description' => t('Note: Even if the current default release for a given !vocabulary_name is a development snapshot, it will only be shown if this checkbox is enabled.', array('!vocabulary_name' => $vocab)), + + 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' => variable_get('project_release_default_version_format', PROJECT_RELEASE_DEFAULT_VERSION_FORMAT))), ); } - + $form['nid'] = array('#type' => 'value', '#value' => $node->nid); $form['submit'] = array( '#type' => 'submit', '#value' => t('Submit'), '#weight' => 45, ); - + return $form; } + function theme_project_release_form_value($element) { return check_plain($element['#value']); } 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 default release'), - ); - } - foreach (element_children($form['default_versions']) as $tid) { - $row = array(); - $row[] = drupal_render($form['default_versions'][$tid]['name']); - unset($form['default_versions'][$tid]['major']['#title']); - $row[] = drupal_render($form['default_versions'][$tid]['major']); - $row[] = drupal_render($form['default_versions'][$tid]['current_release']); - $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 to download for any given %vocabulary_name. If there are releases from more than one major version number, you can select which major version should be used. For each %vocabulary_name, the current default release based on the saved major version is shown. If no official releases have been made, the development snapshot from the corresponding branch will be listed. Otherwise, the most recent official release is used.', array('%vocabulary_name' => $vocab->name)) ."
\n"; + + foreach ($form['cores'] as $core_tid => $core) { + $output .= '

'. $core['#core_name'] .'

'; + $cells = array(); + foreach (element_children($form['cores'][$core_tid]) as $key) { + $cell = array(); + $cell[] = $key; + $cell[] = drupal_render($form['cores'][$core_tid]['major'][$key]['supported']); + $cells[] = $cell; + } + $output .= theme('table', array(t('Major version', 'Supported')), $cells); } - $output .= drupal_render($form['snapshot_table']); + unset($form['cores']); + $output .= drupal_render($form['advanced']); $output .= drupal_render($form); return $output;