Only in decisions: 660578.patch
diff --recursive -wup /tmp/decisions/CHANGELOG.txt decisions/CHANGELOG.txt
--- /tmp/decisions/CHANGELOG.txt	2010-04-28 00:40:43.000000000 -0400
+++ decisions/CHANGELOG.txt	2010-05-11 18:33:03.000000000 -0400
@@ -15,6 +15,7 @@ Decisions 6.x branch (HEAD, in progress)
  * Provide better messages to explain why users cannot vote, or see results.
  * Users who are in the electoral list, but who are not in a role with
    permissions to vote, are no longer allowed to vote.
+ * Allow users to override display of results with supplied text
 
 Decisions 5.x branch (stalled)
 ------------------------------
diff --recursive -wup /tmp/decisions/decisions.install decisions/decisions.install
--- /tmp/decisions/decisions.install	2010-04-27 18:53:52.000000000 -0400
+++ decisions/decisions.install	2010-05-11 14:48:43.000000000 -0400
@@ -26,6 +26,8 @@ function decisions_schema() {
       'showvotes' => array('type' => 'int', 'size' => 'tiny', 'not null' => FALSE, 'disp-width' => '4'),
       'startdate' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => FALSE, 'disp-width' => '10'),
       'randomize' => array('type' => 'int', 'size' => 'tiny', 'not null' => FALSE, 'default' => 1, 'disp-width' => '4'),
+      'override_results_yn' => array('type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => '0'),
+      'override_results_text' => array('type' => 'text', 'size' => 'normal', 'not null' => TRUE, 'default' => ''),
     ),
     'primary key' => array('nid'),
   );
@@ -139,6 +141,18 @@ function decisions_update_6001() {
   $ret[] = db_create_table($ret, 'cache_decisions', drupal_get_schema_unprocessed('system', 'cache'));
   return $ret;
 }
+
+function decisions_update_6002() {
+  switch ($GLOBALS['db_type']) {
+  case 'mysql':
+  case 'mysqli':
+    $items[] = update_sql("ALTER TABLE {decisions} ADD COLUMN `override_results_yn` tinyint default '0'");
+    $items[] = update_sql("ALTER TABLE {decisions} ADD COLUMN `override_results_text` text");
+    break;
+  }
+  return $items;
+}
+
 /**
  * Implementation of hook_uninstall().
  */
