Merge pull request #169 from kytrinyx/index-page

Encapsulate dependencies of stats index page
This commit is contained in:
Reinier Balt 2013-03-03 06:35:29 -08:00
commit 0f7ed245c6
10 changed files with 213 additions and 78 deletions

View file

@ -3,21 +3,12 @@ class StatsController < ApplicationController
SECONDS_PER_DAY = 86400;
helper :todos, :projects, :recurring_todos
append_before_filter :init
append_before_filter :init, :except => :index
def index
@page_title = t('stats.index_title')
@first_action = current_user.todos.reorder("created_at ASC").first
tag_ids = Stats::UserTagsQuery.new(current_user).result.map(&:id)
@tags_count = tag_ids.size
@unique_tags_count = tag_ids.uniq.size
@hidden_contexts = current_user.contexts.hidden
@actions = Stats::Actions.new(current_user)
get_stats_contexts
get_stats_projects
get_stats_tags
@stats = Stats::IndexPage.new(current_user)
end
def actions_done_last12months_data
@ -384,43 +375,6 @@ class StatsController < ApplicationController
@cut_off_year = 12.months.ago.beginning_of_day
@cut_off_year_plus3 = 15.months.ago.beginning_of_day
@cut_off_month = 1.month.ago.beginning_of_day
@cut_off_3months = 3.months.ago.beginning_of_day
end
def get_stats_contexts
@actions_per_context = Stats::TopContextsQuery.new(current_user, :limit => 5).result
@running_actions_per_context = Stats::TopContextsQuery.new(current_user, :limit => 5, :running => true).result
@context_charts = %w{
context_total_actions_data
context_running_actions_data
}.map do |action|
Stats::Chart.new(action, :height => 325)
end
end
def get_stats_projects
@projects_and_actions = Stats::TopProjectsQuery.new(current_user).result
@projects_and_actions_last30days = Stats::TopProjectsQuery.new(current_user, @cut_off_month).result
# get the first 10 projects and their running time (creation date versus
# now())
@projects_and_runtime = current_user.projects.find_by_sql(
"SELECT id, name, created_at "+
"FROM projects "+
"WHERE state='active' "+
"AND user_id=#{current_user.id} "+
"ORDER BY created_at ASC "+
"LIMIT 10"
)
end
def get_stats_tags
tags = Stats::TagCloudQuery.new(current_user).result
@tag_cloud = Stats::TagCloud.new(tags)
tags = Stats::TagCloudQuery.new(current_user, @cut_off_3months).result
@tag_cloud_90days = Stats::TagCloud.new(tags)
end
def get_ids_from (actions, week_from, week_to, at_end)

View file

@ -0,0 +1,27 @@
module Stats
class Contexts
attr_reader :user
def initialize(user)
@user = user
end
def actions
@actions ||= Stats::TopContextsQuery.new(user, :limit => 5).result
end
def running_actions
@running_actions ||= Stats::TopContextsQuery.new(user, :limit => 5, :running => true).result
end
def charts
@charts = %w{
context_total_actions_data
context_running_actions_data
}.map do |action|
Stats::Chart.new(action, :height => 325)
end
end
end
end

View file

@ -0,0 +1,43 @@
module Stats
class IndexPage
attr_reader :user
def initialize(user)
@user = user
end
def actions
@actions ||= Stats::Actions.new(user)
end
def totals
@totals ||= Stats::Totals.new(user)
end
def projects
@projects ||= Stats::Projects.new(user)
end
def contexts
@contexts ||= Stats::Contexts.new(user)
end
def tag_cloud
unless @tag_cloud
tags = Stats::TagCloudQuery.new(user).result
@tag_cloud = Stats::TagCloud.new(tags)
end
@tag_cloud
end
def tag_cloud_90days
unless @tag_cloud_90days
cutoff = 3.months.ago.beginning_of_day
tags = Stats::TagCloudQuery.new(user, cutoff).result
@tag_cloud_90days = Stats::TagCloud.new(tags)
end
@tag_cloud_90days
end
end
end

