Guest User

Untitled

a guest
Jan 22nd, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rails 3.23 KB | None | 0 0
  1. module QuestionQueryPatch
  2.   def self.included(base) # :nodoc:
  3.     base.extend(ClassMethods)
  4.  
  5.     base.send(:include, InstanceMethods)
  6.    
  7.     # Same as typing in the class
  8.     base.class_eval do
  9.       unloadable # Send unloadable so it will not be unloaded in development
  10.       base.add_available_column(QueryColumn.new(:formatted_questions))
  11.  
  12.      
  13.       alias_method :available_filters_before_question, :available_filters
  14.       alias_method :available_filters, :question_available_filters
  15.  
  16.       alias_method :sql_for_field_before_question, :sql_for_field
  17.       alias_method :sql_for_field, :question_sql_for_field
  18.     end
  19.  
  20.   end
  21.  
  22.   module ClassMethods
  23.     unless Query.respond_to?(:available_columns=)
  24.       # Setter for +available_columns+ that isn't provided by the core.
  25.       def available_columns=(v)
  26.         self.available_columns = (v)
  27.       end
  28.     end
  29.    
  30.     unless Query.respond_to?(:add_available_column)
  31.       # Method to add a column to the +available_columns+ that isn't provided by the core.
  32.       def add_available_column(column)
  33.         self.available_columns << (column)
  34.       end
  35.     end
  36.   end
  37.  
  38.   module InstanceMethods
  39.    
  40.     # Wrapper around the +available_filters+ to add a new Question filter
  41.     def question_available_filters
  42.       @available_filters = available_filters_before_question
  43.      
  44.       user_values = []
  45.       user_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged?
  46.       if project
  47.         user_values += project.users.sort.collect{|s| [s.name, s.id.to_s] }
  48.       else
  49.         user_values += User.current.projects.collect(&:users).flatten.uniq.sort.collect{|s| [s.name, s.id.to_s] }
  50.       end
  51.  
  52.       question_filters = {
  53.         "question_assigned_to_id" => { :type => :list, :order => 14, :values => user_values },
  54.         "question_asked_by_id" => { :type => :list, :order => 14, :values => user_values }
  55.       }
  56.      
  57.       @available_filters = @available_filters.merge(question_filters)
  58.       return @available_filters
  59.     end
  60.    
  61.     # Wrapper for +sql_for_field+ so Questions can use a different table than Issues
  62.     def question_sql_for_field(field, operator, v, db_table, db_field, is_custom_filter=false)
  63.       if field == "question_assigned_to_id" || field == "question_asked_by_id"
  64.         v = values_for(field).clone
  65.  
  66.         db_table = Question.table_name
  67.         if field == "question_assigned_to_id"
  68.           db_field = 'assigned_to_id'
  69.         else
  70.           db_field = 'author_id'
  71.         end
  72.        
  73.        
  74.         # "me" value subsitution
  75.         v.push(User.current.logged? ? User.current.id.to_s : "0") if v.delete("me")
  76.        
  77.         case operator
  78.         when "="
  79.           sql = "#{db_table}.#{db_field} IN (" + v.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ") AND #{db_table}.opened = true"
  80.         when "!"
  81.           sql = "(#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} NOT IN (" + v.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")) AND #{db_table}.opened = true"
  82.         end
  83.  
  84.         return sql
  85.        
  86.       else
  87.         return sql_for_field_before_question(field, operator, v, db_table, db_field, is_custom_filter)
  88.       end
  89.      
  90.     end
  91.    
  92.   end  
  93. end
Add Comment
Please, Sign In to add comment