small cleanups

This commit is contained in:
Reinier Balt 2009-02-05 21:55:33 +01:00
parent 97f9a31d17
commit b8fd942eb4
4 changed files with 534 additions and 538 deletions

View file

@ -1,268 +1,266 @@
# The filters added to this controller will be run for all controllers in the # The filters added to this controller will be run for all controllers in the
# application. Likewise will all the methods added be available for all # application. Likewise will all the methods added be available for all
# controllers. # controllers.
require_dependency "login_system" require_dependency "login_system"
require_dependency "tracks/source_view" require_dependency "tracks/source_view"
require "redcloth" require "redcloth"
require 'date' require 'date'
require 'time' require 'time'
# Commented the following line because of #744. It prevented rake db:migrate to # Commented the following line because of #744. It prevented rake db:migrate to
# run because this tag went looking for the taggings table that did not exist # run because this tag went looking for the taggings table that did not exist
# when you feshly create a new database Old comment: We need this in development # when you feshly create a new database Old comment: We need this in development
# mode, or you get 'method missing' errors # mode, or you get 'method missing' errors
# #
# Tag # Tag
class CannotAccessContext < RuntimeError; end class CannotAccessContext < RuntimeError; end
class ApplicationController < ActionController::Base class ApplicationController < ActionController::Base
protect_from_forgery :secret => SITE_CONFIG['salt'] protect_from_forgery :secret => SITE_CONFIG['salt']
helper :application helper :application
include LoginSystem include LoginSystem
helper_method :current_user, :prefs helper_method :current_user, :prefs
layout proc{ |controller| controller.mobile? ? "mobile" : "standard" } layout proc{ |controller| controller.mobile? ? "mobile" : "standard" }
before_filter :set_session_expiration before_filter :set_session_expiration
before_filter :set_time_zone before_filter :set_time_zone
prepend_before_filter :login_required prepend_before_filter :login_required
prepend_before_filter :enable_mobile_content_negotiation prepend_before_filter :enable_mobile_content_negotiation
after_filter :set_charset after_filter :set_charset
include ActionView::Helpers::TextHelper
include ActionView::Helpers::SanitizeHelper
include ActionView::Helpers::TextHelper extend ActionView::Helpers::SanitizeHelper::ClassMethods
include ActionView::Helpers::SanitizeHelper helper_method :format_date, :markdown
extend ActionView::Helpers::SanitizeHelper::ClassMethods
helper_method :format_date, :markdown # By default, sets the charset to UTF-8 if it isn't already set
def set_charset
# By default, sets the charset to UTF-8 if it isn't already set headers["Content-Type"] ||= "text/html; charset=UTF-8"
def set_charset end
headers["Content-Type"] ||= "text/html; charset=UTF-8"
end def set_session_expiration
# http://wiki.rubyonrails.com/rails/show/HowtoChangeSessionOptions
def set_session_expiration unless session == nil
# http://wiki.rubyonrails.com/rails/show/HowtoChangeSessionOptions return if @controller_name == 'feed' or session['noexpiry'] == "on"
unless session == nil # If the method is called by the feed controller (which we don't have
return if @controller_name == 'feed' or session['noexpiry'] == "on" # under session control) or if we checked the box to keep logged in on
# If the method is called by the feed controller (which we don't have # login don't set the session expiry time.
# under session control) or if we checked the box to keep logged in on if session
# login don't set the session expiry time. # Get expiry time (allow ten seconds window for the case where we have
if session # none)
# Get expiry time (allow ten seconds window for the case where we have expiry_time = session['expiry_time'] || Time.now + 10
# none) if expiry_time < Time.now
expiry_time = session['expiry_time'] || Time.now + 10 # Too late, matey... bang goes your session!
if expiry_time < Time.now reset_session
# Too late, matey... bang goes your session! else
reset_session # Okay, you get another hour
else session['expiry_time'] = Time.now + (60*60)
# Okay, you get another hour end
session['expiry_time'] = Time.now + (60*60) end
end end
end end
end
end def render_failure message, status = 404
render :text => message, :status => status
def render_failure message, status = 404 end
render :text => message, :status => status
end # def rescue_action(exception)
# log_error(exception) if logger
# def rescue_action(exception) # respond_to do |format|
# log_error(exception) if logger # format.html do
# respond_to do |format| # notify :warning, "An error occurred on the server."
# format.html do # render :action => "index"
# notify :warning, "An error occurred on the server." # end
# render :action => "index" # format.js { render :action => 'error' }
# end # format.xml { render :text => 'An error occurred on the server.' + $! }
# format.js { render :action => 'error' } # end
# format.xml { render :text => 'An error occurred on the server.' + $! } # end
# end
# end # Returns a count of next actions in the given context or project The result
# is count and a string descriptor, correctly pluralised if there are no
# Returns a count of next actions in the given context or project The result # actions or multiple actions
# is count and a string descriptor, correctly pluralised if there are no #
# actions or multiple actions def count_undone_todos_phrase(todos_parent, string="actions")
# count = count_undone_todos(todos_parent)
def count_undone_todos_phrase(todos_parent, string="actions") if count == 1
count = count_undone_todos(todos_parent) word = string.singularize
if count == 1 else
word = string.singularize word = string.pluralize
else end
word = string.pluralize return count.to_s + "&nbsp;" + word
end end
return count.to_s + "&nbsp;" + word
end def count_undone_todos(todos_parent)
if todos_parent.nil?
def count_undone_todos(todos_parent) count = 0
if todos_parent.nil? elsif (todos_parent.is_a?(Project) && todos_parent.hidden?)
count = 0 count = eval "@project_project_hidden_todo_counts[#{todos_parent.id}]"
elsif (todos_parent.is_a?(Project) && todos_parent.hidden?) else
count = eval "@project_project_hidden_todo_counts[#{todos_parent.id}]" count = eval "@#{todos_parent.class.to_s.downcase}_not_done_counts[#{todos_parent.id}]"
else end
count = eval "@#{todos_parent.class.to_s.downcase}_not_done_counts[#{todos_parent.id}]" count || 0
end end
count || 0
end # Convert a date object to the format specified in the user's preferences in
# config/settings.yml
# Convert a date object to the format specified in the user's preferences in #
# config/settings.yml def format_date(date)
# if date
def format_date(date) date_format = prefs.date_format
if date formatted_date = date.in_time_zone(prefs.time_zone).strftime("#{date_format}")
date_format = prefs.date_format else
formatted_date = date.in_time_zone(prefs.time_zone).strftime("#{date_format}") formatted_date = ''
else end
formatted_date = '' formatted_date
end end
formatted_date
end # Uses RedCloth to transform text using either Textile or Markdown Need to
# require redcloth above RedCloth 3.0 or greater is needed to use Markdown,
# Uses RedCloth to transform text using either Textile or Markdown Need to # otherwise it only handles Textile
# require redcloth above RedCloth 3.0 or greater is needed to use Markdown, #
# otherwise it only handles Textile def markdown(text)
# RedCloth.new(text).to_html
def markdown(text) end
RedCloth.new(text).to_html
end def build_default_project_context_name_map(projects)
Hash[*projects.reject{ |p| p.default_context.nil? }.map{ |p| [p.name, p.default_context.name] }.flatten].to_json
def build_default_project_context_name_map(projects) end
Hash[*projects.reject{ |p| p.default_context.nil? }.map{ |p| [p.name, p.default_context.name] }.flatten].to_json
end # Here's the concept behind this "mobile content negotiation" hack: In
# addition to the main, AJAXy Web UI, Tracks has a lightweight low-feature
# Here's the concept behind this "mobile content negotiation" hack: In # 'mobile' version designed to be suitablef or use from a phone or PDA. It
# addition to the main, AJAXy Web UI, Tracks has a lightweight low-feature # makes some sense that tne pages of that mobile version are simply alternate
# 'mobile' version designed to be suitablef or use from a phone or PDA. It # representations of the same Todo resources. The implementation goal was to
# makes some sense that tne pages of that mobile version are simply alternate # treat mobile as another format and be able to use respond_to to render both
# representations of the same Todo resources. The implementation goal was to # versions. Unfortunately, I ran into a lot of trouble simply registering a
# treat mobile as another format and be able to use respond_to to render both # new mime type 'text/html' with format :m because :html already is linked to
# versions. Unfortunately, I ran into a lot of trouble simply registering a # that mime type and the new registration was forcing all html requests to be
# new mime type 'text/html' with format :m because :html already is linked to # rendered in the mobile view. The before_filter and after_filter hackery
# that mime type and the new registration was forcing all html requests to be # below accomplishs that implementation goal by using a 'fake' mime type
# rendered in the mobile view. The before_filter and after_filter hackery # during the processing and then setting it to 'text/html' in an
# below accomplishs that implementation goal by using a 'fake' mime type # 'after_filter' -LKM 2007-04-01
# during the processing and then setting it to 'text/html' in an def mobile?
# 'after_filter' -LKM 2007-04-01 return params[:format] == 'm'
def mobile? end
return params[:format] == 'm'
end def enable_mobile_content_negotiation
if mobile?
def enable_mobile_content_negotiation request.format = :m
if mobile? end
request.format = :m end
end
end def create_todo_from_recurring_todo(rt, date=nil)
# create todo and initialize with data from recurring_todo rt
def create_todo_from_recurring_todo(rt, date=nil) todo = current_user.todos.build( { :description => rt.description, :notes => rt.notes, :project_id => rt.project_id, :context_id => rt.context_id})
# create todo and initialize with data from recurring_todo rt
todo = current_user.todos.build( { :description => rt.description, :notes => rt.notes, :project_id => rt.project_id, :context_id => rt.context_id}) # set dates
todo.recurring_todo_id = rt.id
# set dates todo.due = rt.get_due_date(date)
todo.recurring_todo_id = rt.id
todo.due = rt.get_due_date(date) show_from_date = rt.get_show_from_date(date)
if show_from_date.nil?
show_from_date = rt.get_show_from_date(date) todo.show_from=nil
if show_from_date.nil? else
todo.show_from=nil # make sure that show_from is not in the past
else todo.show_from = show_from_date < Time.zone.now ? nil : show_from_date
# make sure that show_from is not in the past end
todo.show_from = show_from_date < Time.zone.now ? nil : show_from_date
end saved = todo.save
if saved
saved = todo.save todo.tag_with(rt.tag_list)
if saved todo.tags.reload
todo.tag_with(rt.tag_list) end
todo.tags.reload
end # increate number of occurences created from recurring todo
rt.inc_occurences
# increate number of occurences created from recurring todo
rt.inc_occurences # mark recurring todo complete if there are no next actions left
checkdate = todo.due.nil? ? todo.show_from : todo.due
# mark recurring todo complete if there are no next actions left rt.toggle_completion! unless rt.has_next_todo(checkdate)
checkdate = todo.due.nil? ? todo.show_from : todo.due
rt.toggle_completion! unless rt.has_next_todo(checkdate) return saved ? todo : nil
end
return saved ? todo : nil
end protected
protected def admin_login_required
unless User.find_by_id_and_is_admin(session['user_id'], true)
def admin_login_required render :text => "401 Unauthorized: Only admin users are allowed access to this function.", :status => 401
unless User.find_by_id_and_is_admin(session['user_id'], true) return false
render :text => "401 Unauthorized: Only admin users are allowed access to this function.", :status => 401 end
return false end
end
end def redirect_back_or_home
respond_to do |format|
def redirect_back_or_home format.html { redirect_back_or_default home_url }
respond_to do |format| format.m { redirect_back_or_default mobile_url }
format.html { redirect_back_or_default home_url } end
format.m { redirect_back_or_default mobile_url } end
end
end def boolean_param(param_name)
return false if param_name.blank?
def boolean_param(param_name) s = params[param_name]
return false if param_name.blank? return false if s.blank? || s == false || s =~ /^false$/i
s = params[param_name] return true if s == true || s =~ /^true$/i
return false if s.blank? || s == false || s =~ /^false$/i raise ArgumentError.new("invalid value for Boolean: \"#{s}\"")
return true if s == true || s =~ /^true$/i end
raise ArgumentError.new("invalid value for Boolean: \"#{s}\"")
end def self.openid_enabled?
Tracks::Config.openid_enabled?
def self.openid_enabled? end
Tracks::Config.openid_enabled?
end def openid_enabled?
self.class.openid_enabled?
def openid_enabled? end
self.class.openid_enabled?
end private
private def parse_date_per_user_prefs( s )
prefs.parse_date(s)
def parse_date_per_user_prefs( s ) end
prefs.parse_date(s)
end def init_data_for_sidebar
@completed_projects = current_user.projects.completed
def init_data_for_sidebar @hidden_projects = current_user.projects.hidden
@completed_projects = current_user.projects.completed @active_projects = current_user.projects.active
@hidden_projects = current_user.projects.hidden
@active_projects = current_user.projects.active @active_contexts = current_user.contexts.active
@hidden_contexts = current_user.contexts.hidden
@active_contexts = current_user.contexts.active
@hidden_contexts = current_user.contexts.hidden init_not_done_counts
if prefs.show_hidden_projects_in_sidebar
init_not_done_counts init_project_hidden_todo_counts(['project'])
if prefs.show_hidden_projects_in_sidebar end
init_project_hidden_todo_counts(['project']) end
end
end def init_not_done_counts(parents = ['project','context'])
parents.each do |parent|
def init_not_done_counts(parents = ['project','context']) eval("@#{parent}_not_done_counts = @#{parent}_not_done_counts || current_user.todos.active.count(:group => :#{parent}_id)")
parents.each do |parent| end
eval("@#{parent}_not_done_counts = @#{parent}_not_done_counts || current_user.todos.active.count(:group => :#{parent}_id)") end
end
end def init_project_hidden_todo_counts(parents = ['project','context'])
parents.each do |parent|
def init_project_hidden_todo_counts(parents = ['project','context']) eval("@#{parent}_project_hidden_todo_counts = @#{parent}_project_hidden_todo_counts || current_user.todos.count(:conditions => ['state = ? or state = ?', 'project_hidden', 'active'], :group => :#{parent}_id)")
parents.each do |parent| end
eval("@#{parent}_project_hidden_todo_counts = @#{parent}_project_hidden_todo_counts || current_user.todos.count(:conditions => ['state = ? or state = ?', 'project_hidden', 'active'], :group => :#{parent}_id)") end
end
end # Set the contents of the flash message from a controller Usage: notify
# :warning, "This is the message" Sets the flash of type 'warning' to "This is
# Set the contents of the flash message from a controller Usage: notify # the message"
# :warning, "This is the message" Sets the flash of type 'warning' to "This is def notify(type, message)
# the message" flash[type] = message
def notify(type, message) logger.error("ERROR: #{message}") if type == :error
flash[type] = message end
logger.error("ERROR: #{message}") if type == :error
end def set_time_zone
Time.zone = current_user.prefs.time_zone if logged_in?
def set_time_zone end
Time.zone = current_user.prefs.time_zone if logged_in?
end end
end