View file

@ -0,0 +1,22 @@
module Stats
class Projects
attr_reader :user
def initialize(user)
@user = user
end
def runtime
@runtime ||= user.projects.active.order('created_at ASC').limit(10)
end
def actions
@actions ||= Stats::TopProjectsQuery.new(user).result
end
def actions_last30days
@actions_last30days ||= Stats::TopProjectsQuery.new(user, 1.month.ago.beginning_of_day).result
end
end
end

View file

@ -1,5 +1,5 @@
# Get action count for the top 5 contexts
# If initialized with :running, then only active
# Get action count for the top n contexts (default: all)
# If initialized with :running => true, then only active
# and visible contexts will be included.
module Stats
class TopContextsQuery

View file

@ -0,0 +1,88 @@
module Stats
class Totals
attr_reader :user
def initialize(user)
@user = user
end
def empty?
actions.empty?
end
def tags
@tags ||= tag_ids.size
end
def unique_tags
@unique_tags ||= tag_ids.uniq.size
end
def first_action_at
first_action.created_at if first_action
end
def projects
user.projects.count
end
def active_projects
user.projects.active.count
end
def hidden_projects
user.projects.hidden.count
end
def completed_projects
user.projects.completed.count
end
def contexts
user.contexts.count
end
def visible_contexts
user.contexts.active.count
end
def hidden_contexts
user.contexts.hidden.count
end
def all_actions
actions.count
end
def completed_actions
actions.completed.count
end
def incomplete_actions
actions.not_completed.count
end
def deferred_actions
actions.deferred.count
end
def blocked_actions
actions.blocked.count
end
private
def actions
user.todos
end
def first_action
@first_action ||= user.todos.reorder("created_at ASC").first
end
def tag_ids
@tag_ids ||= Stats::UserTagsQuery.new(user).result.map(&:id)
end
end
end

View file

@ -1,9 +1,10 @@
<% @context_charts.each do |chart| %><%=
<% contexts.charts.each do |chart| %><%=
render :partial => 'chart', :locals => {:chart => chart}
-%><% end %>
<br style="clear:both">
<%= render :partial => 'contexts_list', :locals => {:contexts => @actions_per_context, :key => 'contexts'} -%>
<%= render :partial => 'contexts_list', :locals => {:contexts => contexts.actions, :key => 'contexts'} -%>
<%= render :partial => 'contexts_list', :locals => {:contexts => contexts.running_actions, :key => 'visible_contexts_with_incomplete_actions'} -%>
<%= render :partial => 'contexts_list', :locals => {:contexts => @running_actions_per_context, :key => 'visible_contexts_with_incomplete_actions'} -%>

View file

@ -1,6 +1,6 @@
<%= render :partial => 'projects_list', :locals => {:projects => @projects_and_actions, :key => 'projects', :n => :count} -%>
<%= render :partial => 'projects_list', :locals => {:projects => projects.actions, :key => 'projects', :n => :count} -%>
<%= render :partial => 'projects_list', :locals => {:projects => @projects_and_actions_last30days, :key => 'projects_30days', :n => :count} -%>
<%= render :partial => 'projects_list', :locals => {:projects => projects.actions_last30days, :key => 'projects_30days', :n => :count} -%>
<%= render :partial => 'projects_list', :locals => {:projects => @projects_and_runtime, :key => 'longrunning', :n => :age_in_days} -%>
<%= render :partial => 'projects_list', :locals => {:projects => projects.runtime, :key => 'longrunning', :n => :age_in_days} -%>

View file

