diff --git a/app/controllers/stats_controller.rb b/app/controllers/stats_controller.rb index b5fbf87a..15ded4a9 100644 --- a/app/controllers/stats_controller.rb +++ b/app/controllers/stats_controller.rb @@ -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) diff --git a/app/models/stats/contexts.rb b/app/models/stats/contexts.rb new file mode 100644 index 00000000..1aa04e38 --- /dev/null +++ b/app/models/stats/contexts.rb @@ -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 diff --git a/app/models/stats/index_page.rb b/app/models/stats/index_page.rb new file mode 100644 index 00000000..0fabe7b1 --- /dev/null +++ b/app/models/stats/index_page.rb @@ -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 diff --git a/app/models/stats/projects.rb b/app/models/stats/projects.rb new file mode 100644 index 00000000..45b437f4 --- /dev/null +++ b/app/models/stats/projects.rb @@ -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 diff --git a/app/models/stats/top_contexts_query.rb b/app/models/stats/top_contexts_query.rb index 69a5e9e9..d47abfb1 100644 --- a/app/models/stats/top_contexts_query.rb +++ b/app/models/stats/top_contexts_query.rb @@ -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 diff --git a/app/models/stats/totals.rb b/app/models/stats/totals.rb new file mode 100644 index 00000000..a80f8e71 --- /dev/null +++ b/app/models/stats/totals.rb @@ -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 diff --git a/app/views/stats/_contexts.html.erb b/app/views/stats/_contexts.html.erb index 1bd8e419..2f9502e1 100755 --- a/app/views/stats/_contexts.html.erb +++ b/app/views/stats/_contexts.html.erb @@ -1,9 +1,10 @@ -<% @context_charts.each do |chart| %><%= +<% contexts.charts.each do |chart| %><%= render :partial => 'chart', :locals => {:chart => chart} -%><% end %>
-<%= 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'} -%> diff --git a/app/views/stats/_projects.html.erb b/app/views/stats/_projects.html.erb index 5b2d6de3..918fc128 100755 --- a/app/views/stats/_projects.html.erb +++ b/app/views/stats/_projects.html.erb @@ -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} -%> diff --git a/app/views/stats/_totals.html.erb b/app/views/stats/_totals.html.erb index 4d2dac0c..7962ad49 100755 --- a/app/views/stats/_totals.html.erb +++ b/app/views/stats/_totals.html.erb @@ -1,23 +1,23 @@ -

<%= 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) %>

+

<%= 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) %>

-

<%= 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) %> +

<%= 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? -%> -

<%= 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? -%> +

<%= 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) %> -

<%= 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) %> +

<%= 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) %>

-

<%= t('stats.totals_tag_count', :count => @tags_count) %> - <%= t('stats.totals_unique_tags', :count => @unique_tags_count) %> +

<%= t('stats.totals_tag_count', :count => totals.tags) %> + <%= t('stats.totals_unique_tags', :count => totals.unique_tags) %> <% end -%> diff --git a/app/views/stats/index.html.erb b/app/views/stats/index.html.erb index cd3704cc..44c4f458 100755 --- a/app/views/stats/index.html.erb +++ b/app/views/stats/index.html.erb @@ -1,22 +1,22 @@

<%= t('stats.totals') %>

- <%= render :partial => 'totals' -%> + <%= render :partial => 'totals', :locals => {:totals => @stats.totals} -%> <% unless current_user.todos.empty? -%>

<%= t('stats.actions') %>

- <%= render :partial => 'actions', :locals => {:actions => @actions} -%> + <%= render :partial => 'actions', :locals => {:actions => @stats.actions} -%>

<%= t('stats.contexts') %>

- <%= render :partial => 'contexts' -%> + <%= render :partial => 'contexts', :locals => {:contexts => @stats.contexts} -%>

<%= t('stats.projects') %>

- <%= render :partial => 'projects' -%> + <%= render :partial => 'projects', :locals => {:projects => @stats.projects} -%>

<%= t('stats.tags') %>

- <%= 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 -%>