diff --recursive -wup /tmp/decisions/decisions.module decisions/decisions.module
--- /tmp/decisions/decisions.module	2010-04-28 01:07:29.000000000 -0400
+++ decisions/decisions.module	2010-05-11 18:31:21.000000000 -0400
@@ -117,7 +117,7 @@ function decisions_help($path, $arg) {
  */
 function decisions_menu() {
   $items['admin/settings/decisions'] = array(
-    'title' => 'Configure decisions',
+    'title' => 'Decisions',
     'description' => 'Configure Decisions',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('decisions_admin'),
@@ -260,11 +260,12 @@ function decisions_theme($existing, $typ
     'decisions_view_voting' => array('arguments' => array('form' => NULL)),
     'decisions_bar' => array('arguments' => array('title' => NULL, 'percentage' => NULL, 'votes' => NULL)),
     'decisions_status' => array('arguments' => array('message' => NULL)),
-    'decisions_morechoices' => array('arguments' => array(), 'decisions_morechoices' => NULL),
+    'decisions_morechoices' => array('arguments' => array('decisions_morechoices' => NULL)),
     'decisions_view_own_result' => array(),
     'decisions_no_vote_access' => array(),
     'decisions_no_view_access' => array(),
     'decisions_no_vote_or_view_access' => array(),
+    'decisions_override_text' => array('arguments' => array('override_text')),
   );
 }
 
@@ -374,6 +375,22 @@ function theme_decisions_status($message
   return '<div class="error">'. $message .'</div>';
 }
 
+/**
+ * Theme the override text
+ */
+function theme_decisions_override_text($override_text) {
+  // check the override text using the default input format for the site
+  // (users with permission to enter this text already have permission to use
+  // this input format for the description field)
+  // TODO allow users to select an alternate input format which they have
+  // permission to use
+  $output = '';
+  $output .= '<div class="decisions-override-text">';
+  $output .= check_markup($override_text);
+  $output .= '</div>';
+  return $output;
+}
+
 /****************************/
 /* Electoral list functions */
 /****************************/
@@ -1228,7 +1245,7 @@ function decisions_insert($node) {
   // just create an empty entry for now
   $mode = _decisions_get_mode($node);
 
-  db_query("INSERT INTO {decisions} (nid, mode, quorum_abs, quorum_percent, uselist, active, runtime, maxchoices, algorithm, startdate, randomize) VALUES (%d, '%s', %d, %f, %d, %d, %d, %d, '%s', %d, %d)", $node->nid, $mode, $node->settings['quorum']['quorum_abs'], $node->settings['quorum']['quorum_percent'], $node->settings['uselist'], $node->settings['active'], $runtime, $node->settings['maxchoices'], $node->settings['algorithm'], $startdate, $node->settings['randomize']);
+  db_query("INSERT INTO {decisions} (nid, mode, quorum_abs, quorum_percent, uselist, active, runtime, maxchoices, algorithm, startdate, randomize, override_results_yn, override_results_text) VALUES (%d, '%s', %d, %f, %d, %d, %d, %d, '%s', %d, %d, %d,'%s')", $node->nid, $mode, $node->settings['quorum']['quorum_abs'], $node->settings['quorum']['quorum_percent'], $node->settings['uselist'], $node->settings['active'], $node->settings['runtime'], $node->settings['maxchoices'], $node->settings['algorithm'], $startdate, $node->settings['randomize'], $node->settings['override']['override_results_yn'], $node->settings['override']['override_results_text_fieldset']['override_results_text']);
 
   // create the electoral list if desired
 
@@ -1275,7 +1292,7 @@ function decisions_validate(&$node) {
 /**
  * Implementation of hook_update().
  *
- * This is called upon node edition.
+ * This is called when node is edited.
  */
 function decisions_update($node) {
   // Compute startdate and runtime.
@@ -1304,7 +1321,7 @@ function decisions_update($node) {
     }
   }
 
-  db_query("UPDATE {decisions} SET quorum_abs=%d, quorum_percent=%f, active=%d, runtime=%d, maxchoices=%d, algorithm='%s', uselist=%d, showvotes=%d, startdate=%d, randomize=%d WHERE nid = %d", $node->settings['quorum']['quorum_abs'], $node->settings['quorum']['quorum_percent'], $node->settings['active'], $runtime, $node->settings['maxchoices'], $node->settings['algorithm'], $node->settings['uselist'], $node->settings['showvotes'], $startdate, $node->settings['randomize'], $node->nid);
+  db_query("UPDATE {decisions} SET quorum_abs=%d, quorum_percent=%f, active=%d, runtime=%d, maxchoices=%d, algorithm='%s', uselist=%d, showvotes=%d, startdate=%d, randomize=%d, override_results_yn=%d, override_results_text='%s' WHERE nid = %d", $node->settings['quorum']['quorum_abs'], $node->settings['quorum']['quorum_percent'], $node->settings['active'], $runtime, $node->settings['maxchoices'], $node->settings['algorithm'], $node->settings['uselist'], $node->settings['showvotes'], $startdate, $node->settings['randomize'], $node->settings['override']['override_results_yn'], $node->settings['override']['override_results_text_fieldset']['override_results_text'], $node->nid);
   // XXX: should update decisions here, when it has some parameters
   // XXX: ... but before doing so, the code below must be factored out in a seperate function for usage in decisions_insert()
   db_query('DELETE FROM {decisions_choices} WHERE nid = %d', $node->nid);
@@ -1416,10 +1433,18 @@ function decisions_view(&$node, $teaser 
   }
   elseif (_decisions_can_view_results($node)) {
     // show results only if the user has voted or decision is closed, and user
-    // can view results
+    // can view results, and an editor has not overridden the results display
+
+    // if results override has been set for this node, display the override
+    // text, except for admins and users who have permission to edit this node
+    if ($node->override_results_yn && !user_access('administer decisions') && !node_access('update', $node)) {
+      $node->content['override_text']['#value'] = theme('decisions_override_text', $node->override_results_text);
+    }
+    else {
     $node->content['decisions']['results']['#value'] = decisions_view_results($node, $teaser, $page);
     $node->content['decisions']['list']['#value'] = theme('decisions_view_header', $node, $teaser);
   }
+  }
   elseif (!user_access('view decisions') && !user_access('vote on decisions')) {
     // explain to user that they don't have permission to vote or view vote results
     $node->content['decisions']['#value'] = theme('decisions_no_vote_or_view_access');
@@ -1632,6 +1657,36 @@ function decisions_form(&$node, &$form_s
     '#description' => t('Display answers in a random order each time the poll is displayed.'),
   );
 
+  $form['settings']['override'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Override results text'),
+    '#collapsed' => !$node->override_results_yn,
+    '#collapsible' => TRUE,
+  );
+
+  $form['settings']['override']['override_results_yn'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Override results'),
+    '#default_value' => $node->override_results_yn,
+    '#description' => t('Override display of results with text entered by editor.'),
+    '#attributes' => array('onClick' => 'Drupal.toggleFieldset($("#override_results_text_fieldset"))'),
+  );
+
+  $form['settings']['override']['override_results_text_fieldset'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Override results text'),
+    '#collapsed' => !$node->override_results_yn,
+    '#collapsible' => TRUE,
+    '#attributes' => array('id' => 'override_results_text_fieldset'),
+  );
+
+  $form['settings']['override']['override_results_text_fieldset']['override_results_text'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Override results text'),
+    '#default_value' => $node->override_results_text,
+    '#description' => t('Text to be displayed in place of results.'),
+  );
+
   $form['settings']['date'] = array(
     '#type' => 'fieldset',
     '#title' => t('Date options'),