@ -1,23 +1,23 @@
<p><%= t('stats.totals_project_count', :count => current_user.projects.count) %>
<%= t('stats.totals_active_project_count', :count => current_user.projects.active.count) %>,
<%= t('stats.totals_hidden_project_count', :count => current_user.projects.hidden.count) %>
<%= t('stats.totals_completed_project_count', :count => current_user.projects.completed.count) %></p>
<p><%= t('stats.totals_project_count', :count => totals.projects) %>
<%= t('stats.totals_active_project_count', :count => totals.active_projects) %>,
<%= t('stats.totals_hidden_project_count', :count => totals.hidden_projects) %>
<%= t('stats.totals_completed_project_count', :count => totals.completed_projects) %></p>
<p><%= t('stats.totals_context_count', :count => current_user.contexts.count ) %>
<%= t('stats.totals_visible_context_count', :count => current_user.contexts.active.count) %>
<%= t('stats.totals_hidden_context_count', :count => current_user.contexts.hidden.count) %>
<p><%= t('stats.totals_context_count', :count => totals.contexts) %>
<%= t('stats.totals_visible_context_count', :count => totals.visible_contexts) %>
<%= t('stats.totals_hidden_context_count', :count => totals.hidden_contexts) %>
<% unless current_user.todos.empty? -%>
<p><%= t('stats.totals_first_action', :date => format_date(@first_action.created_at)) %>
<%= t('stats.totals_action_count', :count => current_user.todos.count) %>,
<%= t('stats.totals_actions_completed', :count => current_user.todos.completed.count) %>
<% unless totals.empty? -%>
<p><%= t('stats.totals_first_action', :date => format_date(totals.first_action_at)) %>
<%= t('stats.totals_action_count', :count => totals.all_actions) %>,
<%= t('stats.totals_actions_completed', :count => totals.completed_actions) %>
<p><%= t('stats.totals_incomplete_actions', :count => current_user.todos.not_completed.count) %>
<%= t('stats.totals_deferred_actions', :count => current_user.todos.deferred.count) %>
<%= t('stats.totals_blocked_actions', :count => current_user.todos.blocked.count) %>
<p><%= t('stats.totals_incomplete_actions', :count => totals.incomplete_actions) %>
<%= t('stats.totals_deferred_actions', :count => totals.deferred_actions) %>
<%= t('stats.totals_blocked_actions', :count => totals.blocked_actions) %>
</p>
<p><%= t('stats.totals_tag_count', :count => @tags_count) %>
<%= t('stats.totals_unique_tags', :count => @unique_tags_count) %>
<p><%= t('stats.totals_tag_count', :count => totals.tags) %>
<%= t('stats.totals_unique_tags', :count => totals.unique_tags) %>
<% end -%>

View file

@ -1,22 +1,22 @@
<div class="stats_content">
<h2><%= t('stats.totals') %></h2>
<%= render :partial => 'totals' -%>
<%= render :partial => 'totals', :locals => {:totals => @stats.totals} -%>
<% unless current_user.todos.empty? -%>
<h2><%= t('stats.actions') %></h2>
<%= render :partial => 'actions', :locals => {:actions => @actions} -%>
<%= render :partial => 'actions', :locals => {:actions => @stats.actions} -%>
<h2><%= t('stats.contexts') %></h2>
<%= render :partial => 'contexts' -%>
<%= render :partial => 'contexts', :locals => {:contexts => @stats.contexts} -%>
<h2><%= t('stats.projects') %></h2>
<%= render :partial => 'projects' -%>
<%= render :partial => 'projects', :locals => {:projects => @stats.projects} -%>
<h2><%= t('stats.tags') %></h2>
<%= render :partial => 'tags', :locals => {:tag_cloud => @tag_cloud, :key => ''} -%>
<%= render :partial => 'tags', :locals => {:tag_cloud => @tag_cloud_90days, :key => '_90days'} -%>
<%= render :partial => 'tags', :locals => {:tag_cloud => @stats.tag_cloud, :key => ''} -%>
<%= render :partial => 'tags', :locals => {:tag_cloud => @stats.tag_cloud_90days, :key => '_90days'} -%>
<% else -%>