Index: user_quota.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/user_quota/user_quota.module,v
retrieving revision 1.17
diff -u -r1.17 user_quota.module
--- user_quota.module	19 Dec 2008 23:56:11 -0000	1.17
+++ user_quota.module	1 Jan 2009 19:03:42 -0000
@@ -1,4 +1,5 @@
 <?php
+// $Id$
 /**
  * @file
  *  The user_quota module which provides per user, per content type quotas.
@@ -11,23 +12,51 @@
  */
 function user_quota_menu() {
 
-  $item['admin/user/user_quota'] = array(
+  $items['admin/user/user_quota'] = array(
     'title' => 'User quota',
     'description' => 'View and manage user quotas.',
-    'page callback' => 'user_quota_settings',
+    'page callback' => 'user_quota_view',
     'access arguments' => array('administer site configuration'),
     'type' => MENU_NORMAL_ITEM,
   );
-
-  $item['admin/user/user_quota/manage'] = array(
+  
+  $items['admin/user/user_quota/view'] = array(
+    'title' => 'View user quota',
+    'description' => 'View user quotas.',
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => 0
+  );
+  
+  $items['admin/user/user_quota/manage'] = array(
     'title' => 'Manage a quota',
     'description' => 'Manage the quota for a user or add a new quota for a user',
     'page callback' => 'user_quota_manage',
     'access arguments' => array('administer site configuration'),
-    'type' => MENU_NORMAL_ITEM,
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 1
   );
 
-  return ($item);
+  $items['admin/user/user_quota/settings'] = array(
+    'title' => 'Settings',
+    'description' => 'Settings for the User Quota module',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('user_quota_settings'),
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 2
+  );
+  
+  $items['user/%user_uid_optional/quota'] = array(
+    'title' => 'User quota',
+    'page callback' => 'user_quota_user_own_quota',
+    'page arguments' => array(1),
+    'access callback' => 'user_edit_access',
+    'access arguments' => array(1),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 5,
+  );
+  return $items;
 }
 
 /**
@@ -35,7 +64,7 @@
  *
  * @return string The content to display in the browser.
  */
-function user_quota_settings() {
+function user_quota_view() {
   $output = t('<p>This page shows an overall report of quotas for all users.  Click on the "Details and manage" link for a specific user to see the history of their quota.  You can also <a href="!uri">create a new quota for a user</a>.</p>', array('!uri' => url('admin/user/user_quota/manage/')));
 
   $limit = 100;
@@ -68,34 +97,14 @@
       $output .= drupal_get_form('user_quota_manage_form', $account);
 
       // Get current quota limits.
-      $current = db_query("SELECT current_limit, type FROM {user_quota} WHERE uid = %d", $uid);
-      $current_header = array(array('data' => t('Quota')),
-                              array('data' => t('Content type'))
-      );
-      while ($current_result = db_fetch_object($current)) {
-        $current_rows[] = array($current_result->current_limit, check_plain($current_result->type));
-      }
-      if (isset($current_rows)) {
-        $output .= t('<h3>Current quotas</h3>');
-        $output .= theme('table', $current_header, $current_rows);
-      }
-
+      // Qmod: moved to re-useable helper function
+      $output = t('<h3>Current quotas</h3>');
+      $output .= user_quota_show_user_quota(FALSE, $uid);
+      
       // Get historic quota alterations.
-      $history = db_query("SELECT quota, type, uqh.created, message, u.name, altering_uid FROM {user_quota_history} uqh LEFT JOIN {users} u ON uqh.altering_uid = u.uid WHERE uqh.uid = %d ORDER BY created DESC", $uid);
-      $history_header = array(array('data' => t('Quota')),
-                              array('data' => t('Content type')),
-                              array('data' => t('Date')),
-                              array('data' => t('Altering user')),
-                              array('data' => t('Message')),
-
-      );
-      while ($history_result = db_fetch_object($history)) {
-        $history_rows[] = array($history_result->quota, check_plain($history_result->type), format_date($history_result->created), l($history_result->name, 'user/'. $history_result->altering_uid), check_markup($history_result->message));
-      }
-      if (isset($history_rows)) {
-        $output .= t('<h3>Quota modification history</h3>');
-        $output .= theme('table', $history_header, $history_rows);
-      }
+      // Qmod: moved to re-useable helper function
+      $output .= t('<h3>Quota modification history</h3>');
+      $output .= user_quota_show_user_history($uid);
     }
     else {
       drupal_set_message(t("Invalid URL argument, proceeding with the default form."));
@@ -149,8 +158,8 @@
     '#size' => 60,
     '#maxlength' => 64,
     '#required' => TRUE,
-    '#description' => t('Negative values will decrease the quota.  It is possible for a user to have a negative quota.'),
-  );
+    '#description' => t('Negative values will decrease the quota.  It is possible for a user to have a negative quota. For unlimited quotas, please enter a value higher than %value', array('%value' => variable_get('user_quota_unlimited_value', 1000)))
+    );
 
   // An optional message
   $form['user_quota_form']['message'] = array(
@@ -159,7 +168,7 @@
     '#description' => t('Provide a motivation for your change.'),
     '#cols' => 60,
     '#rows' => 2,
-    '#description' => t('Negative values will decrease the quota.  It is possible for a user to have a negative quota.'),
+ 
   );
 
   // And go!
@@ -192,6 +201,53 @@
 }
 
 /**
+* Admin settings
+*
+*/
+function user_quota_settings() {
+  $form['user_quota_unlimited_value'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Set unlimited value'),
+    '#default_value' => variable_get('user_quota_unlimited_value', 1000),
+    '#description' => t('Any value above this number will give the user unlimited quotas.'),
+    '#width' => 60,
+  );
+
+  $form['user_quota_blocked_msg'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Empty message'),
+    '#default_value' => variable_get('user_quota_blocked_msg', 'You currently may not create another %type.  You must first gain more credits.'),
+    '#description' => t('Message for when a users\' quota is 0. Use the token <em>%type</em> to indicate a particular type such as \'page\', \'story\', etc.'), 
+    '#cols' => 60,
+    '#rows' => 1,
+  );
+   return system_settings_form($form);
+}
+
+function user_quota_settings_validate($form, &$form_state) {
+  // Is it a non-zero number?
+  if (!is_numeric($form['user_quota_unlimited_value']['#value']) || $form['user_quota_unlimited_value']['#value'] == 0) {
+    form_set_error('quota', t('Please enter a non-zero number'));
+  }
+}
+
+/**
+ A page callback to show quota to user in account
+*/
+function user_quota_user_own_quota($account) {
+  
+  // Get current quota limits.
+  $output = t('<h3>Current quotas</h3>');
+  $output .= user_quota_show_user_quota(TRUE, $account->uid);
+  
+  // Get historic quota alterations.
+  $output .= t('<h3>Quota history</h3>');
+  $output .= user_quota_show_user_history($account->uid); 
+  
+  return $output;
+}
+
+/**
  * Implementation of hook_nodeapi().
  *
  */
@@ -200,18 +256,28 @@
   if (empty($node->nid) && ($op == 'prepare' || $op == 'validate')) {
     global $user;
     user_quota_check_limit($node, $user);
+    //Qmod: Exit node creation without showing form?
   }
   elseif ($op == 'insert') {
     // Decrement any records by the value set during form_alter
-    // Slightly sneaky use of UPDATE: if they are not in a quota it will affect 0 rows.
-    db_query("UPDATE {user_quota} SET current_limit = current_limit - %d WHERE uid = %d AND type = '%s'", $node->user_quota_decrement, $node->uid, $node->type);
-    if (db_affected_rows()) {
+    //Qmod: don't decrement if unlimited
+    if (user_quota_get_limit($node->type) != 'unlimited') {      
+      // Slightly sneaky use of UPDATE: if they are not in a quota it will affect 0 rows.
+      //Qmod: in this update, if they are not in a quota, they can't post. Blocked in $op = 'prepare'.
+      db_query("UPDATE {user_quota} SET current_limit = current_limit - %d WHERE uid = %d AND type = '%s'", $node->user_quota_decrement, $node->uid, $node->type);
+      //Qmod: prepair for history log
+      $decrement = -$node->user_quota_decrement;
+    }
+    else {
+      $decrement = 0;
+    }
+    
       // If rows are affected then they have a quota, so log it in the history table.
-      global $user;
+      //Qmod: All posts are logged for consistancy. Unlimited users get 0 decrement.
+      global $user;      
       $message = t('Created @type content <a href="!uri">@title</a>.', array('@user-name' => $user->name, '@type' => $node->type, '!uri' => url('node/'. $node->nid), '@title' => $node->title));
-      db_query("INSERT INTO {user_quota_history} (uid, quota, type, created, message, altering_uid) VALUES (%d, %d, '%s', %d, '%s', %d)", $node->uid, -$node->user_quota_decrement, $node->type, time(), $message, $user->uid);
-    }
-  }
+      db_query("INSERT INTO {user_quota_history} (uid, quota, type, created, message, altering_uid) VALUES (%d, %d, '%s', %d, '%s', %d)", $node->uid, $decrement, $node->type, time(), $message, $user->uid);
+   }
 }
 
 /**
@@ -231,7 +297,7 @@
     return $limit;
   }
   else {
-      form_set_error('', t('You currently may not create another %type.  You must first gain more credits.', array('%type' => $node->type)));
+    form_set_error('', t(variable_get('user_quota_blocked_msg', 'You currently may not create another %type.  You must first gain more credits.'), array('%type' => $node->type)));
   }
 }
 
@@ -241,10 +307,15 @@
   }
   $limit = db_result(db_query("SELECT current_limit FROM {user_quota} WHERE uid = %d AND type = '%s'", $user->uid, $type));
   if (is_numeric($limit)) {
-    return $limit;
+    if ($limit >= variable_get('user_quota_unlimited_value', 1000)) {
+      return 'unlimited';
+    }
+    else {
+      return $limit;
+    }
   }
   else {
-    return 'unlimited';
+    return 0;
   }
 }
 
@@ -277,4 +348,183 @@
   if (!db_affected_rows()) {
     db_query("INSERT INTO {user_quota} (uid, current_limit, type) VALUES (%d, %d, '%s')", $uid, $limit, $type);
   }
-}
\ No newline at end of file
+}
+
+/**
+ * Implementation of hook_block().
+ */
+function user_quota_block($op='list', $delta=0) {
+  switch ($op) {
+    
+    case 'list' :
+      $block[0]["info"] = t('User Quota');
+      return $block;
+ 
+    case 'view' :
+      $block_header = array(); 
+      $block_rows = user_quota_per_user_quota(TRUE);     
+      $block_content = theme('table', $block_header, $block_rows); 
+      $block['subject'] = 'Content Quota';
+      $block['content'] = $block_content;
+      return $block;
+  }
+}
+/**
+* Helper function for per user quota for active user for use in listings.
+*/
+function user_quota_per_user_quota($access = FALSE, $uid = NULL) {
+  global $user;
+  $uid = ($uid)? $uid : $user->uid;
+  $results = db_query("SELECT current_limit, type FROM {user_quota} WHERE uid = %d", $uid);
+  $num_rows = FALSE;
+  $per_user_quota = array();
+  while ($value = db_fetch_object($results)) {
+    $limit = ($value->current_limit >= variable_get('user_quota_unlimited_value', 1000))? 'Unlimited': $value->current_limit;   
+    if ($access) { //show only nodes which have user access
+      if (node_access('create', $value->type)) { 
+        $per_user_quota[] = array(ucfirst($value->type), $limit);
+        $num_rows = TRUE;
+      }
+    }
+    else {
+      $per_user_quota[] = array(ucfirst($value->type), $limit);
+      $num_rows = TRUE;
+    }
+  }
+  
+  if (!$num_rows) { //no db entry>>>no quotas assigned.
+    $per_user_quota[] = array('No quotas assigned');
+  }
+  return $per_user_quota;
+}
+
+/**
+* Helper function to show user quota in table
+*/
+function user_quota_show_user_quota($access = FALSE, $this_uid = NULL) {
+  $current_header = array(array('data' => t('Content type')), array('data' => t('Quota')));
+  $current_rows = user_quota_per_user_quota($access, $this_uid); 
+  //no headings if no content
+  if ($current_rows == array('No quotas assigned')) {
+      $current_header = array();
+  }
+  if (isset($current_rows)) {
+    $output = theme('table', $current_header, $current_rows);
+  }
+  return $output;
+}
+
+/**
+* Helper function to show user history
+*/
+function user_quota_show_user_history($this_uid) {
+  $history = db_query("SELECT quota, type, uqh.created, message, u.name, altering_uid FROM {user_quota_history} uqh LEFT JOIN {users} u ON uqh.altering_uid = u.uid WHERE uqh.uid = %d ORDER BY created DESC", $this_uid);
+  $history_header = array(array('data' => t('Quota')),
+                          array('data' => t('Content type')),
+                          array('data' => t('Date')),
+                          array('data' => t('Altering user')),
+                          array('data' => t('Message')),
+
+  );
+  while ($history_result = db_fetch_object($history)) {
+    $history_rows[] = array($history_result->quota, check_plain($history_result->type), format_date($history_result->created), l($history_result->name, 'user/'. $history_result->altering_uid), check_markup($history_result->message));
+  }
+  if (isset($history_rows)) {    
+    $output = theme('table', $history_header, $history_rows);
+  }
+  else {
+    $output = 'No history information';
+  }
+  return $output;
+}
+
+/**
+* Implementation of hook_action_info().
+*/
+function user_quota_action_info() {
+  return array(
+    'user_quota_add_quota_action' => array(
+      'description' => t('Add User Quota'),
+      'type' => 'user',
+      'configurable' => TRUE,
+      'hooks' => array('any' => TRUE),
+      ),
+    );
+}
+
+/**
+* Do action add quota
+*
+*/
+function user_quota_add_quota_action(&$object, $context = array()) {
+  if (isset($object->uid)) {
+    $uid = $object->uid;
+  }
+  elseif (isset($context['uid'])) {
+    $uid = $context['uid'];
+  }
+  else {
+    global $user;
+    $uid = $user->uid;
+  }
+  $limit = $context['action_limit'];
+  $type = $context['action_type'];
+  $message= $context['action_message'];
+  user_quota_set_user_quota($uid, $limit, $type, $message, 1);
+}
+
+/**
+* Set up action variables.
+*/
+function user_quota_add_quota_action_form() {
+  // The content type to limit
+  $types = node_get_types();
+  foreach ($types as $machine => $type) {
+    $options[$machine] = $type->name;
+  }
+  $form['action_type'] = array(
+    '#type' => 'select',
+    '#title' => t('Content type to limit'),
+    '#options' => $options,
+    '#default_value' => isset($context['action_type']) ? $context['action_type'] : '',
+  );
+
+  // The limit number
+  $form['action_limit'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Amount to alter quota (add or decrease)'),
+    '#default_value' => 0,
+    '#size' => 60,
+    '#maxlength' => 64,
+    '#required' => TRUE,
+    '#default_value' => isset($context['action_limit']) ? $context['action_limit'] : '',
+    '#description' => t('Negative values will decrease the quota.  It is possible for a user to have a negative quota. For unlimited quotas, please enter a value higher than %value', array('%value' => variable_get('user_quota_unlimited_value', 1000)))
+    );
+
+  // An optional message
+  $form['action_message'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Modification message'),
+    '#description' => t('Provide a motivation for your change.'),
+    '#cols' => 60,
+    '#rows' => 2,
+    '#default_value' => isset($context['action_message']) ? $context['action_message'] : '',
+ 
+  );
+  return $form;
+}
+
+function user_quota_add_quota_action_validate($form, &$form_state) {
+  // Is it a non-zero number?
+  if (!is_numeric($form_state['values']['action_limit']) || $form_state['values']['action_limit'] == 0) {
+    form_set_error('quota', t('Please enter a non-zero number'));
+  }
+} 
+
+function user_quota_add_quota_action_submit($form, $form_state) {
+  return array(
+    'action_type' => $form_state['values']['action_type'],
+    'action_limit' => $form_state['values']['action_limit'],
+    'action_message' => $form_state['values']['action_message'],
+  );
+} 
\ No newline at end of file

