before_filter :find_optional_project, :only => [:index, :changes, :gantt, :calendar]
accept_key_auth :index, :show, :changes
+ rescue_from Query::StatementInvalid, :with => :query_statement_invalid
+
helper :journals
helper :projects
include ProjectsHelper
end
end
end
+
+ # Rescues an invalid query statement. Just in case...
+ def query_statement_invalid(exception)
+ logger.error "Query::StatementInvalid: #{exception.message}" if logger
+ session.delete(:query)
+ sort_clear
+ render_error "An error occurred while executing the query and has been logged. Please report this error to your Redmine administrator."
+ end
end
end
class Query < ActiveRecord::Base
+ class StatementInvalid < ::ActiveRecord::StatementInvalid
+ end
+
belongs_to :project
belongs_to :user
serialize :filters
# Returns the issue count
def issue_count
Issue.count(:include => [:status, :project], :conditions => statement)
+ rescue ::ActiveRecord::StatementInvalid => e
+ raise StatementInvalid.new(e.message)
end
# Returns the issue count by group or nil if query is not grouped
else
nil
end
+ rescue ::ActiveRecord::StatementInvalid => e
+ raise StatementInvalid.new(e.message)
end
# Returns the issues
:order => order_option,
:limit => options[:limit],
:offset => options[:offset]
+ rescue ::ActiveRecord::StatementInvalid => e
+ raise StatementInvalid.new(e.message)
end
# Returns the journals
:order => options[:order],
:limit => options[:limit],
:offset => options[:offset]
+ rescue ::ActiveRecord::StatementInvalid => e
+ raise StatementInvalid.new(e.message)
end
# Returns the versions
def versions(options={})
Version.find :all, :include => :project,
:conditions => Query.merge_conditions(project_statement, options[:conditions])
+ rescue ::ActiveRecord::StatementInvalid => e
+ raise StatementInvalid.new(e.message)
end
private
assert_equal values.sort, values
end
+ def test_invalid_query_should_raise_query_statement_invalid_error
+ q = Query.new
+ assert_raise Query::StatementInvalid do
+ q.issues(:conditions => "foo = 1")
+ end
+ end
+
def test_label_for
q = Query.new
assert_equal 'assigned_to', q.label_for('assigned_to_id')