Commit 12a26bee066ee360d963b9f6ca64a8c0c2b7ff67

Authored by Arthur Esposte
1 parent fc273ce5

Refactoring search controller from software communities

src/noosfero-spb/software_communities/lib/ext/search_controller.rb
... ... @@ -45,11 +45,11 @@ class SearchController
45 45 communities_list
46 46 end
47 47  
48   - def filter_software_infos_list
49   - filtered_software_list = get_filtered_software_list
50   - # filtered_community_list = get_communities_list(filtered_software_list)
51   - sort_communities_list filtered_software_list
52   - end
  48 + # def filter_software_infos_list
  49 + # filtered_software_list = get_community_ids_from_filtered_software
  50 + # filtered_community_list = get_communities_list(filtered_software_list)
  51 + # sort_communities_list filtered_community_list
  52 + # end
53 53  
54 54 def get_filter_category_ids
55 55 category_ids = []
... ... @@ -59,46 +59,16 @@ class SearchController
59 59 category_ids.map(&:to_i)
60 60 end
61 61  
62   - def get_filtered_software_list
63   - params[:query] ||= ""
64   - visible_communities = visible_profiles(Community)
65   -
66   - filtered_software_list = SoftwareCommunitiesPlugin::SoftwareInfo.search_by_query(params[:query])
67   -
68   - if params[:only_softwares]
69   - params[:only_softwares].collect!{ |software_name| software_name.to_slug }
70   - filtered_software_list = SoftwareCommunitiesPlugin::SoftwareInfo.all.select{ |s| params[:only_softwares].include?(s.identifier) }
71   - @public_software_selected = false
72   - end
73   -
74   - filtered_software_list.select!{ |software| visible_communities.include?(software.community) }
75   - category_ids = get_filter_category_ids
76   -
77   - unless category_ids.empty?
78   - filtered_software_list.select! do |software|
79   - if software.nil? || software.community.nil?
80   - false
81   - else
82   - result_ids = (software.community.category_ids & category_ids).sort
83   - result_ids == category_ids.sort
84   - end
85   - end
86   - end
  62 + # def sort_communities_list communities_list
  63 + # communities_list.sort! {|a, b| a.name.downcase <=> b.name.downcase}
87 64  
88   - ids = filtered_software_list.pluck(:id)
89   - visible_communities.joins(:software_infos).where("software_infos.id IN ?", ids)
90   - end
91   -
92   - def sort_communities_list communities_list
93   - communities_list.order('name')
94   -
95   - if params[:sort] && params[:sort] == "desc"
96   - communities_list.order('name DESC')
97   - elsif params[:sort] && params[:sort] == "relevance"
98   - communities_list = sort_by_relevance(communities_list, params[:query]){ |community| [community.software_info.finality, community.name] }
99   - end
100   - communities_list
101   - end
  65 + # if params[:sort] && params[:sort] == "desc"
  66 + # communities_list.reverse!
  67 + # elsif params[:sort] && params[:sort] == "relevance"
  68 + # communities_list = sort_by_relevance(communities_list, params[:query]){ |community| [community.software_info.finality, community.name] }
  69 + # end
  70 + # communities_list
  71 + # end
102 72  
103 73 def prepare_software_search_page
104 74 prepare_software_infos_params
... ...
src/noosfero-spb/software_communities/lib/software_communities_plugin.rb
... ... @@ -123,12 +123,12 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin
123 123 where('softwares.community_id IS NULL')
124 124  
125 125 return [scope, asset]
126   - # Select only communities that are related to a software.
127   - elsif asset.to_s == 'software_communities_plugin/software_infos'
128   - scope = scope.joins('INNER JOIN software_communities_plugin_software_infos as softwares
129   - ON profiles.id = softwares.community_id')
130   - return [scope, asset]
131   - # Go with the flow.
  126 + # # Select only communities that are related to a software.
  127 + # elsif asset.to_s == 'software_communities_plugin/software_infos'
  128 + # scope = scope.joins('INNER JOIN software_communities_plugin_software_infos as softwares
  129 + # ON profiles.id = softwares.community_id')
  130 + # return [scope, asset]
  131 + # # Go with the flow.
132 132 else
133 133 return [scope, asset]
134 134 end
... ... @@ -138,7 +138,6 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin
138 138 class_name_underscored = "software_communities_plugin/software_infos"
139 139 block = proc do
140 140 prepare_software_search_page
141   - results = filter_software_infos_list
142 141 @scope = visible_profiles(Community)
143 142 @asset = class_name_underscored
144 143 @assets = [@asset]
... ... @@ -156,8 +155,62 @@ class SoftwareCommunitiesPlugin &lt; Noosfero::Plugin
156 155 [{:name => 'software', :block => block, :common_profile_list_block => class_name_underscored}]
157 156 end
158 157  
  158 + def find_by_contents(asset, scope, query, paginate_options={}, options={})
  159 + if query && asset.to_s == 'software_communities_plugin/software_infos'
  160 + community_ids = get_community_ids_from_filtered_software(query)
  161 + scope = Community.where(:id => community_ids)
  162 + end
  163 +
  164 + scope.order(:name)
  165 + # scope = scope.like_search(query, options) unless query.blank?
  166 + # scope = scope.send(options[:filter]) unless options[:filter].blank?
  167 + {:results => scope.paginate(paginate_options)}
  168 + end
  169 +
159 170 protected
160 171  
  172 + def get_community_ids_from_filtered_software(query)
  173 + filtered_software_list = SoftwareCommunitiesPlugin::SoftwareInfo.search_by_query(query)
  174 +
  175 + if context.params[:only_softwares]
  176 + context.params[:only_softwares].collect!{ |software_name| software_name.to_slug }
  177 + filtered_software_list = SoftwareCommunitiesPlugin::SoftwareInfo.all.select{ |s| context.params[:only_softwares].include?(s.identifier) }
  178 + @public_software_selected = false
  179 + end
  180 +
  181 + category_ids = get_filter_category_ids
  182 +
  183 + unless category_ids.empty?
  184 + filtered_software_list.select! do |software|
  185 + if software.nil? || software.community.nil?
  186 + false
  187 + else
  188 + result_ids = (software.community.category_ids & category_ids).sort
  189 + result_ids == category_ids.sort
  190 + end
  191 + end
  192 + end
  193 +
  194 + community_ids = []
  195 +
  196 + filtered_software_list.each do |software|
  197 + community_ids << software.community_id
  198 + end
  199 +
  200 + community_ids
  201 + end
  202 +
  203 + def sort_communities_list communities_list
  204 + communities_list.sort! {|a, b| a.name.downcase <=> b.name.downcase}
  205 +
  206 + if params[:sort] && params[:sort] == "desc"
  207 + communities_list.reverse!
  208 + elsif params[:sort] && params[:sort] == "relevance"
  209 + communities_list = sort_by_relevance(communities_list, params[:query]){ |community| [community.software_info.finality, community.name] }
  210 + end
  211 + communities_list
  212 + end
  213 +
161 214 def software_info_transaction
162 215 SoftwareCommunitiesPlugin::SoftwareInfo.transaction do
163 216 context.profile.
... ...
src/noosfero-spb/software_communities/models/software_communities_plugin/software_info.rb
... ... @@ -13,6 +13,13 @@ class SoftwareCommunitiesPlugin::SoftwareInfo &lt; ActiveRecord::Base
13 13 SoftwareCommunitiesPlugin::DatabaseDescription
14 14 ]
15 15  
  16 + SEARCHABLE_SOFTWARE_CLASSES_ATTRIBUTES = {
  17 + SoftwareCommunitiesPlugin::SoftwareInfo => "software_info",
  18 + Community => "community",
  19 + SoftwareCommunitiesPlugin::ProgrammingLanguage => "programming_language",
  20 + SoftwareCommunitiesPlugin::DatabaseDescription => "database_description"
  21 + }
  22 +
