cvs diff: Diffing modules/signup_status_limit Index: modules/signup_status_limit/README.txt =================================================================== RCS file: modules/signup_status_limit/README.txt diff -N modules/signup_status_limit/README.txt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/signup_status_limit/README.txt 16 Sep 2009 10:58:55 -0000 @@ -0,0 +1,38 @@ +$Id: README.txt,v 1.1 2009/08/17 23:16:09 dww Exp $ + +=== SUMMARY === + +The Signup Status Limit submodule allows you to limit the number of +signups for each status on any given node. On each node, you can +select if you want to use a global limit across all status values, or +to use per-status limits. + + +=== DETAILS === + +// TODO + + +=== UPGRADING FROM DRUPAL 5 === + +// TODO + + +=== SUPPORT === + +Bug reports, feature requests and support questions should use the +"Signup status limit" component in the Signup status issue queue on +drupal.org: + +http://drupal.org/project/issues/signup_status + + +=== CREDITS === + +In Drupal 5, some of this functionality existed directly inside the +signup_status module, which was written by Jeffery Beeman +(http://drupal.org/user/16734 -- "jrbeeman"). + +The Drupal 6 version was a complete rewrite by Derek Wright +(http://drupal.org/user/46549 -- "dww"). + Index: modules/signup_status_limit/signup_status_limit.info =================================================================== RCS file: modules/signup_status_limit/signup_status_limit.info diff -N modules/signup_status_limit/signup_status_limit.info --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/signup_status_limit/signup_status_limit.info 16 Sep 2009 10:58:55 -0000 @@ -0,0 +1,6 @@ +; $Id$ +name = "Signup Status Limit" +description = "Limit the number of signups for each signup status." +dependencies[] = signup_status +core = 6.x + Index: modules/signup_status_limit/signup_status_limit.install =================================================================== RCS file: modules/signup_status_limit/signup_status_limit.install diff -N modules/signup_status_limit/signup_status_limit.install --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/signup_status_limit/signup_status_limit.install 16 Sep 2009 10:58:55 -0000 @@ -0,0 +1,139 @@ + t('Signup status per-node limits'), + 'fields' => array( + 'nid' => array( + 'description' => 'Foreign key: {node}.nid of the node with the limits', + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + ), + 'cid' => array( + 'description' => 'Foreign key: {signup_status_codes}.cid of the status', + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + ), + 'status_limit' => array( + 'description' => 'The limit for this node and status', + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + ), + ), + 'primary key' => array('nid, cid'), + ); + $schema['signup_status_limit_node_setting'] = array( + 'description' => t('Signup status per-node limit settings'), + 'fields' => array( + 'nid' => array( + 'description' => 'Primary key: {node}.nid of the node to hold settings for', + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + ), + 'limit_type' => array( + 'description' => "The kind of signup limits in effect for this node (can be either 'status' for per-status limits, or 'global')", + 'type' => 'varchar', + 'length' => 32, + 'not null' => TRUE, + 'default' => 'global', + ), + ), + 'primary key' => array('nid'), + ); + return $schema; +} + +/** + * Add the new DB tables (and migrate data) for sites upgrading from D5. + */ +function signup_status_limit_update_6000() { + $ret = array(); + $schema['signup_status_limit_node_limit'] = array( + 'description' => t('Signup status per-node limits'), + 'fields' => array( + 'nid' => array( + 'description' => 'Foreign key: {node}.nid of the node with the limits', + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + ), + 'cid' => array( + 'description' => 'Foreign key: {signup_status_codes}.cid of the status', + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + ), + 'status_limit' => array( + 'description' => 'The limit for this node and status', + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + ), + ), + 'primary key' => array('nid, cid'), + ); + $schema['signup_status_limit_node_setting'] = array( + 'description' => t('Signup status per-node limit settings'), + 'fields' => array( + 'nid' => array( + 'description' => 'Primary key: {node}.nid of the node to hold settings for', + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + ), + 'limit_type' => array( + 'description' => "The kind of signup limits in effect for this node (can be either 'status' for per-status limits, or 'global')", + 'type' => 'varchar', + 'length' => 32, + 'not null' => TRUE, + 'default' => 'global', + ), + ), + 'primary key' => array('nid'), + ); + + foreach ($schema as $table_name => $table) { + db_create_table($ret, $table_name, $table); + } + + // TODO populate values based on {signup_status_node_limits} if it exists. + + return $ret; +} + Index: modules/signup_status_limit/signup_status_limit.module =================================================================== RCS file: modules/signup_status_limit/signup_status_limit.module diff -N modules/signup_status_limit/signup_status_limit.module --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/signup_status_limit/signup_status_limit.module 16 Sep 2009 10:58:55 -0000 @@ -0,0 +1,71 @@ + array( + 'file' => 'signup_status_limit.settings.inc', + 'arguments' => array( + 'form' => NULL, + ), + ), + ); +} + +/** + * Implement hook_nodeapi(). + */ +function signup_status_limit_nodeapi(&$node, $op, $arg) { + switch ($op) { + case 'delete': + return signup_status_limit_nodeapi_delete($node); + + case 'load': + return signup_status_limit_nodeapi_load($node); + + } +} + +/** + * When a node is deleted, remove any rows in {signup_status_limit_*} tables. + */ +function signup_status_limit_nodeapi_delete($node) { + db_query("DELETE FROM {signup_status_limit_node_limit} WHERE nid = %d", $node->nid); + db_query("DELETE FROM {signup_status_limit_node_setting} WHERE nid = %d", $node->nid); +} + +/** + * When a node is loaded, add the signup status limit settings. + */ +function signup_status_limit_nodeapi_load($node) { + $query = db_query("SELECT cid, status_limit FROM {signup_status_limit_node_limit} WHERE nid = %d", $node->nid); + while ($limit = db_fetch_object($query)) { + $limits[$limit->cid] = $limit->status_limit; + } + foreach (signup_status_codes() as $cid => $code) { + $node->signup_status_limit[$cid] = isset($limits[$cid]) ? $limits[$cid] : 0; + } + $limit_type = db_result(db_query("SELECT limit_type FROM {signup_status_limit_node_setting} WHERE nid = %d", $node->nid)); + $node->signup_status_limit_type = !empty($limit_type) ? $limit_type : 'global'; +} + Index: modules/signup_status_limit/signup_status_limit.settings.inc =================================================================== RCS file: modules/signup_status_limit/signup_status_limit.settings.inc diff -N modules/signup_status_limit/signup_status_limit.settings.inc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/signup_status_limit/signup_status_limit.settings.inc 16 Sep 2009 10:58:55 -0000 @@ -0,0 +1,130 @@ +nid)); + if (empty($limit_type)) { + $limit_type = 'global'; + } + $global_limit = $node->signup_close_signup_limit; + if ($limit_type == 'global' && empty($global_limit)) { + $limit_type = 'none'; + } + + $form['signup_status_limit_type'] = array( + '#title' => t('Signup limit type'), + '#type' => 'radios', + '#default_value' => $limit_type, + '#options' => array( + 'none' => t('None'), + 'global' => t('Limit on total signups'), + 'status' => t('Separate limits for each signup status'), + ), + '#prefix' => '
', + '#suffix' => '
', + '#weight' => 5, + ); + + // Move the global limit field lower on the form, give it a better title, + // and provide the necessary divs for the JS to work properly. + $form['signup_close_signup_limit']['#weight'] = 6; + $form['signup_close_signup_limit']['#title'] = t('Limit on total signups'); + $classes = 'signup_global_limit'; + if ($limit_type != 'global') { + $classes .= ' js-hide'; + } + $form['signup_close_signup_limit']['#prefix'] = '
'; + $form['signup_close_signup_limit']['#suffix'] = '
'; + + // Add the per-status limits table. + $classes = 'signup_status_limit_node_limits'; + if ($limit_type != 'status') { + $classes .= ' js-hide'; + } + $form['signup_status_limit_node_limits'] = array( + '#theme' => 'signup_status_limit_node_limits', + '#tree' => TRUE, + '#weight' => 7, + '#prefix' => '
', + '#suffix' => '
' . t('For each !signup_status defined on your site, you can control how many signups are allowed at that status. If set to 0, there is no limit for that status.', array('!signup_status' => l(t('Signup status'), 'admin/settings/signup_status'))) . '
', + ); + foreach (signup_status_codes() as $cid => $code) { + $form['signup_status_limit_node_limits'][$cid]['name'] = array( + '#type' => 'markup', + '#value' => check_plain($code['name']), + ); + $form['signup_status_limit_node_limits'][$cid]['limit'] = array( + '#type' => 'textfield', + '#size' => 4, + '#default_value' => isset($node->signup_status_limit[$cid]) ? $node->signup_status_limit[$cid] : 0, + ); + } + + // Ensure the buttons are at the bottom of the page. + $form['buttons']['#weight'] = 50; + + // Add our own validation and submit handlers. + $form['#validate'][] = 'signup_status_limit_node_settings_validate'; + $form['#submit'][] = 'signup_status_limit_node_settings_submit'; + +} + +function signup_status_limit_node_settings_validate($form, $form_state) { + foreach ($form_state['values']['signup_status_limit_node_limits'] as $cid => $value) { + if (!is_numeric($value['limit']) || $value['limit'] < 0) { + form_set_error("signup_status_limit_node_limits][$cid][limit", t('The limit must be a positive number')); + } + } +} + +function signup_status_limit_node_settings_submit($form, $form_state) { + // Record the appropriate limit_type setting. + db_query("UPDATE {signup_status_limit_node_setting} SET limit_type = '%s' WHERE nid = %d", $form_state['values']['signup_status_limit_type'], $form['#node']->nid); + if (!db_affected_rows()) { + // There might not be a record in {signup_status_limit_node_setting}, + // e.g. for signup-enabled nodes that existed before the + // signup_status_limit module was enabled. + db_query("INSERT INTO {signup_status_limit_node_setting} (nid, limit_type) VALUES (%d, '%s')", $form['#node']->nid, $form_state['values']['signup_status_limit_type']); + } + + // If the limit type is set to 'none', clear out any global limit, too. + if ($form_state['values']['signup_status_limit_type'] == 'none') { + db_query("UPDATE {signup} SET close_signup_limit = %d WHERE nid = %d", 0, $form['#node']->nid); + } + + // Save all the new per-status limits defined in the form. + db_query("DELETE FROM {signup_status_limit_node_limit} WHERE nid = %d", $form['#node']->nid); + foreach ($form_state['values']['signup_status_limit_node_limits'] as $cid => $value) { + db_query("INSERT INTO {signup_status_limit_node_limit} (nid, cid, status_limit) VALUES (%d, %d, %d)", $form['#node']->nid, $cid, $value['limit']); + } +} + +function theme_signup_status_limit_node_limits($form) { + $header = array( + t('Signup status'), + t('Limit'), + ); + $rows = array(); + foreach (element_children($form) as $key) { + $rows[] = array( + drupal_render($form[$key]['name']), + drupal_render($form[$key]['limit']), + ); + } + return theme('table', $header, $rows); +} + Index: modules/signup_status_limit/signup_status_limit.settings.js =================================================================== RCS file: modules/signup_status_limit/signup_status_limit.settings.js diff -N modules/signup_status_limit/signup_status_limit.settings.js --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/signup_status_limit/signup_status_limit.settings.js 16 Sep 2009 10:58:55 -0000 @@ -0,0 +1,22 @@ +/* $Id$ */ + +/** + * Hide/show the right limit fields on the node signup settings page. + */ +Drupal.behaviors.signupStatusLimitShowLimitNodeSettings = function () { + $('div.signup-limit-radios input[type=radio]').click(function () { + if (this.value == 'global') { + $('div.signup_global_limit').show(); + $('div.signup_status_limit_node_limits').hide(); + } + else if (this.value == 'status') { + $('div.signup_global_limit').hide(); + $('div.signup_status_limit_node_limits').show(); + } + else if (this.value == 'none') { + $('div.signup_global_limit').hide(); + $('div.signup_status_limit_node_limits').hide(); + } + }); +}; +