@@ -157,7 +157,7 class Query < ActiveRecord::Base | |||
|
157 | 157 | :include => :project |
|
158 | 158 | } |
|
159 | 159 | } |
|
160 | ||
|
160 | ||
|
161 | 161 | def initialize(attributes = nil) |
|
162 | 162 | super attributes |
|
163 | 163 | self.filters ||= { 'status_id' => {:operator => "o", :values => [""]} } |
@@ -172,9 +172,9 class Query < ActiveRecord::Base | |||
|
172 | 172 | filters.each_key do |field| |
|
173 | 173 | if values_for(field) |
|
174 | 174 | case type_for(field) |
|
175 |
when :integer |
|
|
175 | when :integer | |
|
176 | 176 | errors.add(label_for(field), :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^\d+$/) } |
|
177 |
when :float |
|
|
177 | when :float | |
|
178 | 178 | errors.add(label_for(field), :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^\d+(\.\d*)?$/) } |
|
179 | 179 | when :date, :date_past |
|
180 | 180 | case operator_for(field) |
@@ -185,7 +185,7 class Query < ActiveRecord::Base | |||
|
185 | 185 | end |
|
186 | 186 | end |
|
187 | 187 | end |
|
188 | ||
|
188 | ||
|
189 | 189 | errors.add label_for(field), :blank unless |
|
190 | 190 | # filter requires one or more values |
|
191 | 191 | (values_for(field) and !values_for(field).first.blank?) or |
@@ -193,7 +193,7 class Query < ActiveRecord::Base | |||
|
193 | 193 | ["o", "c", "!*", "*", "t", "w"].include? operator_for(field) |
|
194 | 194 | end if filters |
|
195 | 195 | end |
|
196 | ||
|
196 | ||
|
197 | 197 | # Returns true if the query is visible to +user+ or the current user. |
|
198 | 198 | def visible?(user=User.current) |
|
199 | 199 | (project.nil? || user.allowed_to?(:view_issues, project)) && (self.is_public? || self.user_id == user.id) |
@@ -242,12 +242,12 class Query < ActiveRecord::Base | |||
|
242 | 242 | end |
|
243 | 243 | end |
|
244 | 244 | users = principals.select {|p| p.is_a?(User)} |
|
245 | ||
|
245 | ||
|
246 | 246 | assigned_to_values = [] |
|
247 | 247 | assigned_to_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged? |
|
248 | 248 | assigned_to_values += (Setting.issue_group_assignment? ? principals : users).collect{|s| [s.name, s.id.to_s] } |
|
249 | 249 | @available_filters["assigned_to_id"] = { :type => :list_optional, :order => 4, :values => assigned_to_values } unless assigned_to_values.empty? |
|
250 | ||
|
250 | ||
|
251 | 251 | author_values = [] |
|
252 | 252 | author_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged? |
|
253 | 253 | author_values += users.collect{|s| [s.name, s.id.to_s] } |
@@ -324,7 +324,7 class Query < ActiveRecord::Base | |||
|
324 | 324 | def has_filter?(field) |
|
325 | 325 | filters and filters[field] |
|
326 | 326 | end |
|
327 | ||
|
327 | ||
|
328 | 328 | def type_for(field) |
|
329 | 329 | available_filters[field][:type] if available_filters.has_key?(field) |
|
330 | 330 | end |
@@ -336,7 +336,7 class Query < ActiveRecord::Base | |||
|
336 | 336 | def values_for(field) |
|
337 | 337 | has_filter?(field) ? filters[field][:values] : nil |
|
338 | 338 | end |
|
339 | ||
|
339 | ||
|
340 | 340 | def value_for(field, index=0) |
|
341 | 341 | (values_for(field) || [])[index] |
|
342 | 342 | end |
@@ -349,7 +349,7 class Query < ActiveRecord::Base | |||
|
349 | 349 | def available_columns |
|
350 | 350 | return @available_columns if @available_columns |
|
351 | 351 | @available_columns = Query.available_columns |
|
352 |
@available_columns += (project ? |
|
|
352 | @available_columns += (project ? | |
|
353 | 353 | project.all_issue_custom_fields : |
|
354 | 354 | IssueCustomField.find(:all) |
|
355 | 355 | ).collect {|cf| QueryCustomFieldColumn.new(cf) } |
@@ -577,13 +577,13 class Query < ActiveRecord::Base | |||
|
577 | 577 | rescue ::ActiveRecord::StatementInvalid => e |
|
578 | 578 | raise StatementInvalid.new(e.message) |
|
579 | 579 | end |
|
580 | ||
|
580 | ||
|
581 | 581 | def sql_for_watcher_id_field(field, operator, value) |
|
582 | 582 | db_table = Watcher.table_name |
|
583 | 583 | "#{Issue.table_name}.id #{ operator == '=' ? 'IN' : 'NOT IN' } (SELECT #{db_table}.watchable_id FROM #{db_table} WHERE #{db_table}.watchable_type='Issue' AND " + |
|
584 | 584 | sql_for_field(field, '=', value, db_table, 'user_id') + ')' |
|
585 | 585 | end |
|
586 | ||
|
586 | ||
|
587 | 587 | def sql_for_member_of_group_field(field, operator, value) |
|
588 | 588 | if operator == '*' # Any group |
|
589 | 589 | groups = Group.all |
@@ -605,7 +605,7 class Query < ActiveRecord::Base | |||
|
605 | 605 | |
|
606 | 606 | '(' + sql_for_field("assigned_to_id", operator, members_of_groups, Issue.table_name, "assigned_to_id", false) + ')' |
|
607 | 607 | end |
|
608 | ||
|
608 | ||
|
609 | 609 | def sql_for_assigned_to_role_field(field, operator, value) |
|
610 | 610 | if operator == "*" # Any Role |
|
611 | 611 | roles = Role.givable |
@@ -629,14 +629,14 class Query < ActiveRecord::Base | |||
|
629 | 629 | end |
|
630 | 630 | |
|
631 | 631 | private |
|
632 | ||
|
632 | ||
|
633 | 633 | def sql_for_custom_field(field, operator, value, custom_field_id) |
|
634 | 634 | db_table = CustomValue.table_name |
|
635 | 635 | db_field = 'value' |
|
636 | 636 | "#{Issue.table_name}.id IN (SELECT #{Issue.table_name}.id FROM #{Issue.table_name} LEFT OUTER JOIN #{db_table} ON #{db_table}.customized_type='Issue' AND #{db_table}.customized_id=#{Issue.table_name}.id AND #{db_table}.custom_field_id=#{custom_field_id} WHERE " + |
|
637 | 637 | sql_for_field(field, operator, value, db_table, db_field, true) + ')' |
|
638 | 638 | end |
|
639 | ||
|
639 | ||
|
640 | 640 | # Helper method to generate the WHERE sql for a +field+, +operator+ and a +value+ |
|
641 | 641 | def sql_for_field(field, operator, value, db_table, db_field, is_custom_filter=false) |
|
642 | 642 | sql = '' |
@@ -760,7 +760,7 class Query < ActiveRecord::Base | |||
|
760 | 760 | @available_filters["cf_#{field.id}"] = options.merge({ :name => field.name }) |
|
761 | 761 | end |
|
762 | 762 | end |
|
763 | ||
|
763 | ||
|
764 | 764 | # Returns a SQL clause for a date or datetime field. |
|
765 | 765 | def date_clause(table, field, from, to) |
|
766 | 766 | s = [] |
@@ -772,7 +772,7 class Query < ActiveRecord::Base | |||
|
772 | 772 | end |
|
773 | 773 | s.join(' AND ') |
|
774 | 774 | end |
|
775 | ||
|
775 | ||
|
776 | 776 | # Returns a SQL clause for a date or datetime field using relative dates. |
|
777 | 777 | def relative_date_clause(table, field, days_from, days_to) |
|
778 | 778 | date_clause(table, field, (days_from ? Date.today + days_from : nil), (days_to ? Date.today + days_to : nil)) |
General Comments 0
You need to be logged in to leave comments.
Login now