From 9147fb887cfd94d6ad50de2a4300458a215a9405 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Sat, 29 Nov 2008 15:35:17 +0100 Subject: [PATCH] refactor conditional finds to use named_scopes also use updated_at in calendar feed --- app/controllers/contexts_controller.rb | 4 +- app/controllers/feedlist_controller.rb | 10 ++-- app/controllers/projects_controller.rb | 28 +++++----- app/controllers/recurring_todos_controller.rb | 4 +- app/controllers/stats_controller.rb | 2 +- app/controllers/todos_controller.rb | 54 +++++++++---------- app/models/context.rb | 5 +- app/models/project.rb | 4 ++ app/models/todo.rb | 1 + app/views/todos/calendar.ics.erb | 2 +- 10 files changed, 61 insertions(+), 53 deletions(-) diff --git a/app/controllers/contexts_controller.rb b/app/controllers/contexts_controller.rb index 34c11d26..d09883a4 100644 --- a/app/controllers/contexts_controller.rb +++ b/app/controllers/contexts_controller.rb @@ -134,8 +134,8 @@ class ContextsController < ApplicationController def render_contexts_mobile lambda do @page_title = "TRACKS::List Contexts" - @active_contexts = @contexts.find(:all, { :conditions => ["hide = ?", false]}) - @hidden_contexts = @contexts.find(:all, { :conditions => ["hide = ?", true]}) + @active_contexts = @contexts.active + @hidden_contexts = @contexts.hidden @down_count = @active_contexts.size + @hidden_contexts.size cookies[:mobile_url]= {:value => request.request_uri, :secure => TRACKS_COOKIES_SECURE} render :action => 'index_mobile' diff --git a/app/controllers/feedlist_controller.rb b/app/controllers/feedlist_controller.rb index 68c7118c..4c2924e9 100644 --- a/app/controllers/feedlist_controller.rb +++ b/app/controllers/feedlist_controller.rb @@ -12,12 +12,12 @@ class FeedlistController < ApplicationController @contexts = current_user.contexts end - @active_projects = @projects.select{ |p| p.active? } - @hidden_projects = @projects.select{ |p| p.hidden? } - @completed_projects = @projects.select{ |p| p.completed? } + @active_projects = current_user.projects.active + @hidden_projects = current_user.projects.hidden + @completed_projects = current_user.projects.completed - @active_contexts = @contexts.select{ |c| !c.hidden? } - @hidden_contexts = @contexts.select{ |c| c.hidden? } + @active_contexts = current_user.contexts.active + @hidden_contexts = current_user.contexts.hidden respond_to do |format| format.html { render :layout => 'standard' } diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index b2489c7d..9443168f 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -31,7 +31,7 @@ class ProjectsController < ApplicationController end def projects_and_actions - @projects = @projects.select { |p| p.active? } + @projects = @projects.active respond_to do |format| format.text { render :action => 'index_text_projects_and_actions', :layout => false, :content_type => Mime::TEXT @@ -83,7 +83,7 @@ class ProjectsController < ApplicationController @go_to_project = params['go_to_project'] @saved = @project.save @project_not_done_counts = { @project.id => 0 } - @active_projects_count = current_user.projects.count(:conditions => "state = 'active'") + @active_projects_count = current_user.projects.active.count @contexts = current_user.contexts respond_to do |format| format.js { @down_count = current_user.projects.size } @@ -124,9 +124,9 @@ class ProjectsController < ApplicationController @project_not_done_counts[@project.id] = @project.reload().not_done_todo_count(:include_project_hidden_todos => true) end @contexts = current_user.contexts - @active_projects_count = current_user.projects.count(:conditions => "state = 'active'") - @hidden_projects_count = current_user.projects.count(:conditions => "state = 'hidden'") - @completed_projects_count = current_user.projects.count(:conditions => "state = 'completed'") + @active_projects_count = current_user.projects.active.count + @hidden_projects_count = current_user.projects.hidden.count + @completed_projects_count = current_user.projects.completed.count render :template => 'projects/update.js.rjs' return elsif boolean_param('update_status') @@ -161,9 +161,9 @@ class ProjectsController < ApplicationController def destroy @project.destroy - @active_projects_count = current_user.projects.count(:conditions => "state = 'active'") - @hidden_projects_count = current_user.projects.count(:conditions => "state = 'hidden'") - @completed_projects_count = current_user.projects.count(:conditions => "state = 'completed'") + @active_projects_count = current_user.projects.active.count + @hidden_projects_count = current_user.projects.hidden.count + @completed_projects_count = current_user.projects.completed.count respond_to do |format| format.js { @down_count = current_user.projects.size } format.xml { render :text => "Deleted project #{@project.name}" } @@ -199,9 +199,9 @@ class ProjectsController < ApplicationController lambda do @page_title = "TRACKS::List Projects" @count = current_user.projects.size - @active_projects = @projects.select{ |p| p.active? } - @hidden_projects = @projects.select{ |p| p.hidden? } - @completed_projects = @projects.select{ |p| p.completed? } + @active_projects = @projects.active + @hidden_projects = @projects.hidden + @completed_projects = @projects.completed @no_projects = @projects.empty? @projects.cache_note_counts @new_project = current_user.projects.build @@ -211,9 +211,9 @@ class ProjectsController < ApplicationController def render_projects_mobile lambda do - @active_projects = @projects.select{ |p| p.active? } - @hidden_projects = @projects.select{ |p| p.hidden? } - @completed_projects = @projects.select{ |p| p.completed? } + @active_projects = @projects.active + @hidden_projects = @projects.hidden + @completed_projects = @projects.completed @down_count = @active_projects.size + @hidden_projects.size + @completed_projects.size cookies[:mobile_url]= {:value => request.request_uri, :secure => TRACKS_COOKIES_SECURE} render :action => 'index_mobile' diff --git a/app/controllers/recurring_todos_controller.rb b/app/controllers/recurring_todos_controller.rb index 9928a4d5..668e6acb 100644 --- a/app/controllers/recurring_todos_controller.rb +++ b/app/controllers/recurring_todos_controller.rb @@ -118,7 +118,7 @@ class RecurringTodosController < ApplicationController else @message += " / did not create todo" end - @count = current_user.recurring_todos.count(:all, :conditions => ["state = ?", "active"]) + @count = current_user.recurring_todos.active.count else @message = "Error saving recurring todo" end @@ -140,7 +140,7 @@ class RecurringTodosController < ApplicationController # delete the recurring todo @saved = @recurring_todo.destroy - @remaining = current_user.recurring_todos.count(:all) + @remaining = current_user.recurring_todos.count respond_to do |format| diff --git a/app/controllers/stats_controller.rb b/app/controllers/stats_controller.rb index c74811d4..2d0f95c6 100755 --- a/app/controllers/stats_controller.rb +++ b/app/controllers/stats_controller.rb @@ -8,7 +8,7 @@ class StatsController < ApplicationController @page_title = 'TRACKS::Statistics' @unique_tags = @tags.count(:all, {:group=>"tag_id"}) - @hidden_contexts = @contexts.find(:all, {:conditions => ["hide = ? ", true]}) + @hidden_contexts = @contexts.hidden @first_action = @actions.find(:first, :order => "created_at ASC") get_stats_actions diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb index ad3a762a..6e61585e 100644 --- a/app/controllers/todos_controller.rb +++ b/app/controllers/todos_controller.rb @@ -14,7 +14,7 @@ class TodosController < ApplicationController @projects = current_user.projects.find(:all, :include => [:default_context]) @contexts = current_user.contexts.find(:all) - @contexts_to_show = @contexts.reject {|x| x.hide? } + @contexts_to_show = current_user.contexts.active respond_to do |format| format.html &render_todos_html @@ -28,7 +28,7 @@ class TodosController < ApplicationController end def new - @projects = current_user.projects.select { |p| p.active? } + @projects = current_user.projects.active @contexts = current_user.contexts.find(:all) respond_to do |format| format.m { @@ -116,7 +116,7 @@ class TodosController < ApplicationController def show respond_to do |format| format.m do - @projects = current_user.projects.select { |p| p.active? } + @projects = current_user.projects.active @contexts = current_user.contexts.find(:all) @edit_mobile = true @return_path=cookies[:mobile_url] @@ -442,33 +442,33 @@ class TodosController < ApplicationController due_next_week_date = due_this_week_date + 7.days due_this_month_date = Time.zone.now.end_of_month - @due_today = current_user.todos.find(:all, + @due_today = current_user.todos.not_completed.find(:all, :include => [:taggings, :tags], - :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due <= ?', 'active', 'deferred', due_today_date], + :conditions => ['todos.due <= ?', due_today_date], :order => "due") - @due_this_week = current_user.todos.find(:all, + @due_this_week = current_user.todos.not_completed.find(:all, :include => [:taggings, :tags], - :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_today_date, due_this_week_date], + :conditions => ['todos.due > ? AND todos.due <= ?', due_today_date, due_this_week_date], :order => "due") - @due_next_week = current_user.todos.find(:all, + @due_next_week = current_user.todos.not_completed.find(:all, :include => [:taggings, :tags], - :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_this_week_date, due_next_week_date], + :conditions => ['todos.due > ? AND todos.due <= ?', due_this_week_date, due_next_week_date], :order => "due") - @due_this_month = current_user.todos.find(:all, + @due_this_month = current_user.todos.not_completed.find(:all, :include => [:taggings, :tags], - :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_next_week_date, due_this_month_date], + :conditions => ['todos.due > ? AND todos.due <= ?', due_next_week_date, due_this_month_date], :order => "due") - @due_after_this_month = current_user.todos.find(:all, + @due_after_this_month = current_user.todos.not_completed.find(:all, :include => [:taggings, :tags], - :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ?', 'active', 'deferred', due_this_month_date], + :conditions => ['todos.due > ?', due_this_month_date], :order => "due") - + + @count = current_user.todos.not_completed.are_due.count + respond_to do |format| format.html format.ics { - @due_all = current_user.todos.find(:all, - :conditions => ['(todos.state = ? OR todos.state = ?) AND NOT todos.due IS NULL', 'active', 'deferred'], - :order => "due") + @due_all = current_user.todos.not_completed.are_due.find(:all, :order => "due") render :action => 'calendar', :layout => false, :content_type => Mime::ICS } end @@ -834,20 +834,20 @@ class TodosController < ApplicationController due_this_month_date = Time.zone.now.end_of_month case id when "due_today" - return 0 == current_user.todos.count(:all, - :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due <= ?', 'active', 'deferred', due_today_date]) + return 0 == current_user.todos.not_completed.count(:all, + :conditions => ['todos.due <= ?', due_today_date]) when "due_this_week" - return 0 == current_user.todos.count(:all, - :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_today_date, due_this_week_date]) + return 0 == current_user.todos.not_completed.count(:all, + :conditions => ['todos.due > ? AND todos.due <= ?', due_today_date, due_this_week_date]) when "due_next_week" - return 0 == current_user.todos.count(:all, - :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_this_week_date, due_next_week_date]) + return 0 == current_user.todos.not_completed.count(:all, + :conditions => ['todos.due > ? AND todos.due <= ?', due_this_week_date, due_next_week_date]) when "due_this_month" - return 0 == current_user.todos.count(:all, - :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ? AND todos.due <= ?', 'active', 'deferred', due_next_week_date, due_this_month_date]) + return 0 == current_user.todos.not_completed.count(:all, + :conditions => ['todos.due > ? AND todos.due <= ?', due_next_week_date, due_this_month_date]) when "due_after_this_month" - return 0 == current_user.todos.count(:all, - :conditions => ['(todos.state = ? OR todos.state = ?) AND todos.due > ?', 'active', 'deferred', due_this_month_date]) + return 0 == current_user.todos.not_completed.count(:all, + :conditions => ['todos.due > ?', due_this_month_date]) else raise Exception.new, "unknown due id for calendar: '#{id}'" end diff --git a/app/models/context.rb b/app/models/context.rb index 39cce497..41d27a53 100644 --- a/app/models/context.rb +++ b/app/models/context.rb @@ -2,7 +2,10 @@ class Context < ActiveRecord::Base has_many :todos, :dependent => :delete_all, :include => :project, :order => "todos.completed_at DESC" belongs_to :user - + + named_scope :active, :conditions => { :hide => false } + named_scope :hidden, :conditions => { :hide => true } + acts_as_list :scope => :user extend NamePartFinder include Tracks::TodoList diff --git a/app/models/project.rb b/app/models/project.rb index 396d49cc..4013e985 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -3,6 +3,10 @@ class Project < ActiveRecord::Base has_many :notes, :dependent => :delete_all, :order => "created_at DESC" belongs_to :default_context, :class_name => "Context", :foreign_key => "default_context_id" belongs_to :user + + named_scope :active, :conditions => { :state => 'active' } + named_scope :hidden, :conditions => { :state => 'hidden' } + named_scope :completed, :conditions => { :state => 'completed'} validates_presence_of :name, :message => "project must have a name" validates_length_of :name, :maximum => 255, :message => "project name must be less than 256 characters" diff --git a/app/models/todo.rb b/app/models/todo.rb index f432037d..5aed02be 100644 --- a/app/models/todo.rb +++ b/app/models/todo.rb @@ -7,6 +7,7 @@ class Todo < ActiveRecord::Base named_scope :active, :conditions => { :state => 'active' } named_scope :not_completed, :conditions => ['NOT state = ? ', 'completed'] + named_scope :are_due, :conditions => ['NOT todos.due IS NULL'] STARRED_TAG_NAME = "starred" diff --git a/app/views/todos/calendar.ics.erb b/app/views/todos/calendar.ics.erb index 46a02f60..6f3960dc 100644 --- a/app/views/todos/calendar.ics.erb +++ b/app/views/todos/calendar.ics.erb @@ -20,7 +20,7 @@ CLASS:PUBLIC CATEGORIES:Tracks CREATED:<%= todo.created_at.strftime("%Y%m%dT%H%M%SZ") %> DESCRIPTION:<%= format_ical_notes(todo.notes) %> -LAST-MODIFIED:<%= due_date.strftime("%Y%m%dT%H%M%SZ") %> +LAST-MODIFIED:<%= updated_at.strftime("%Y%m%dT%H%M%SZ") %> LOCATION: SEQUENCE:0 STATUS:CONFIRMED