View file

@ -175,7 +175,7 @@ class ProjectsController < ApplicationController
def order def order
project_ids = params["list-active-projects"] || params["list-hidden-projects"] || params["list-completed-projects"] project_ids = params["list-active-projects"] || params["list-hidden-projects"] || params["list-completed-projects"]
projects = current_user.projects.update_positions( project_ids ) @projects = current_user.projects.update_positions( project_ids )
render :nothing => true render :nothing => true
rescue rescue
notify :error, $! notify :error, $!

View file

@ -1,268 +1,266 @@
class RecurringTodosController < ApplicationController class RecurringTodosController < ApplicationController
helper :todos, :recurring_todos helper :todos, :recurring_todos
append_before_filter :init, :only => [:index, :new, :edit] append_before_filter :init, :only => [:index, :new, :edit]
append_before_filter :get_recurring_todo_from_param, :only => [:destroy, :toggle_check, :toggle_star, :edit, :update] append_before_filter :get_recurring_todo_from_param, :only => [:destroy, :toggle_check, :toggle_star, :edit, :update]
def index def index
find_and_inactivate find_and_inactivate
@recurring_todos = current_user.recurring_todos.active @recurring_todos = current_user.recurring_todos.active
@completed_recurring_todos = current_user.recurring_todos.completed @completed_recurring_todos = current_user.recurring_todos.completed
@no_recurring_todos = @recurring_todos.size == 0 @no_recurring_todos = @recurring_todos.size == 0
@no_completed_recurring_todos = @completed_recurring_todos.size == 0 @no_completed_recurring_todos = @completed_recurring_todos.size == 0
@count = @recurring_todos.size @count = @recurring_todos.size
@page_title = "TRACKS::Recurring Actions" @page_title = "TRACKS::Recurring Actions"
end end
def new def new
end end
def show def show
end end
def edit def edit
respond_to do |format| respond_to do |format|
format.js format.js
end end
end end
def update def update
@recurring_todo.tag_with(params[:tag_list]) if params[:tag_list] @recurring_todo.tag_with(params[:tag_list]) if params[:tag_list]
@original_item_context_id = @recurring_todo.context_id @original_item_context_id = @recurring_todo.context_id
@original_item_project_id = @recurring_todo.project_id @original_item_project_id = @recurring_todo.project_id
# we needed to rename the recurring_period selector in the edit form because # we needed to rename the recurring_period selector in the edit form because
# the form for a new recurring todo and the edit form are on the same page. # the form for a new recurring todo and the edit form are on the same page.
# Same goes for start_from and end_date # Same goes for start_from and end_date
params['recurring_todo']['recurring_period']=params['recurring_edit_todo']['recurring_period'] params['recurring_todo']['recurring_period']=params['recurring_edit_todo']['recurring_period']
params['recurring_todo']['end_date']=parse_date_per_user_prefs(params['recurring_todo_edit_end_date']) params['recurring_todo']['end_date']=parse_date_per_user_prefs(params['recurring_todo_edit_end_date'])
params['recurring_todo']['start_from']=parse_date_per_user_prefs(params['recurring_todo_edit_start_from']) params['recurring_todo']['start_from']=parse_date_per_user_prefs(params['recurring_todo_edit_start_from'])
# update project # update project
if params['recurring_todo']['project_id'].blank? && !params['project_name'].nil? if params['recurring_todo']['project_id'].blank? && !params['project_name'].nil?
if params['project_name'] == 'None' if params['project_name'] == 'None'
project = Project.null_object project = Project.null_object
else else
project = current_user.projects.find_by_name(params['project_name'].strip) project = current_user.projects.find_by_name(params['project_name'].strip)
unless project unless project
project = current_user.projects.build project = current_user.projects.build
project.name = params['project_name'].strip project.name = params['project_name'].strip
project.save project.save
@new_project_created = true @new_project_created = true
end end
end end
params["recurring_todo"]["project_id"] = project.id params["recurring_todo"]["project_id"] = project.id
end end
# update context # update context
if params['recurring_todo']['context_id'].blank? && !params['context_name'].blank? if params['recurring_todo']['context_id'].blank? && !params['context_name'].blank?
context = current_user.contexts.find_by_name(params['context_name'].strip) context = current_user.contexts.find_by_name(params['context_name'].strip)
unless context unless context
context = current_user.contexts.build context = current_user.contexts.build
context.name = params['context_name'].strip context.name = params['context_name'].strip
context.save context.save
@new_context_created = true @new_context_created = true
end end
params["recurring_todo"]["context_id"] = context.id params["recurring_todo"]["context_id"] = context.id
end end
params["recurring_todo"]["weekly_return_monday"]=' ' if params["recurring_todo"]["weekly_return_monday"].nil? # make sure that we set weekly_return_xxx to empty (space) when they are
params["recurring_todo"]["weekly_return_tuesday"]=' ' if params["recurring_todo"]["weekly_return_tuesday"].nil? # not checked (and thus not present in params["recurring_todo"])
params["recurring_todo"]["weekly_return_wednesday"]=' ' if params["recurring_todo"]["weekly_return_wednesday"].nil? %w{"monday","tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"}.each do |day|
params["recurring_todo"]["weekly_return_thursday"]=' ' if params["recurring_todo"]["weekly_return_thursday"].nil? params["recurring_todo"]["weekly_return_"+day]=' ' if params["recurring_todo"]["weekly_return_"+day].nil?
params["recurring_todo"]["weekly_return_friday"]=' ' if params["recurring_todo"]["weekly_return_friday"].nil? end
params["recurring_todo"]["weekly_return_saturday"]=' ' if params["recurring_todo"]["weekly_return_saturday"].nil?
params["recurring_todo"]["weekly_return_sunday"]=' ' if params["recurring_todo"]["weekly_return_sunday"].nil? @saved = @recurring_todo.update_attributes params["recurring_todo"]
@saved = @recurring_todo.update_attributes params["recurring_todo"] respond_to do |format|
format.js
respond_to do |format| end
format.js end
end
end def create
p = RecurringTodoCreateParamsHelper.new(params)
def create p.attributes['end_date']=parse_date_per_user_prefs(p.attributes['end_date'])
p = RecurringTodoCreateParamsHelper.new(params) p.attributes['start_from']=parse_date_per_user_prefs(p.attributes['start_from'])
p.attributes['end_date']=parse_date_per_user_prefs(p.attributes['end_date'])
p.attributes['start_from']=parse_date_per_user_prefs(p.attributes['start_from']) @recurring_todo = current_user.recurring_todos.build(p.selector_attributes)
@recurring_todo.update_attributes(p.attributes)
@recurring_todo = current_user.recurring_todos.build(p.selector_attributes)
@recurring_todo.update_attributes(p.attributes) if p.project_specified_by_name?
project = current_user.projects.find_or_create_by_name(p.project_name)
if p.project_specified_by_name? @new_project_created = project.new_record_before_save?
project = current_user.projects.find_or_create_by_name(p.project_name) @recurring_todo.project_id = project.id
@new_project_created = project.new_record_before_save? end
@recurring_todo.project_id = project.id
end if p.context_specified_by_name?
context = current_user.contexts.find_or_create_by_name(p.context_name)
if p.context_specified_by_name? @new_context_created = context.new_record_before_save?
context = current_user.contexts.find_or_create_by_name(p.context_name) @recurring_todo.context_id = context.id
@new_context_created = context.new_record_before_save? end
@recurring_todo.context_id = context.id
end @recurring_saved = @recurring_todo.save
unless (@recurring_saved == false) || p.tag_list.blank?
@recurring_saved = @recurring_todo.save @recurring_todo.tag_with(p.tag_list)
unless (@recurring_saved == false) || p.tag_list.blank? @recurring_todo.tags.reload
@recurring_todo.tag_with(p.tag_list) end
@recurring_todo.tags.reload
end if @recurring_saved
@message = "The recurring todo was saved"
if @recurring_saved @todo_saved = create_todo_from_recurring_todo(@recurring_todo).nil? == false
@message = "The recurring todo was saved" if @todo_saved
@todo_saved = create_todo_from_recurring_todo(@recurring_todo).nil? == false @message += " / created a new todo"
if @todo_saved else
@message += " / created a new todo" @message += " / did not create todo"
else end
@message += " / did not create todo" @count = current_user.recurring_todos.active.count
end else
@count = current_user.recurring_todos.active.count @message = "Error saving recurring todo"
else end
@message = "Error saving recurring todo"
end respond_to do |format|
format.js
respond_to do |format| end
format.js end
end
end def destroy
def destroy # remove all references to this recurring todo
@todos = @recurring_todo.todos
# remove all references to this recurring todo @number_of_todos = @todos.size
@todos = @recurring_todo.todos @todos.each do |t|
@number_of_todos = @todos.size t.recurring_todo_id = nil
@todos.each do |t| t.save
t.recurring_todo_id = nil end
t.save
end # delete the recurring todo
@saved = @recurring_todo.destroy
# delete the recurring todo @remaining = current_user.recurring_todos.count
@saved = @recurring_todo.destroy
@remaining = current_user.recurring_todos.count respond_to do |format|
respond_to do |format| format.html do
if @saved
format.html do notify :notice, "Successfully deleted recurring action", 2.0
if @saved redirect_to :action => 'index'
notify :notice, "Successfully deleted recurring action", 2.0 else
redirect_to :action => 'index' notify :error, "Failed to delete the recurring action", 2.0
else redirect_to :action => 'index'
notify :error, "Failed to delete the recurring action", 2.0 end
redirect_to :action => 'index' end
end
end format.js do
render
format.js do end
render end
end end
end
end def toggle_check
@saved = @recurring_todo.toggle_completion!
def toggle_check
@saved = @recurring_todo.toggle_completion! @count = current_user.recurring_todos.active.count
@remaining = @count
@count = current_user.recurring_todos.active.count
@remaining = @count if @recurring_todo.active?
@remaining = current_user.recurring_todos.completed.count
if @recurring_todo.active?
@remaining = current_user.recurring_todos.completed.count # from completed back to active -> check if there is an active todo
# current_user.todos.count(:all, {:conditions => ["state = ? AND recurring_todo_id = ?", 'active',params[:id]]})
# from completed back to active -> check if there is an active todo @active_todos = @recurring_todo.todos.active.count
# current_user.todos.count(:all, {:conditions => ["state = ? AND recurring_todo_id = ?", 'active',params[:id]]}) # create todo if there is no active todo belonging to the activated
@active_todos = @recurring_todo.todos.active.count # recurring_todo
# create todo if there is no active todo belonging to the activated @new_recurring_todo = create_todo_from_recurring_todo(@recurring_todo) if @active_todos == 0
# recurring_todo end
@new_recurring_todo = create_todo_from_recurring_todo(@recurring_todo) if @active_todos == 0
end respond_to do |format|
format.js
respond_to do |format| end
format.js end
end
end def toggle_star
@recurring_todo.toggle_star!
def toggle_star @saved = @recurring_todo.save!
@recurring_todo.toggle_star! respond_to do |format|
@saved = @recurring_todo.save! format.js
respond_to do |format| end
format.js end
end
end class RecurringTodoCreateParamsHelper
class RecurringTodoCreateParamsHelper def initialize(params)
@params = params['request'] || params
def initialize(params) @attributes = params['request'] && params['request']['recurring_todo'] || params['recurring_todo']
@params = params['request'] || params
@attributes = params['request'] && params['request']['recurring_todo'] || params['recurring_todo'] # make sure all selectors (recurring_period, recurrence_selector,
# daily_selector, monthly_selector and yearly_selector) are first in hash
# make sure all selectors (recurring_period, recurrence_selector, # so that they are processed first by the model
# daily_selector, monthly_selector and yearly_selector) are first in hash @selector_attributes = {
# so that they are processed first by the model 'recurring_period' => @attributes['recurring_period'],
@selector_attributes = { 'daily_selector' => @attributes['daily_selector'],
'recurring_period' => @attributes['recurring_period'], 'monthly_selector' => @attributes['monthly_selector'],
'daily_selector' => @attributes['daily_selector'], 'yearly_selector' => @attributes['yearly_selector']
'monthly_selector' => @attributes['monthly_selector'], }
'yearly_selector' => @attributes['yearly_selector'] end
}
end def attributes
@attributes
def attributes end
@attributes
end def selector_attributes
return @selector_attributes
def selector_attributes end
return @selector_attributes
end def project_name
@params['project_name'].strip unless @params['project_name'].nil?
def project_name end
@params['project_name'].strip unless @params['project_name'].nil?
end def context_name
@params['context_name'].strip unless @params['context_name'].nil?
def context_name end
@params['context_name'].strip unless @params['context_name'].nil?
end def tag_list
@params['tag_list']
def tag_list end
@params['tag_list']
end def project_specified_by_name?
return false unless @attributes['project_id'].blank?
def project_specified_by_name? return false if project_name.blank?
return false unless @attributes['project_id'].blank? return false if project_name == 'None'
return false if project_name.blank? true
return false if project_name == 'None' end
true
end def context_specified_by_name?
return false unless @attributes['context_id'].blank?
def context_specified_by_name? return false if context_name.blank?
return false unless @attributes['context_id'].blank? true
return false if context_name.blank? end
true
end end
end private
private def init
@days_of_week = [ ['Sunday',0], ['Monday',1], ['Tuesday', 2], ['Wednesday',3], ['Thursday',4], ['Friday',5], ['Saturday',6]]
def init @months_of_year = [
@days_of_week = [ ['Sunday',0], ['Monday',1], ['Tuesday', 2], ['Wednesday',3], ['Thursday',4], ['Friday',5], ['Saturday',6]] ['January',1], ['Februari',2], ['March', 3], ['April',4], ['May',5], ['June',6],
@months_of_year = [ ['July',7], ['August',8], ['September',9], ['October', 10], ['November', 11], ['December',12]]
['January',1], ['Februari',2], ['March', 3], ['April',4], ['May',5], ['June',6], @xth_day = [['first',1],['second',2],['third',3],['fourth',4],['last',5]]
['July',7], ['August',8], ['September',9], ['October', 10], ['November', 11], ['December',12]] @projects = current_user.projects.find(:all, :include => [:default_context])
@xth_day = [['first',1],['second',2],['third',3],['fourth',4],['last',5]] @contexts = current_user.contexts.find(:all)
@projects = current_user.projects.find(:all, :include => [:default_context]) @default_project_context_name_map = build_default_project_context_name_map(@projects).to_json
@contexts = current_user.contexts.find(:all) end
@default_project_context_name_map = build_default_project_context_name_map(@projects).to_json
end def get_recurring_todo_from_param
@recurring_todo = current_user.recurring_todos.find(params[:id])
def get_recurring_todo_from_param end
@recurring_todo = current_user.recurring_todos.find(params[:id])
end def find_and_inactivate
# find active recurring todos without active todos and inactivate them
def find_and_inactivate recurring_todos = current_user.recurring_todos.active
# find active recurring todos without active todos and inactivate them recurring_todos.each { |rt| rt.toggle_completion! if rt.todos.not_completed.count == 0}
recurring_todos = current_user.recurring_todos.active end
recurring_todos.each { |rt| rt.toggle_completion! if rt.todos.not_completed.count == 0}
end end
end

View file

@ -14,8 +14,8 @@ class SearchController < ApplicationController
@found_tags = Tagging.find_by_sql([ @found_tags = Tagging.find_by_sql([
"SELECT DISTINCT tags.name as name "+ "SELECT DISTINCT tags.name as name "+
"FROM tags "+ "FROM tags "+
"LEFT JOIN taggings ON tags.id = taggings.tag_id "+ "LEFT JOIN taggings ON tags.id = taggings.tag_id "+
"LEFT JOIN todos ON taggings.taggable_id = todos.id "+ "LEFT JOIN todos ON taggings.taggable_id = todos.id "+
"WHERE todos.user_id=? "+ "WHERE todos.user_id=? "+
"AND tags.name LIKE ? ", current_user.id, terms]) "AND tags.name LIKE ? ", current_user.id, terms])