summaryrefslogtreecommitdiffstats
path: root/app/models/query.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/query.rb')
-rw-r--r--app/models/query.rb52
1 files changed, 52 insertions, 0 deletions
diff --git a/app/models/query.rb b/app/models/query.rb
index 11460c1cb..c3d9d56e3 100644
--- a/app/models/query.rb
+++ b/app/models/query.rb
@@ -15,10 +15,23 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+class QueryColumn
+ attr_accessor :name, :sortable, :default
+
+ def initialize(name, options={})
+ self.name = name
+ self.sortable = options[:sortable]
+ self.default = options[:default]
+ end
+
+ def default?; default end
+end
+
class Query < ActiveRecord::Base
belongs_to :project
belongs_to :user
serialize :filters
+ serialize :column_names
attr_protected :project, :user
attr_accessor :executed_by
@@ -59,6 +72,22 @@ class Query < ActiveRecord::Base
cattr_reader :operators_by_filter_type
+ @@available_columns = [
+ QueryColumn.new(:tracker, :sortable => "#{Tracker.table_name}.position", :default => true),
+ QueryColumn.new(:status, :sortable => "#{IssueStatus.table_name}.position", :default => true),
+ QueryColumn.new(:priority, :sortable => "#{Issue.table_name}.priority_id", :default => true),
+ QueryColumn.new(:subject, :default => true),
+ QueryColumn.new(:assigned_to, :sortable => "#{User.table_name}.lastname", :default => true),
+ QueryColumn.new(:updated_on, :sortable => "#{Issue.table_name}.updated_on", :default => true),
+ QueryColumn.new(:category, :sortable => "#{IssueCategory.table_name}.name"),
+ QueryColumn.new(:start_date, :sortable => "#{Issue.table_name}.start_date"),
+ QueryColumn.new(:due_date, :sortable => "#{Issue.table_name}.due_date"),
+ QueryColumn.new(:estimated_hours, :sortable => "#{Issue.table_name}.estimated_hours"),
+ QueryColumn.new(:done_ratio, :sortable => "#{Issue.table_name}.done_ratio"),
+ QueryColumn.new(:created_on, :sortable => "#{Issue.table_name}.created_on"),
+ ]
+ cattr_reader :available_columns
+
def initialize(attributes = nil)
super attributes
self.filters ||= { 'status_id' => {:operator => "o", :values => [""]} }
@@ -173,7 +202,30 @@ class Query < ActiveRecord::Base
label = @available_filters[field][:name] if @available_filters.has_key?(field)
label ||= field.gsub(/\_id$/, "")
end
+
+ def available_columns
+ cols = Query.available_columns
+ end
+ def columns
+ if column_names && !column_names.empty?
+ available_columns.select {|c| column_names.include?(c.name) }
+ else
+ # default columns
+ available_columns.select {|c| c.default? }
+ end
+ end
+
+ def column_names=(names)
+ names = names.select {|n| n.is_a?(Symbol) || !n.blank? } if names
+ names = names.collect {|n| n.is_a?(Symbol) ? n : n.to_sym } if names
+ write_attribute(:column_names, names)
+ end
+
+ def has_column?(column)
+ column_names && column_names.include?(column.name)
+ end
+
def statement
# project/subprojects clause
clause = ''