? _project.inc_
? _project.module_
? release/history
Index: usage/project_usage.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/usage/project_usage.module,v
retrieving revision 1.1
diff -u -r1.1 project_usage.module
--- usage/project_usage.module	7 Aug 2007 20:21:33 -0000	1.1
+++ usage/project_usage.module	13 Aug 2007 21:39:23 -0000
@@ -43,11 +43,141 @@
       'description' => t('Configure how long usage data is retained.'),
       'weight' => 1,
     );
+    $items[] = array(
+      'path' => 'project-usage',
+      'title' => t('Project usage'),
+      'callback' => 'project_usage_overview',
+      'access' => user_access('view project usage'),
+    );
+  }
+  else {
+    // Project and release usage tabs.
+    if (arg(0) == 'node' && is_numeric(arg(1))) {
+      $node = node_load(arg(1));
+      if ($node->nid && ($node->type == 'project_project' || $node->type == 'project_release')) {
+        $items[] = array(
+          'path' => 'node/'. arg(1) .'/usage',
+          'title' => t('Usage'),
+          'access' => user_access('view project usage'),
+          'callback' => $node->type == 'project_project' ? 'project_usage_project_page' : 'project_usage_release_page',
+          'callback arguments' => array($node),
+          'type' => MENU_LOCAL_TASK,
+          'weight' => 2,
+        );
+      }
+    }
   }
   return $items;
 }
 
 /**
+ * Implementation of hook_perm().
+ */
+function project_usage_perm() {
+  $perms = array(
+    'view project usage',
+  );
+  return $perms;
+}
+
+/**
+ * Display and overview of usage for all modules.
+ */
+function project_usage_overview() {
+  $week_count = 6;
+  $weeks = project_usage_get_weeks_since(time() - ($week_count * PROJECT_USAGE_WEEK));
+
+  // Ignore the current week, since we won't have usage data for that and
+  // reverse the order so it's newest to oldest.
+  array_pop($weeks);
+  $weeks = array_reverse($weeks);
+
+  $header = array(t('Project'));
+  $rows = array();
+
+  // Create the full table with the project's name in the first column and
+  // empty cells for the rest.
+  $query = db_query(db_rewrite_sql("SELECT DISTINCT n.nid, n.title FROM node n INNER JOIN project_usage_week_project p ON n.nid = p.nid ORDER BY n.title"));
+  while ($row = db_fetch_object($query)) {
+    $rows[$row->title] = array_fill(0, $week_count + 1, 0);
+    $rows[$row->title][0] = l($row->title, "node/{$row->nid}/usage");
+  }
+
+  // Now load usage for each week.
+  foreach ($weeks as $i => $timestamp) {
+    $header[] = format_date($timestamp, 'custom', 'M j');
+    $query = db_query(db_rewrite_sql("SELECT n.nid, n.title, SUM(p.count) AS count FROM {node} n INNER JOIN {project_usage_week_project} p ON n.nid = p.nid WHERE p.timestamp = %d GROUP BY n.nid, n.title ORDER BY n.title"), $timestamp);
+    while ($row = db_fetch_object($query)) {
+      $rows[$row->title][$i + 1] = $row->count;
+    }
+  }
+
+  // Strip out the keys so that the odd/even row themeing works correctly. 
+  $rows = array_values($rows);
+
+  return theme('table', $header, $rows);
+}
+
+/**
+ * Display the usage history of a project node.
+ */
+function project_usage_project_page($node) {
+  drupal_set_title(check_plain($node->title));
+
+  // Get an array of the weeks going back as far as we have data.
+  $oldest = db_result(db_query("SELECT MIN(timestamp) FROM {project_usage_week_project} WHERE nid = %d", $node->nid));
+  $weeks = project_usage_get_weeks_since($oldest);
+
+  // Ignore the current week, since we won't have usage data for that and
+  // reverse the order so it's newest to oldest.
+  array_pop($weeks);
+  $weeks = array_reverse($weeks);
+
+  // The number of columns varies depending on how many different API versions
+  // are in use. Set up the header and a blank, template row, based on the
+  // number of distinct terms in use. 
+  $header = array(t('Week starting'));  
+  $blank_row = array();
+  $result = db_query("SELECT DISTINCT td.tid, td.name FROM {project_usage_week_project} p INNER JOIN {term_data} td ON p.tid = td.tid WHERE p.nid = %d ORDER BY td.weight, td.name", $node->nid);
+  while ($row = db_fetch_object($result)) {
+    $header[$row->tid] = $row->name;
+    $blank_row[$row->tid] = 0;
+  }
+
+  // Now create a blank table with a row for each week and formatted date in
+  // the first column...
+  $rows = array();
+  foreach ($weeks as $week) {
+    $rows[$week] = array(0 => format_date($week, 'custom', 'F j')) + $blank_row;
+  }
+  // ...then fill it in with our data.
+  $result = db_query("SELECT timestamp, tid, count FROM {project_usage_week_project} WHERE nid = %d", $node->nid);
+  while ($row = db_fetch_object($result)) {
+    $rows[$row->timestamp][$row->tid] = $row->count;
+  }
+
+  // Strip out the keys so that the odd/even row themeing works correctly. 
+  $rows = array_values($rows);
+
+  return theme('table', $header, $rows);
+}
+
+/**
+ * Display the usage history of a release node.
+ */
+function project_usage_release_page($node) {
+  drupal_set_title(check_plain($node->title));
+
+  $header = array(t('Week starting'), t('Count'));
+  $rows = array();
+  $query = db_query("SELECT timestamp, count FROM {project_usage_week_release} WHERE nid = %d ORDER BY timestamp DESC", $node->nid);
+  while ($row = db_fetch_object($query)) {
+    $rows[] = array(format_date($row->timestamp), $row->count);
+  }
+  return theme('table', $header, $rows);
+}
+
+/**
  * Module settings form.
  */
 function project_usage_settings_form() {
