? _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() {