16 23 scope :search_by_query, lambda { |query = ""|
17 24 filtered_query = query.gsub(/[\|\(\)\\\/\s\[\]'"*%&!:]/,' ').split.map{|w| w += ":*"}.join('|')
18 25 search_fields = SoftwareCommunitiesPlugin::SoftwareInfo.pg_search_plugin_fields
... ... @@ -20,7 +27,8 @@ class SoftwareCommunitiesPlugin::SoftwareInfo &lt; ActiveRecord::Base
20 27 if query.empty?
21 28 SoftwareCommunitiesPlugin::SoftwareInfo.joins(:community).where("profiles.visible = ?", true)
22 29 else
23   - searchable_software_objects = SoftwareCommunitiesPlugin::SoftwareInfo.transform_list_in_methods_list(SEARCHABLE_SOFTWARE_CLASSES)
  30 + searchable_software_objects = SoftwareCommunitiesPlugin::SoftwareInfo.transform_list_in_methods_list(SEARCHABLE_SOFTWARE_CLASSES_ATTRIBUTES)
  31 +
24 32 includes(searchable_software_objects).where("to_tsvector('simple', #{search_fields}) @@ to_tsquery('#{filtered_query}')").where("profiles.visible = ?", true)
25 33 end
26 34 }
... ... @@ -28,11 +36,11 @@ class SoftwareCommunitiesPlugin::SoftwareInfo &lt; ActiveRecord::Base
28 36 def self.transform_list_in_methods_list list
29 37 methods_list = []
30 38  
31   - list.each do |element|
32   - if SoftwareCommunitiesPlugin::SoftwareInfo.instance_methods.include?(element.to_s.underscore.to_sym)
33   - methods_list << element.to_s.underscore.to_sym
34   - elsif SoftwareCommunitiesPlugin::SoftwareInfo.instance_methods.include?(element.to_s.underscore.pluralize.to_sym)
35   - methods_list << element.to_s.underscore.pluralize.to_sym
  39 + list.each do |klass, method|
  40 + if SoftwareCommunitiesPlugin::SoftwareInfo.instance_methods.include?(method.to_sym)
  41 + methods_list << method.to_sym
  42 + elsif SoftwareCommunitiesPlugin::SoftwareInfo.instance_methods.include?(method.pluralize.to_sym)
  43 + methods_list << method.pluralize.to_sym
36 44 end
37 45 end
38 46  
... ... @@ -70,7 +78,7 @@ class SoftwareCommunitiesPlugin::SoftwareInfo &lt; ActiveRecord::Base
70 78  
71 79 has_many :libraries, :dependent => :destroy, :class_name => 'SoftwareCommunitiesPlugin::Library'
72 80 has_many :software_databases, :class_name => 'SoftwareCommunitiesPlugin::SoftwareDatabase'
73   - has_many :database_descriptions, :class_name => 'SoftwareCommunitiesPlugin::SoftwareDatabaseDescription', :through => :software_databases
  81 + has_many :database_descriptions, :class_name => 'SoftwareCommunitiesPlugin::DatabaseDescription', :through => :software_databases
74 82 has_many :software_languages, :class_name => 'SoftwareCommunitiesPlugin::SoftwareLanguage'
75 83 has_many :operating_systems, :class_name => 'SoftwareCommunitiesPlugin::OperatingSystem'
76 84 has_many :programming_languages, :class_name => 'SoftwareCommunitiesPlugin::ProgrammingLanguage', :through => :software_languages
... ...