? node_agreement-643402.patch
Index: node_agreement.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/node_agreement/node_agreement.install,v
retrieving revision 1.1
diff -u -p -r1.1 node_agreement.install
--- node_agreement.install	2 Nov 2009 00:28:55 -0000	1.1
+++ node_agreement.install	26 Nov 2009 01:07:29 -0000
@@ -30,6 +30,13 @@ function node_agreement_schema() {
         'not null' => TRUE,
         'default' => 0,
       ),
+      'always' => array(
+        'description' => 'Setting to allow always requiring agreements.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
     ),
     'primary key' => array('nid'),
     'indexes' => array(
@@ -71,3 +78,17 @@ function node_agreement_schema() {
   return $schema;
 }
 
+/**
+ * Update to add the always column to node_agreement table.
+ */
+function node_agreement_update_1() {
+  $ret = array();
+  db_add_field($ret, 'node_agreement', 'always', array(
+    'description' => 'Setting to allow always requiring agreements.',
+    'type' => 'int',
+    'unsigned' => TRUE,
+    'not null' => TRUE,
+    'default' => 0,
+  ));
+  return $ret;
+}
Index: node_agreement.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/node_agreement/node_agreement.module,v
retrieving revision 1.1.2.1
diff -u -p -r1.1.2.1 node_agreement.module
--- node_agreement.module	26 Nov 2009 00:09:34 -0000	1.1.2.1
+++ node_agreement.module	26 Nov 2009 01:07:29 -0000
@@ -6,9 +6,12 @@ define('NODE_AGREEMENT_CONTENT_WITHHELD_
 
 function node_agreement_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
   global $user;
-  if ($op == 'view' && isset($node->agreement) && !$node->agreement['signed']) {
+  $path = drupal_lookup_path('node/agreement/' . $node->nid);
+  $path = (module_exists('path') && $path) ? $path : 'node/agreement/' . $node->nid;
+  if (($op == 'view' && isset($node->agreement) && !$node->agreement['signed']) ||
+      ($op == 'view' && isset($node->agreement) && $node->agreement['signed'] && $node->agreement['always'] == 1 && $_SERVER['HTTP_REFERER'] != url($path, array('absolute' => TRUE)))) {
     if ($a4) { // page?
-      drupal_goto(drupal_get_path_alias('node/agreement/' . $node->nid));
+      drupal_goto($path);
     } 
     else {
       $node->content = array(
@@ -18,8 +21,10 @@ function node_agreement_nodeapi(&$node, 
     }
   }
   else if ($op == 'load') {
-    if ($aid = db_result(db_query("SELECT aid FROM {node_agreement} WHERE nid=%d", $node->nid))) {
+    $always = db_result(db_query("SELECT always FROM {node_agreement} WHERE nid=%d", $node->nid));
+    if ($aid && $always) {
       $node->agreement['aid'] = $aid;
+      $node->agreement['always'] = $always;
       $node->agreement['signed'] = (boolean)db_result(db_query("SELECT COUNT(*) FROM {node_agreement_signature} WHERE uid=%d AND nid=%d", $user->uid, $node->nid));
     }
   }
@@ -65,12 +70,15 @@ function node_agreement_page($form_state
 function node_agreement_page_submit($form, &$form_state) {
   if ($form_state['values']['op'] == $form_state['values']['agree']) {
     global $user;
-    $record = array(
-      'uid' => $user->uid, 
-      'nid' => $form_state['values']['nid'], 
-      'signed' => time(),
-    );
-    drupal_write_record('node_agreement_signature', $record);
+    $node_agreement_signed = (boolean)db_result(db_query("SELECT COUNT(*) FROM {node_agreement_signature} WHERE uid=%d AND nid=%d", $user->uid, $form_state['values']['nid']));
+    if ($node_agreement_signed == FALSE) {
+      $record = array(
+        'uid' => $user->uid, 
+        'nid' => $form_state['values']['nid'], 
+        'signed' => time(),
+      );
+      drupal_write_record('node_agreement_signature', $record);
+    }
     $form_state['redirect'] = 'node/' . $form_state['values']['nid'];
   }
   else {
@@ -93,7 +101,12 @@ function node_agreement_form($form_state
     '#title' => t('Agreement'),
     '#description' => t('The agreement to display for this node.'),
     '#options' => $agreements,
-    '#default_value' => @$node->agreement['aid'],
+    '#default_value' => $node->agreement['aid'],
+  );
+  $form['agreement_always'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Always Require Users to Accept this Agreement, even if they have accepted it in the past.'),
+    '#default_value' => $node->agreement['always'],
   );
   if (module_exists('path')) {
     $form['agreement_alias'] = array(
@@ -116,8 +129,8 @@ function node_agreement_form($form_state
 
 function node_agreement_form_submit($form, &$form_state) {
   db_query("DELETE FROM {node_agreement} WHERE nid=%d", $form_state['values']['nid']);
-  if ($form_state['values']['agreement']) {
-    $record = array('nid' => $form_state['values']['nid'], 'aid' => $form_state['values']['agreement']);
+  if ($form_state['values']['agreement'] && $form_state['values']['agreement_always']) {
+    $record = array('nid' => $form_state['values']['nid'], 'aid' => $form_state['values']['agreement'], 'always' => $form_state['values']['agreement_always']);
     drupal_write_record('node_agreement', $record);
   }
   if (!empty($form_state['values']['agreement_alias'])) {
